UIViewController 和 UITableViewController 有啥区别
Posted
技术标签:
【中文标题】UIViewController 和 UITableViewController 有啥区别【英文标题】:What is the difference between UIViewController and UITableViewControllerUIViewController 和 UITableViewController 有什么区别 【发布时间】:2013-06-25 19:20:33 【问题描述】:有时我想继承 UIViewController 以进行一些应用范围的自定义。例如。所有视图控制器都应该在 viewDidLoad 或 viewWillAppear 期间执行的操作。
我自然地继承 UIViewController 并从那里开始,所有视图控制器都继承自那里。但是一些控制器运行表。并且有为此目的而设计的 UITableViewController。
所以我也继承了 UITableViewController 并在那里做同样的事情。用 OOP 术语来说,这似乎不是最聪明的事情。并且没有多重继承等。
并且作为 UITableViewController 继承自 UIViewController ...
现在我问自己为什么不创建自己的表格视图控制器,它继承自我自己的视图控制器子类并添加所有表格内容。但什么是“所有表格内容”?
xcode 为每个新的表视图控制器添加了框架代码。非常方便,但可以很容易地转移到代码 sn-ps。 有协议 UITableViewDelegate 和 UITableViewDataSource 的声明。随和。无论如何,这些方法的实现必须遵循 UITableViewController 的每个子类。 协议中所有这些强制方法可能都有合理的默认实现。例如为 numberOfSectionsInTableView 返回 0:或为 titleForHeaderInSection 返回 nil 或为 heightForRowAtIndexPath 返回 44.0f:(虽然是个坏例子。完全不实现它可能更聪明)那么,尽管有明显的东西,UITableViewController 有什么奇迹吗?
【问题讨论】:
感谢所有回答的人。这对特定的架构决策有很大帮助。 【参考方案1】:我相信 UITableViewController
添加的所有行为在类文档中都有明确定义:https://developer.apple.com/documentation/uikit/uitableviewcontroller?language=objc
UITableViewController 类创建一个管理表视图的控制器对象。它实现了以下行为:
• 如果通过 initWithNibName:bundle: 方法(由超类 UIViewController 声明)指定 nib 文件,UITableViewController 会加载归档在 nib 文件中的表视图。否则,它会创建一个未配置的 UITableView 对象,具有正确的尺寸和自动调整大小的掩码。您可以通过 tableView 属性访问此视图。
• 如果加载了包含表格视图的 nib 文件,则数据源和委托将成为 nib 文件中定义的对象(如果有)。如果没有指定 nib 文件,或者 nib 文件没有定义数据源或委托,UITableViewController 将数据源和表视图的委托设置为 self。
• 当表格视图第一次加载时即将出现时,表格视图控制器会重新加载表格视图的数据。每次显示表视图时,它也会清除其选择(有或没有动画,取决于请求)。 UITableViewController 类在超类方法 viewWillAppear: 中实现了这一点。您可以通过更改 clearsSelectionOnViewWillAppear 属性中的值来禁用此行为。
• 当表格视图出现时,控制器会闪烁表格视图的滚动指示器。 UITableViewController 类在超类方法 viewDidAppear: 中实现了这一点。
• 它实现了超类方法 setEditing:animated: 以便如果用户点击导航栏中的 Edit|Done 按钮,控制器会切换表格的编辑模式。
如果它们适用于您的特定控制器和表格视图,所有这些行为应该很容易重新实现。
一般来说,我发现最好自己实现这些行为,以允许您提到的备用继承层次结构,因为我通常考虑将表视图的 delagate
和 datasource
设置为视图控制器一种设计的味道。这些是独立的问题,通常可以并且应该由其他一些类(例如,特定模型类的专用数据源)处理,而不是让视图控制器膨胀。
【讨论】:
谢谢。听起来可行,而且对未来的项目也是一个很好的投资。您是否知道任何可以替代 UITableView 的好代码示例? @Jonah 你如何手动实现 UIViewController 中的最后三个项目符号(即每次显示 table view 时清除选择,在 table view 出现时闪烁 table view 的滚动指示器,并实现超类方法setEditing:animated: o 切换表格的编辑模式)?目前,当我返回 tableview 时,我的单元格保持突出显示,滚动条不会闪烁,并且按下 Edit 按钮完全没有任何作用(它甚至不会将按钮的文本更改为 Done)。您能否通过链接或如何执行这些操作的说明来编辑您的答案? @golddove 我不愿意提供跳过理解手头问题的解决方案,所以我不确定代码示例在这里是否有用。如果我不确定如何实现闪烁滚动指示器,我可能会先查看UITableView
的类文档,它没有提供任何直接的解决方案,但我认为它是更通用的UIScrollView
的子类。 UIScrollView
有一个 flashScrollIndicators
方法。在控制器的 viewDidAppear
中调用该方法会重现在 UITableViewController
中看到的行为。
是的,但是界面生成器/NIB/故事板呢?我已经尝试过他们提到的内容,但它崩溃了。【参考方案2】:
那么尽管有明显的东西,UITableViewController 有什么奇迹吗?
我不知道。据我所知UITableViewController
主要是一个便利类,可以用您自己的添加几行代码的子类替换。
Apple's class documentation 几乎说明了UITableViewController
所做的一切(我在这里不再重复,因为它很可能在未来发生变化)。有时,可以从类的头文件中收集到其他信息,但在 UITableViewController.h
的情况下,源代码 cmets 只是重复类文档中已有的内容。
最后,您必须自己决定要在自己的子类中复制什么。也许您的项目不需要 .nib 处理?或者您的所有表格视图都不可编辑?所以就不要编码了...
【讨论】:
【参考方案3】:UITableViewController
似乎处理了很多管理问题,如果您愿意,您可以自己解决这些问题。查看the documentation——它会自动为你创建一个UITableView
,重新加载它等等。
【讨论】:
“UITableView 处理了很多管理问题” - 我想你的意思是 UITableViewController?此外,作者指出,他的意思是“除了显而易见的东西”。以上是关于UIViewController 和 UITableViewController 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
在 xcode 4.2 中将 UITableViewController 转换为 UIViewController