具有多个子视图问题的容器视图

时间:2015-01-09 12:23:04

标签: ios objective-c uitableview

我正在尝试开发一个表视图控制器(具有导航控制器),其中行连接到多个视图控制器(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'应该着火并传递选择的数据。

如何处理数据?写那个? 还有其他方法可以设计吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

正如@Suhail提到的最好的方法,一般来说,当你想将数据从子视图控制器传递到父视图控制器,或者在某些情况下从控制器传递到以前显示的控制器(仍然在堆栈),是使用delegate模式。您可以使用iOS协议或使用块实现委托模式。在我看来,这两种方法都有其优点和缺点,对于那个主题,你不得不做更多的谷歌搜索,因为这不是讨论它的地方。

让我们为您的案例定义一些案例(并非所有案例):

  1. 您想要将数据从ChildTableViewControler发送到Field控制器(屏幕3到屏幕2)

    在这种情况下,根据我的理解,两个控制器都嵌入在父控制器中,因此您必须将父设置为两个子控制器的委托。您必须根据要发送到控制器的操作或数据创建一个或两个协议。在每个子节点上创建一个名为delegate的属性(您可以选择自己的名称),在父视图控制器上实现方法,每当您在屏幕上添加其中一个子节点时,设置delegate属性成为父视图控制器。现在,只要您想将数据发送给另一个孩子,您就必须调用协议中声明的方法。请记住,您可以通过childViewControllers propery从父母访问这两个孩子。

    简短版本:一个/两个儿童协议,父实现协议并响应子操作。

  2. 您想要将数据从Filed发送到TableViewController(从屏幕2到屏幕1)

    在这种情况下,您将在父视图控制器中声明一个协议,该协议将由TableViewController实现。在父级中声明delegate(或您喜欢的任何名称)属性查看控制器。在屏幕上添加Filed控制器时,将delegate属性设置为TableViewController。现在,您可以通过TableViewController属性与Field控制器中的delegate进行通信。

    简短版本:父视图控制器中的一个协议,TableViewController实现协议并响应TableViewController操作。

  3. 您想要将数据从ChildTableViewController发送到TableViewController(屏幕3到屏幕1)。 这与案例2相同。

  4. 当我从视图控制器发送数据时,我的一个规则是这样的:如果我想向前发送数据(到将要显示的下一个屏幕),那么我使用属性/方法。如果我想向后发送数据(到以前显示的控制器),那么我使用委托/块。

    我的上一个建议,请在开始实施上述解决方案之前检查delegate / blocks实施以及如何使用它们。如果你错误地实现它们会有很多麻烦,特别是内存问题和随机崩溃。

    有点偏离主题,如果我的答案的读者是9ggger然后"抱歉长篇文章,这里是马铃薯"