ios – 代理与Unwind Segue传递数据到父场景

前端之家收集整理的这篇文章主要介绍了ios – 代理与Unwind Segue传递数据到父场景前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
自从iOS 6以来,展开的部分已经可以在场景层次结构中向上导航.我正在努力确定将数据传递给父视图控制器的更干净/更好/更好/更可维护的方法.有一些问题从技术的角度来解决(例如“如果我有一个放松我还需要一个代表”),但是我找不到很多解决利弊问题的问题.

选项1:使用代理.

通过传递父视图控制器作为遵守协议的委托来完成.

调用协议方法返回数据.
>如果父项需要数据验证,则返回值/ dict,以允许小孩处理错误.

>开销:协议定义和父类中的一种方法(用于数据验证和接收).

选项2:使用放卷

通过调用孩子的解开来完成.

>孩子通过拖动按钮或故事板本身将其拖放到Exit并命名segue,从而可以与其一起使用performSegueWithIdentifier:sender
>父实现returnFromSegueName(用户命名的方法链接到该segue)来抓取小孩的数据.
>数据验证虽然只能通过执行canPerformUnwindSegueAction来实现:fromViewController:withSender

>数据验证失败将需要Child上的另一个属性,因为此方法仅接受BOOL作为返回值.

>开销:两种方法,一个额外的财产,加上Storyboard shenanigans.

总的来说,代表们感觉像更清洁的方式,但也许是过时的.我错了这个方向吗?

解决方法

我现在意识到,这不是一个真正的问题,除了说两种做法都是错误的 – 他们都有利弊.在处理了一个星期,并完成了更多关于这个问题的阅读后,我可以至少量化为什么你可能想要使用展开式或代表在视图控制器之间工作.

耦合

两个模型大致相同(松散)耦合.在引擎盖下,一个放松的部分只是一个代表,iOS已经完成了为您配线的工作.对于代理,父级知道并符合子协议.为了放松,父母必须连接到故事板上的孩子,以便放松,并需要知道孩子的属性提取退回数据.然而,如果你是新来的代表,只是想从一个子视图中获取一些数据,那么展开次序可能比使用与代表的协议不太恐怖.

灵活性

如果孩子到父母的交互的唯一目的是返回数据,那么解开的段落只是一个很好的选择.似乎没有办法取消正在进行的展开.因此,如果父母必须进行任何数据验证,或者如果孩子需要与父级进行多次交互,那么唯一的方法是拥有一个可以将多个方法调用回父项的委托.

可维护性

如果要返回的数据的类型或其他方面发生更改,那么更容易更新展开版块,因为所有您需要做的是更新您的展开版块中的代码以查看新的属性.对于协议/委托方法,您将必须更新子进程中的协议和父进程中的实现.但是,退出隔离的简单性是由于您没有编译器检查您的合同(协议),您可能会容易地忽略需要更新的父视图控制器中的位置.

获胜者,冠军

没有一个您的方式取决于您的数据需求,舒适程度与协议(他们看起来比他们应该乍一看更吓人),应用程序的复杂性和长期的维护需求.

为了我的目的,我用代理人清理了,因为在某些情况下,我的孩子不得不多次给父母打电话.然而,在少数情况下,我有很多数据要传回来,我采用了我从解开的段落中学到的东西,并且简单地使用了父级可以从中提取所需信息的子级中的属性.我也使用它作为一个方便的路径,父母为孩子提供错误信息.程序中的代理人不要将其放在一起,而是与编程合作伙伴保持一致,但如果您愿意,则无​​法做到这一点.

猜你在找的iOS相关文章