我正在构建一个选项卡式iPhone应用程序,其中每个选项卡的视图控制器是UINavigationController
的实例,并且每个UINavigationController
实例的每个子控制器都是{{1}的实例}。理想情况下,我想子类UITableViewController
,以便每个选项卡的控制器是UINavigationController的子类(除了具有所有标准UINavigationController
功能外,显然)用作数据源和委托对于与其子控制器关联的每个表视图。尝试这样做似乎打破了子类中的基本UINavigationController
功能。
看到苹果公司在他们的iPhone文档中说不应该将UINavigationController
作为子类,并且事情似乎突破了,我想知道如何在不进行子类化的情况下扩展UINavigationController
功能一般来说,在进行Cocoa开发时,应该如何解决子类化限制。
谢谢!
答案 0 :(得分:21)
为什么您希望UINavigationController
充当表格的数据源? UITableViewController
的重点在于您将其子类化,并且它充当UITableView
的数据源,它也放置在父视图中并填充它。
答案 1 :(得分:10)
我要继续说你的想法有一些优点,如果在每个级别你真正使用相同类型的数据,并且每个级别可能有不同的委托来处理单元格创建。
基本上没有理由你不能将UINavigation控制器子类化为在它上面添加一个完全正交的数据层,因为它与UINavigationController管理的UI或行为无关(这就是Apple所关注的,你会搞砸的) )。对于那些反对这个想法的人,把它想象成一个每个标签的数据存储,标签中的所有页面都可以访问,而不是系统中的每个页面都必须转到AppDelegate,或者拥有一堆单例。好吧,基本上它是一个单身人士,但至少有一个已经存在,并自动传递参考。
所有这一切,我将以另一个设计方案结束 - 我认为你可能想要做的是深入研究多个层,重复使用相同的代码来生成单元格,因为你有相同类型的数据每一层。处理这种情况的一种更好的方法是让一个视图控制器提供要显示的数据子集,当用户向下钻取它时,只需用该新的数据子集创建同一视图控制器的另一个实例。这种方法比让导航控制器充当每个级别的表委托更好,因为你必须做大量的重新布线来回移动,并且需要更多的工作来记住每个级别的滚动位置级别启动。这就是为什么你想使用多个视图控制器实例来保持下钻的原因,但多个实例并不一定意味着多个类。
答案 2 :(得分:10)
供参考,请注意,自iOS 6起,UINavigationController可以合法 。
此类通常按原样使用,但可以在iOS 6及更高版本中进行子类化。 UINavigationController Class Reference
当然,这并不意味着你总是应该这样做。但你可以。
答案 3 :(得分:1)
据我所知,不鼓励子类化,因为Objective C允许子类过多地访问其超类的内部工作。
编写子类的建议替代方法是编写委托,在本例中为UINavigationControllerDelegate。然后,您可以将要扩展的特定行为封装到此委托类中,并在需要时将其链接到UINavigationController。
答案 4 :(得分:1)
如果可用的控制器层次结构在处理数据方面不能满足您的需求(我的假设,因为我们不知道为什么您希望一个对象成为多个视图的数据源),您始终可以创建其他数据和/或控制器类(至少是NSObject的子类)。
在以各种方式更改视图时,您可以保留数据或其他对象。 (1)应用程序委托类的属性。您应用中的任何对象都可以通过
获取您的应用委托实例[[UIApplication sharedApplication] delegate]
请谨慎使用,因为它实际上是在创建全局变量。
(2)您可以在推送视图控制器子类时将数据或其他对象从控制器传递到控制器,或者将它们放在选项卡中。
(3)核心数据是另一种方式,但需要大量的Cocoa,你仍然需要管理上下文实例。
答案 5 :(得分:0)
因为他们希望避免困扰所有其他平台的UI不一致。