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

Posted

技术标签:

【中文标题】具有多个子视图问题的容器视图【英文标题】:Container View with multiple child views issue 【发布时间】:2015-01-09 12:23:03 【问题描述】:

我正在尝试开发一个表视图控制器(具有导航控制器),其中行连接到多个视图控制器(TextField、TextView、TableView、DatePicker、ImageView 等)。

所以我这样设计,如果我点击任何一行,它应该打开一个UIViewController having container view,然后在容器中放置适当的控制器。所有相同类型的 tableview 行都使用相同的 View Controller 作为子视图容器。

我可以放置正确的 view controller(example - 1.TextViewController for Text View 2. Table View Controller for Table view 3. DatePickerController for Date Picker.) 容器中取决于它们的行类型。

但是当我单击done button(右上方第二个屏幕)时,我对如何从子视图中选择数据有点困惑。即对于子文本字段,无论我在输入框中输入什么,我都必须选择输入数据。对于子表视图,我隐藏了完成按钮,因此一旦用户选择数据“cellForRowAtIndexPath”,就会触发并传递选定的数据。

如何进行数据处理?在哪里写? 有没有其他方法来设计这个?

【问题讨论】:

@Suhail 你能详细说明一下吗? 【参考方案1】:

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

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

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

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

    短版:用于子级的一/二协议,父级实现协议并响应子级操作。

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

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

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

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

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

我的最后一条建议是,在开始实施上述解决方案之一之前,请检查 delegate/blocks 实施以及如何使用它们。如果实施不当,可能会遇到很多麻烦,尤其是内存问题和随机崩溃。

有点跑题了,如果我的答案的读者是 9gagger,那么“对不起,很长的帖子,这是一个土豆”

【讨论】:

以上是关于具有多个子视图问题的容器视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从容器/父视图控制器和多个子视图控制器共享数据数组

将具有多个子视图的视图截图为 wkwebview

调用具有多个子视图层次结构的协议方法

如何在 iOS 6 中使用具有多个子视图的现有自定义视图自动布局

以编程方式添加具有约束的多个子视图会引发异常

创建具有多个对象/层的视图 [关闭]