使用 Segues(向前传递数据)

要使用 segue 将数据从当前视图控制器传递到下一个新视图控制器(而不是先前的视图控制器),首先在相关故事板中创建一个带有标识符的 segue。覆盖当前视图控制器的 prepareForSegue 方法。在方法内部检查你刚刚通过其标识符创建的 segue。通过在向下转换视图控制器上设置属性,转换目标视图控制器并将数据传递给它。

设置 segue 的标识符:

StackOverflow 文档

可以通过 ctrl +拖动到目标视图控制器以编程方式或使用故事板中设置的按钮操作事件来执行分段。你可以在需要时使用视图控制器中的 segue 标识符以编程方式调用 segue:

Objective-C

- (void)showDetail {
    [self performSegueWithIdentifier:@"showDetailingSegue" sender:self];        
}

迅速

func showDetail() {
    self.performSegue(withIdentifier: "showDetailingSegue", sender: self)
}

你可以在覆盖的 prepareForSegue 方法中配置 segue 有效负载。你可以在加载目标视图控制器之前设置所需的属性。

Objective-C

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"showDetailingSegue"]){
        DetailViewController *controller = (DetailViewController *)segue.destinationViewController;
        controller.isDetailingEnabled = YES;
    }
}

迅速

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetailingSegue" {
        let controller = segue.destinationViewController as! DetailViewController
        controller.isDetailingEnabled = true
    }    
}

DetailViewController 是第二个视图控制器的名称,isDetailingEnabled 是该视图控制器中的公共变量。

要扩展此模式,可以将 DetailViewController 上的公共方法视为伪初始化程序,以帮助初始化任何所需的变量。这将自动记录需要在 DetailViewController 上设置的变量,而无需通读它的源代码。这也是放置默认值的便利之处。

Objective-C

- (void)initVC:(BOOL *)isDetailingEnabled {
    self.isDetailingEnabled = isDetailingEnabled
}

迅速

func initVC(isDetailingEnabled: Bool) {
    self.isDetailingEnabled = isDetailingEnabled
}