我正在尝试开发一个表视图控制器(具有导航控制器),其中行连接到多个视图控制器(TextField,TextView,TableView,DatePicker,ImageView等)。
所以我这样设计,如果我点击任何一行,它应该打开一个UIViewController having container view
,然后将相应的控制器放在容器中。所有相同类型的tableview行使用相同的View Controller作为一个孩子查看容器。
我可以放置正确的view controller
(示例 - 文本视图的1.TextViewController
2. Table视图控制器用于表视图3. DatePickerController for Date Picker。)在容器中取决于它们的行类型。
但是当我点击done button
(第二个屏幕右上角)时,我对如何从子视图中选择数据感到有些困惑。即对于子文本字段我必须在输入框中输入任何输入数据。对于子表视图,我隐藏了完成按钮,因此只要用户选择数据' cellForRowAtIndexPath'应该着火并传递选择的数据。
如何处理数据?写那个? 还有其他方法可以设计吗?
答案 0 :(得分:2)
正如@Suhail提到的最好的方法,一般来说,当你想将数据从子视图控制器传递到父视图控制器,或者在某些情况下从控制器传递到以前显示的控制器(仍然在堆栈),是使用delegate
模式。您可以使用iOS协议或使用块实现委托模式。在我看来,这两种方法都有其优点和缺点,对于那个主题,你不得不做更多的谷歌搜索,因为这不是讨论它的地方。
让我们为您的案例定义一些案例(并非所有案例):
您想要将数据从ChildTableViewControler
发送到Field
控制器(屏幕3到屏幕2)
在这种情况下,根据我的理解,两个控制器都嵌入在父控制器中,因此您必须将父设置为两个子控制器的委托。您必须根据要发送到控制器的操作或数据创建一个或两个协议。在每个子节点上创建一个名为delegate
的属性(您可以选择自己的名称),在父视图控制器上实现方法,每当您在屏幕上添加其中一个子节点时,设置delegate
属性成为父视图控制器。现在,只要您想将数据发送给另一个孩子,您就必须调用协议中声明的方法。请记住,您可以通过childViewControllers
propery从父母访问这两个孩子。
简短版本:一个/两个儿童协议,父实现协议并响应子操作。
您想要将数据从Filed
发送到TableViewController
(从屏幕2到屏幕1)
在这种情况下,您将在父视图控制器中声明一个协议,该协议将由TableViewController
实现。在父级中声明delegate
(或您喜欢的任何名称)属性查看控制器。在屏幕上添加Filed
控制器时,将delegate
属性设置为TableViewController
。现在,您可以通过TableViewController
属性与Field
控制器中的delegate
进行通信。
简短版本:父视图控制器中的一个协议,TableViewController
实现协议并响应TableViewController
操作。
您想要将数据从ChildTableViewController
发送到TableViewController
(屏幕3到屏幕1)。
这与案例2相同。
当我从视图控制器发送数据时,我的一个规则是这样的:如果我想向前发送数据(到将要显示的下一个屏幕),那么我使用属性/方法。如果我想向后发送数据(到以前显示的控制器),那么我使用委托/块。
我的上一个建议,请在开始实施上述解决方案之前检查delegate
/ blocks
实施以及如何使用它们。如果你错误地实现它们会有很多麻烦,特别是内存问题和随机崩溃。
有点偏离主题,如果我的答案的读者是9ggger然后"抱歉长篇文章,这里是马铃薯"