2015-06-23 82 views
0

我发现的涉及实施协议和代表的大多数信息都涉及到您执行此操作的步骤;设置代表(仅适用于协议)仅适用于prepareForSegue?

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

但数小时后无奈的,因为我无法得到它的工作,我终于跨越另一种方式来分配destinationVC迷迷糊糊的prepareForSegue

DestinationViewController *destinationVC = segue.destinationViewController; 
    destinationVC.delegate = self; 

哪些实际工作。我做错了什么?它似乎使用我的委托从未设置为自我的第一种方法。

+0

如果你正在使用视图控制器故事板则始终使用segue来创建该类的对象。你的场景我认为同样的事情是因为你使用记分板来创建类,而不是覆盖DestinationViewController的init方法。 –

回答

1

当从故事板实例化,initWithCoder: methid被调用,而不是init方法。

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

是你如何处理你的控制器不是从故事板:你从代码中初始化它。之后,您必须手动处理从源VC到目标VC的转换。

DestinationViewController *destinationVC = segue.destinationViewController; 
destinationVC.delegate = self; 

是当你的控制器在故事板中定义并且是segue的目的地时的方式。 当你执行一个segue时,调用源视图控制器的prepareForSegue:方法,你应该在其中配置你想要的目的地:设置属性,代理,传递数据......

1

有两种方法可以pushController,同时使用UIStoryboard

选项1:实际参考UIViewControllerstoryboard

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

选项2:使用Segue

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

在你第一种情况下你分配对象和分配委托。这并不意味着在执行pushViewController操作时相同的参考文件已通过。所以在这种情况下会创建两个不同的参考。所以你委托指出了一些不存在的其他参考。

这可以帮助你。

1

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

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

当你使用故事板,通过UIStoryboardSegue类提供所有必要的内容。它为您保存目标视图控制器。所以,你必须访问目标控制器抛出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]; 

}