选项1:使用代理.
通过传递父视图控制器作为遵守协议的委托来完成.
子调用协议方法返回数据.
>如果父项需要数据验证,则返回值/ dict,以允许小孩处理错误.
选项2:使用放卷
通过调用孩子的解开来完成.
>孩子通过拖动按钮或故事板本身将其拖放到Exit并命名segue,从而可以与其一起使用performSegueWithIdentifier:sender
>父实现returnFromSegueName(用户命名的方法链接到该segue)来抓取小孩的数据.
>数据验证虽然只能通过执行canPerformUnwindSegueAction来实现:fromViewController:withSender
>数据验证失败将需要Child上的另一个属性,因为此方法仅接受BOOL作为返回值.
>开销:两种方法,一个额外的财产,加上Storyboard shenanigans.
总的来说,代表们感觉像更清洁的方式,但也许是过时的.我错了这个方向吗?
解决方法
耦合
两个模型大致相同(松散)耦合.在引擎盖下,一个放松的部分只是一个代表,iOS已经完成了为您配线的工作.对于代理,父级知道并符合子协议.为了放松,父母必须连接到故事板上的孩子,以便放松,并需要知道孩子的属性来提取退回数据.然而,如果你是新来的代表,只是想从一个子视图中获取一些数据,那么展开次序可能比使用与代表的协议不太恐怖.
灵活性
如果孩子到父母的交互的唯一目的是返回数据,那么解开的段落只是一个很好的选择.似乎没有办法取消正在进行的展开.因此,如果父母必须进行任何数据验证,或者如果孩子需要与父级进行多次交互,那么唯一的方法是拥有一个可以将多个方法调用回父项的委托.
可维护性
如果要返回的数据的类型或其他方面发生更改,那么更容易更新展开版块,因为所有您需要做的是更新您的展开版块中的代码以查看新的属性.对于协议/委托方法,您将必须更新子进程中的协议和父进程中的实现.但是,退出隔离的简单性是由于您没有编译器检查您的合同(协议),您可能会容易地忽略需要更新的父视图控制器中的位置.
获胜者,冠军
没有一个您的方式取决于您的数据需求,舒适程度与协议(他们看起来比他们应该乍一看更吓人),应用程序的复杂性和长期的维护需求.
为了我的目的,我用代理人清理了,因为在某些情况下,我的孩子不得不多次给父母打电话.然而,在少数情况下,我有很多数据要传回来,我采用了我从解开的段落中学到的东西,并且简单地使用了父级可以从中提取所需信息的子级中的属性.我也使用它作为一个方便的路径,父母为孩子提供错误信息.程序中的代理人不要将其放在一起,而是与编程合作伙伴保持一致,但如果您愿意,则无法做到这一点.