我什么时候需要继承UIViewController,何时可以实例化它?

时间:2011-12-26 23:37:39

标签: objective-c ios cocoa-touch

我正在通过Hillegass和Conway的Big Nerd Ranch指南学习iOS编程。我在阅读本书的时候正在编写一个自己的应用程序,其中一个困扰我的问题就是我需要继承UIViewController(及其类似版本)以及何时可以实例化它。

例如,我的应用程序由通用构建块组成:界面是选项卡式,选项卡通向UITableView,UINavigationController创建UITableViews,依此类推。按照本书的说明,我已经将UITableViewController子类化为创建表视图。但是,在创建包含我所有应用程序内容的UITabBarController时,实例化UITabBarController然后向其添加一堆视图似乎就足够了。 (所有这些都在应用程序中完成:didFinishLaunchingWithOptions:我的应用程序委托的方法。由于我的大部分应用程序都包含基本UI部分的简单组合,我试图尽可能以编程方式构建UI。)

我得到的印象是我应该做的是为我项目中的每个接口创建一个UIViewController(或UITableViewController或其他)的子类。这对我来说似乎很奇怪,因为大多数这些类只会被实例化一次。我只是误解了在这种情况下如何使用OO? (我有很多编程经验,但OOP相对较少。)我应该为用户看到的每个屏幕创建一个子类吗?

4 个答案:

答案 0 :(得分:5)

  

我应该为用户看到的每个屏幕创建一个子类吗?

如果每个视图都需要不同的逻辑,是的。

不要回避为概念上分开的东西创建新类。从非OOP到OOP的程序员可能会觉得只有少量代码的文件是浪费。抑制这种感觉。课程很便宜,非常有助于组织你的思考。

答案 1 :(得分:4)

所以你在iOS中有两种类型的UIViewControllers。 “Container”viewControllers和“Content”viewcontrollers。两者都是UIViewController的子类,但目的却截然不同。

Container类型是UINavigationController和UITabController的类型。它们很少被子类化并且通常按原样使用(事实上,我相信Apple根本不允许UINavigationController的子类化)。这些“容器”负责为您移动“内容”视图控制器。除了添加标签栏或导航栏之外,它们没有太多自己的内容。

“内容”视图控制器是您大多数时间创建的视图控制器。您很少能够按原样使用UIViewController,因为它没有任何功能。这就是你将它们子类化的原因。这些意味着代表一个“屏蔽”的内容。因此,实际上,用户看到的每个“屏幕”都应该由UIViewController子类控制。

UITableViewController只是UIViewController的一个专用子类,它已经包含了一些管理表的方法。

UIKit框架的设计方式是让您使用UIViewController的子类来显示内容并使用开箱即用的“Container”控制器来促进UIViewController子类的管理。

答案 2 :(得分:2)

我在继承UIViewController和其他类后面的理由是:

  1. 几乎总是必须初始化变量并为类的实例赋值。您可以添加子视图并设置其框架,为UIViewController实例定义操作等。如果此UIViewController实例直接来自基类,则应在其外部进行初始化。如果多次需要在不同的地方进行初始化,则可能需要处理重复的初始化过程。

  2. 因此,您已将这些流程编译为方法,使其可以从使用此UIViewController实例的任何位置重复使用。但是你想把它放在哪里?难道你不认为把它放在UIViewController的子类中要好得多吗?此外,您甚至不必为此初始化方法提供特定名称。只需覆盖超类中的默认-(id)init

  3. 虽然您可能认为现在使用UIViewController而不进行子类化就足够了,但随着项目的增长,处理可重用性问题将面临挑战。花些时间查看您的代码。检查是否有太多重复,例如初始化对象或为其指定值。如果您在多个位置对类的实例执行相同的操作,请将它们编译为要重用的方法。随着这些方法的数量增加,您将发现需要使用子类,该子类将包含实例的这些相关方法。

  4. 无论项目的大小如何,使用类来区分不同的对象都很重要。几乎总是,基本的基本分类是由框架完成的,因此不必为类引入新的概念。但是,这并不意味着框架也知道如何将项目及其对象分类。通过使用子类,您可以利用开发框架可以提供的所有好处,并根据您为其设计的目的,使项目中的对象尽可能保持唯一。

答案 3 :(得分:1)

关于UITabBarController你是对的。如果默认行为足够,则没有理由将子类化为子类。但是,一旦你需要做一些自定义的东西,你需要将它子类化..

另外,为什么要尝试以编程方式构建GUI?对于学习曲线?没有真正的理由不使用InterfaceBuilder,它为您节省了大量时间。

您应该将UITableViewController子类化,以便在视图中获取数据,这就是MVC模型的工作方式。默认实现没有提供任何东西以便在视图中获取数据,我不认为他们会这样做以确保没有浪费任何东西,他们与模型对象的“连接”可能与一个你想要的,如果模型对象不兼容,你最终会编写一个适配器。

我希望这会对你有所帮助。

快乐的x-mas。