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

时间:2015-06-23 05:26:36

标签: ios objective-c delegates protocols

我发现涉及实施协议和代理的大部分信息都涉及到您执行此操作的步骤;

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

但经过几个小时的挫折,因为我无法让它工作,我终于偶然发现另一种方式在prepareForSegue

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

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

3 个答案:

答案 0 :(得分:2)

从故事板中实例化时,会调用<td width="99%" class="ms-authoringcontrols"> <table width="100%" class="ms-authoringcontrols"> <tbody><tr><td> <input name="ctl00$PlaceHolderMain$UploadDocumentSection$ctl05$InputFile" title="Choose a file" class="ms-fileinput ms-fullWidth" id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_InputFile" onfocus="ResetSpFormOnSubmitCalled();" onchange="CheckAssetLibMediaExtension()" type="file" size="35"> </td></tr> <tr><td> <span class="ms-error" id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_ctl00" style="display: none;"><span role="alert">You must specify a value for the required field.</span></span> <span id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_ctl01" style="display: none;">The file name is invalid or the file is empty. A file name cannot contain any of the following characters: \ / : * ? " &lt; &gt; | # { } % ~ &amp;</span> </td></tr> <tr><td> <a id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_OpenWithExplorerLink" accesskey="E" onclick="javascript:return !LaunchOpenInExplorer();" href="#">Upload files using Windows Explorer instead</a> </td></tr> <tr><td> <input name="ctl00$PlaceHolderMain$UploadDocumentSection$ctl05$OverwriteSingle" id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_OverwriteSingle" type="checkbox" checked="checked"><label for="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_OverwriteSingle">Overwrite existing files</label> </td></tr> </tbody></table> </td> methid,而不是<tr><td> <input name="ctl00$PlaceHolderMain$UploadDocumentSection$ctl05$OverwriteSingle" id="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_OverwriteSingle" type="checkbox" checked="checked"><label for="ctl00_PlaceHolderMain_UploadDocumentSection_ctl05_OverwriteSingle">Overwrite existing files</label> </td></tr> 方法。

initWithCoder:

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

init

是在故事板中定义控制器并且是segue的目标时的操作方式。 当您执行segue时,将调用源视图控制器的DestinationViewController *destinationVC = [[destinationViewController alloc] init]; destinationVC.delegate = self; 方法,您可以在其中配置目标:设置属性,委托,传递数据,......

答案 1 :(得分:1)

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

选项1 :从UIViewController获取实际storyboard的参考。

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

选项2 :使用Segue

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

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

这可能对你有所帮助。

答案 2 :(得分:1)

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

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

使用故事板时,UIStoryboardSegue类提供的所有必要上下文。它为您保存目标视图控制器。因此,您必须访问目标控制器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];

}