如何使用静态单元格支持重新创建UITableViewController?

时间:2015-05-24 07:20:30

标签: ios objective-c uitableview

我有很多常见的逻辑,因此我的所有viewControllers都继承自BaseViewController,BaseDetailsViewController或BaseWebViewController。最后两个继承自从UIViewController继承的BaseViewController。问题是我不能将tableViews与静态单元格一起使用,因为我的BaseDetailsViewController不是从UITableViewController继承的。

我从未使用过并继承过UITableViewController,因为可以通过继承UIViewController,使用添加的UITableView连接并实现数据源和委托方法来实现。因此,对于表单类型屏幕(SignUp或其他数据输入屏幕),我使用自己的BaseDetailsViewController,它添加了漂亮而方便的方法(输入验证,自定义样式,滚动键盘,处理输入字段导航等)。

使用UITableViewController有两个真正的好处:1)键盘滚动(如果使用文本字段)和2)在屏幕内轻松创建表单UI元素。第一个好处对我来说无关紧要,因为我已经在BaseDetailsViewController中拥有了我自己的这个东西的实现。关于第二个好处,我在scrollView中创建我的表单,它提供了很大的灵活性,但它需要更多的努力(特别是当需要更新屏幕时)。因此,我听到一些人实现了自己的UITableViewController,然后让它继承自他们的BaseViewController。因此我开始深入研究这种方法。

到目前为止,我遇到了这两种方法:

  1. Recreate your own tableVC。不清楚如何使其适用于静态细胞。目前我的演示应用程序崩溃,如果我的ReplaceTableViewController没有实现numberOfRows和cellForRow,如果我用虚拟内容实现它们,则不会显示静态单元格。
  2. method-swizzling。不清楚如何通过为UITableViewController注入baseViewController继承来改变类继承,认为还不清楚需要添加哪些方法。
  3. 有人试过并希望分享?

    UPDATE 我没有使用故事板,因为我推广干净的MVC - 作为组件的每个屏幕都应该有自己的模型,视图(Xib)和控制器,所有这些都存储在单独的文件中以消除合并冲突大型应用程序项目中的多个开发人员(30多个屏幕)。因此,嵌入segue到tableViewController的容器视图也不是一个选项。

    UPDATE2 如果有人想看看我为什么以及如何做这个,这里是我最近开始发布的开源template based new project generator framework的链接。

1 个答案:

答案 0 :(得分:1)

静态单元格需要一个UITableViewController。你现在无法改变这一点。

但是要在UITableViewController之外的UITableView中使用静态单元格,您可以在Non-Table-UIViewController中使用ContainerView,在其中放置一个真实的,单独创建的UITableViewController与这些静态单元格一起使用。

要在多个视图控制器之间共享公共代码,继承并不是您在自定义UIViewController与UITableViewController时自己发现的最佳解决方案。您可以使用某种组合来共享代码,或者 - 尤其是对于objective-c - 类别。

不允许类别拥有自己的属性,但有workarounds possible with objc_setAssociatedObject

另一种方法是不使用静态单元格,而是使用DataSource-Delegate的UITableView中的动态单元格:)

正如您在我的屏幕截图中看到的,要将特殊的TableView与静态单元重用,我将它放在ContainerView中的其他ViewControllers中。由于您没有使用故事板,我很确定这也可以通过没有故事板的代码来完成。

enter image description here