设置委托(用于协议)仅适用于 prepareForSegue?

Setting delegates (for protocols) only works in prepareForSegue?

我发现的大多数涉及实施协议和委托的信息都涉及执行此操作的步骤;

   DestinationViewController *destinationVC = [[destinationViewController alloc] init];
   destinationVC.delegate = self;

但是因为我无法让它工作而沮丧了几个小时之后,我终于偶然发现了另一种在 prepareForSegue

中分配 destinationVC 的方法
    DestinationViewController *destinationVC = segue.destinationViewController;
    destinationVC.delegate = self;

这确实有效。我做错了什么?似乎使用第一种方法我的委托从未设置为自我。

在使用 UIStoryboard 时,您可以通过两种方式 pushController

选项 1 : 从 storyboard.

实际参考 UIViewController
UIViewController *displayTable = [self.storyboard instantiateViewControllerWithIdentifier:@"nextViewcontroller"];
[self.navigationController pushViewController:displayTable animated:YES];

选项 2:使用 Segue

[self performSegueWithIdentifier:@"MySegue" sender:sender];

在您的第一种情况下,您正在分配对象并分配委托。这并不意味着在执行 pushViewController 操作时传递相同的引用。所以在那种情况下会创建两个不同的参考。所以你委托指出了一些不存在的其他参考。

希望对您有所帮助。

这里是关于 segues 的基本教程,针对 Xcode 6 及更高版本进行了更新。

https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html

当您使用故事板时,UIStoryboardSegue class 提供了所有必要的上下文。它为您保存目标视图控制器。因此,您必须访问目标控制器 throw destinationViewController 属性.

如果您想手动将控制器添加到您的导航堆栈:

{
    // binds your viewController from storyboard with local instance
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"YOUR_STORYBOARD_IDENTIFIER"];
    // set your delegate
    vc.delegate = self;
    // push controller into navigation stack
    [self.navigationController pushViewController:vc animated:YES];

}

从故事板实例化时,将调用 initWithCoder: 方法,而不是 init 方法。

DestinationViewController *destinationVC = [[destinationViewController alloc] init];
   destinationVC.delegate = self;

当你的控制器不是来自故事板时你是怎么做的:你从代码中初始化它。之后,您必须手动处理从源 VC 到目标 VC.

的转换
DestinationViewController *destinationVC = segue.destinationViewController;
destinationVC.delegate = self;

当您的控制器在情节提要中定义并且是 segue 的目的地时,您会怎么做。 当你执行一个 segue 时,源视图控制器的 prepareForSegue: 方法被调用,你应该在其中配置你想要的目标:设置属性,委托,传递数据,...