具有多个子视图问题的容器视图
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,那么“对不起,很长的帖子,这是一个土豆”
【讨论】:
以上是关于具有多个子视图问题的容器视图的主要内容,如果未能解决你的问题,请参考以下文章