作为对iPhone开发还不熟悉的人,我一直在努力寻找用于管理多个子视图的良好设计模式,特别是在子视图需要定义相同类型的委托方法的情况下。
例如,我有一个视图,我需要根据用户操作在2个UITableViews之间进行交换。两个UITableView都需要定义一个UITableViewControllerDelegate对象来填充行等。
你是否更有经验的iPhone开发人员发现重载主视图控制器作为两个子视图的委托是正确的做事方式?目前我定义了两个对象,每个对象都充当每个UITableView的委托,以尽量使事情更有条理。它完成了我需要的东西,但这是一个很好的模式吗?
我认为有一些最好的做法可以避免内存管理和类似的有趣事情等各种陷阱。提前谢谢!
答案 0 :(得分:5)
您可以使用视图作为容器来保存像表格这样的元素。因此,在您概述的情况下,您将拥有一个容器视图并将UITableViews交换进出...
一个好的方法是为每个表分配单独的视图控制器。否则,它会变得太乱,试图跟踪各种表视图委托方法中支持的数据集,并且很难对一个可能不适用于另一个表的表进行大量自定义。
使用组合视图控制器时要注意的主要事项是“self.navigationController”,并且相关的调用不会返回任何内容(因为它们不是导航控制器的子项),因此您需要传递在表视图控制器中引用或以其他方式处理它。
答案 1 :(得分:2)
如果两者之间只有很小的区别 - 例如,如果表格单元格布局方式相同但使用稍微不同的数据 - 我可能会使用if语句,但是否则我会使用某些单独的委托对象分类。关注点的分离是关键所在:如果你正在编写一个方法来完成两个截然不同的事情,那就表明你的代码组织得不够好,不够可读,可维护或灵活。
此外,不要忘记视图控制器 不是是神奇的对象,只能与Apple认可的标签栏和导航控制器一起使用。编写自己的“切换视图控制器”是完全合法的,它需要两个视图控制器并在它们之间切换。但是,您需要进行一些测试,以确定是否需要手动调用-viewWillAppear:及其同类手机 - 根据您添加视图控制器的位置,有一些神奇的机器可能会或可能不会为您执行此操作在层次结构中。
答案 2 :(得分:1)
这就是我自己处理这种情况的方式。每个UITableView一个控制器和委托。数据源可以重用,如果这是有意义的(即在两个UITableViews中都显示相同的数据)否则你会在委托方法中有很多ifs,检查哪个tableview发送消息。
切换UITableViews听起来像是UINavigationController的工作给我。通常在iPhone上,您不只是重新排列控件。您可以创建完整的屏幕(在代码中或通过InterfaceBuilder作为.nib),使用UINavigationController或UITabBar在它们之间切换。