将UIViewController更改为故事板中的UITableViewController?

时间:2012-12-19 16:59:34

标签: objective-c ios xcode uiviewcontroller uitableview

我已经在我的故事板中发表了一个视图,我现在决定通过静态表格单元格显示其数据。

我无法在UIViewControllerStatic table views are only valid when embedded in UITableViewController instances)中使用静态表格视图。所以,我需要以某种方式将现有的UIViewController转换为UITableViewController。我已经更改了.h文件的父级,但是还没有完成它。

还有另一种方法可以实现这一目标吗?我真的宁愿不必在故事板上创建一个新的VC并将所有内容移到一边,这是一个很大的麻烦。

3 个答案:

答案 0 :(得分:17)

我将添加到此,因为问题是关于如何将UIViewController更改为UITableViewController,并且考虑到这个问题超过一年且原始答案,虽然有效且可能或可能不是唯一的当时的解决方案,实际上并没有回答问题,也不是唯一的解决方案。

可以这样做,您只需在IB中设置表视图委托和数据源出口,并手动编辑故事板XML,这听起来很可怕,但实际上非常简单。

首先,将您的类的父级更改为UITableViewController。 UITableViewController已经采用了UITableViewDatasource和UITableViewDelegate协议,所以如果你的类也可以删除它们:

@implementation MyTableViewController : UITableViewController
...
@end

接下来,在UITableView上为其dataSource和delegate创建新的引用插座。最简单的方法是从UITableView控制拖动到自身。弹出窗口将为您提供dataSource和delegate选项。

最后,您需要更改故事板XML。故事板文件可以非常快速地变得非常大。找到您要查找的场景的最简单方法是在Identity Inspector中设置Storyboard Identifier。要直接查看XML,请右键单击项目导航器中的storyboard文件,然后选择“Open As - > Source Code”。现在只需搜索您之前设置重用标识符的内容。你会看到类似的东西:

<!-- My Table View Controller -->
<scene sceneID="EuE-XX-cCb">
  <objects>
    <viewController storyboardIdentifier="MY_TABLE_VIEW_IDENTIFIER" ... >
      // Lots of other stuff
    </viewController>
  </objects>
</scene>

您需要做的就是更改打开和关闭视图控制器标签

<viewController>
</viewController>

是tableViewController而不是

<tableViewController>
</tableViewController>

就是这样!无需创建新的UITableViewController场景或在容器视图中嵌入UITableViewController。

修改

我还应该补充一点,UITableView必须是根视图。它不能嵌入另一个UIView中。

答案 1 :(得分:13)

如果您希望静态单元格表​​视图不占用整个屏幕,那么使用容器视图是最简单的方法。从常规UIViewController开始,将容器视图(在对象列表中的普通UIView旁边)拖到其视图中。根据需要调整大小 - 故事板将自动提供连接到此容器视图的视图控制器,并带有嵌入segue。删除该控制器,拖出一个表视图控制器,然后右键从容器视图拖动到该表视图控制器,以创建一个新的嵌入segue。可以使用其childViewControllers属性从UIViewController访问此表视图控制器(相反,如果需要,可以使用parentViewController从表视图控制器访问UIViewController)。

答案 2 :(得分:0)

我所做的是在IB中创建UITableViewController,使用文本编辑器打开Storyboard,并将UIViewController内的所有节点复制到UITableViewController。

我认为通过这种方式删除重要内容的风险会降低。

在复制sections对象之前,请确保两个tableviews(UIViewController和UITableViewController)具有相同的属性集:静态或动态单元格,样式(普通或分组)等。