12

我目前正在构建一个选项卡式 iPhone 应用程序,其中每个选项卡的视图控制器都是 的实例UINavigationController,并且每个UINavigationController实例的每个子控制器都是UITableViewController. 理想情况下,我想进行子类UINavigationController化,以便每个选项卡的控制器都是 UINavigationController 的子类,它(UINavigationController显然除了具有所有标准功能之外)充当与其子控制器关联的每个表视图的数据源和委托. 尝试这样做似乎破坏UINavigationController了子类中的基本功能。

正如Apple在他们的iPhone文档中所说的那样,一个人不应该子类化UINavigationController,而且事情似乎会中断,我想知道我应该如何在UINavigationController's没有子类化的情况下扩展功能,一般来说,当一个人应该如何解决子类化限制时做可可开发。

谢谢!

4

6 回答 6

21

你到底为什么要UINavigationController充当表的数据源?的全部意义UITableViewController在于您将其子类化,并且它充当UITableView它也放置并填充父视图的数据源。

于 2009-12-21T00:31:14.950 回答
10

我将继续说您的想法有一些优点,如果在每个级别您都真正使用相同类型的数据,并且每个级别可能有不同的代表来处理单元创建。

基本上没有理由不能继承 UINavigation 控制器以在其上添加完全正交的数据层,因为它与 UINavigationController 正在管理的 UI 或行为无关(这是 Apple 担心你会搞砸的事情)。对于那些反对这个想法的人,可以将其视为每个选项卡的数据存储,一个选项卡中的所有页面都可以访问,而不是系统中的每个页面都必须转到 AppDelegate,或者有一堆单例。好吧,基本上它是一个单例,但至少有一个已经存在并自动获取引用。

说了这么多,我将以一个替代的设计方案结束 - 我认为您可能想要做的是深入研究多个层,重用相同的代码来生成单元格等,因为您在每一层都有相同类型的数据。一种更好的处理方法是使用一个视图控制器来提供要显示的数据子集,当用户向下钻取时,它只需使用该新数据子集创建同一视图控制器的另一个实例。这种方法比让导航控制器充当每个级别的表委托的想法要好得多,因为您必须进行大量的来回重新布线,并且需要更多的工作来记住每个级别的滚动位置水平启动。这就是为什么你要使用多个视图控制器实例来保持向下钻取,

于 2009-12-21T17:57:15.797 回答
10

作为参考,请注意,从 iOS 6 开始,UINavigationController 可以合法地继承。

此类通常按原样使用,但在 iOS 6 及更高版本中可能是子类。 UINavigationController 类参考

当然,这并不意味着您总是应该这样做。但是你可以。

于 2013-08-04T01:39:43.737 回答
1

据我了解,不鼓励子类化,因为 Objective C 允许子类过多地访问其超类的内部工作。

编写子类的建议替代方法是编写委托,在本例中为 UINavigationControllerDelegate。然后,您可以将要扩展的特定行为封装到此委托类中,并在需要时将其链接到 UINavigationController。

于 2009-12-21T00:34:12.397 回答
1

如果可用的控制器层次结构在处理数据方面不能满足您的需求(我的假设,因为我们不知道为什么您希望一个对象成为多个视图的数据源),您总是可以创建额外的数据和/或控制器类(至少是 NSObject 的子类)。

在以各种方式更改视图时,您可以让数据或其他对象保持不变。(1) 应用程序委托类的属性。您应用程序中的任何对象都可以获取您的应用程序委托实例

[[UIApplication sharedApplication] delegate]

谨慎使用它,因为它本质上是在创建全局变量。

(2) 当您推送视图控制器子类或在选项卡中显示它们时,您可以将数据或其他对象从控制器传递到控制器。

(3) Core Data 是另一种方式,但需要大量的 Cocoa,并且您仍然必须管理上下文实例。

于 2009-12-21T01:05:16.020 回答
0

因为他们想避免困扰所有其他平台的 UI 不一致。

于 2009-12-21T00:26:21.300 回答