nib文件中没有UITableView。

63

我的应用程序适用于iOS 5.1,但在iOS 6模拟器上出现以下错误。

终止应用程序,原因是未捕获的异常 'NSInternalInconsistencyException',原因:'-[UITableViewController loadView]加载了“MainListViewController”nib文件,但没有获取UITableView。'

我正在对UITableViewController进行子类化,并且不想更改它。

表格视图是通过编程方式创建的,有一个虚拟的MainListViewController.xibMainwindow.xib Tab栏控制器中加载。

我还尝试删除MainListViewController.xib,将其从MainWindow.xib Tab栏控制器中移除,在AppDelegate中创建MainListViewController,并将其作为UITabBarItem添加到Tab栏控制器中,以摆脱这个nib问题,但仍然出现相同的错误。


你的表格是在哪里被加载的?它是否被设置为视图输出口/属性? - CodaFi
它在viewDidLoad中加载,在第二个版本中(通过编程方式添加UITabBarItem),它没有设置为outlet/property。 - irmakoz
13个回答

103

如果您有一个UITableViewController的子类的NIB文件,那么它的view属性必须与一个UITableView连接。

您删除了MainListViewController.xib文件并尝试使用代码实现,这是正确的做法。但问题在于,旧的XIB文件不会在构建和运行时被删除。因此,从模拟器中删除应用程序并再次尝试。然后它应该可以工作了。


11
谢谢!我已删除旧的应用程序,清理了项目并关闭了iOS模拟器,现在没有.xib文件的版本可以正常工作。 - irmakoz
我不明白,如果xib文件在初始化UITableViewController的子类时没有被使用,为什么这会成为问题呢?听起来像是Xcode的一个bug或者其他什么问题...无论如何,我删除了xib文件,清理了项目,但还是不行,直到我删除了旧应用程序才成功。 - xu huanze
1
@xuhuanze - 但这就是这个问题的重点——NIB 被用来初始化 UITableViewController 的子类。如果你的情况不同,那么你应该看其他的问题。 - mattjgalloway
@mattjgalloway 您是正确的。我的问题不同,我使用xib创建了控制器,但后来决定不使用它,但仍然出现相同的错误... - xu huanze
你是如何知道这个荒谬的答案(尤其是第二部分)的,真是太神奇了。 - jungledev

29

我曾经在使用storyboards时遇到类似的问题。为了让其他人受益,我会发布我的解决方案。关键是,如果您已经将文件所有者正确设置为UITableView子类,则仍需确保视图属性设置为TableView。我正在使用storyboards,但同样的事情也应该适用于nibs。展开“文档大纲”以查看Storyboard的层次结构。我将在下面包括一些屏幕截图。快速解决此问题的方法是查看文档大纲中的视图。删除任何您作为其子级的tableview。将另一个tableview拖到视图属性上即可完成。我会用屏幕截图来向您展示。

输入图像描述

请注意这两个表格。您要删除Table1及其单元格。

输入图像描述

很好。现在将Table2拖到视图中,问题就解决了。现在应该可以正常工作了。基本上,如果您有一个UITableViewController的子类,那么它必须有一个TableView代替视图,否则它将崩溃。

输入图像描述


当我想在UITableView上方获取一个静态大小的视图时,遇到了这个问题,但是在子类化UITableViewController时似乎不可能(无法调整顶部视图的大小)。您的答案让我相信我必须改为子类化UIViewController。然后我连接了自己的UITableView实例。谢谢! - owenfi
如果你确实需要一个tableViewController,你可以随时使用嵌入式的方式。因此,如果你正在使用静态tableview,它必须是一个tableViewController。在这里,你可以通过使用嵌入式的tableViewController来解决问题。我经常使用它们。 - SmileBot
@cocoanut 抱歉,我需要一个“静态大小”的滚动视图(水平滚动),位于动态原型表视图之上。不确定是否理解您的示例,您能否扩展UITableViewController并调整其tableView大小,以占据屏幕底部50%的空间? - owenfi
@owenfi 我不确定你想要实现什么。也许可以查看http://www.raywenderlich.com/4680/how-to-make-an-interface-with-horizontal-tables-like-the-pulse-news-app-part-1,但如果tableView不适合您的需求,您也可以考虑使用UICollectionView。我认为该教程已经过时了,因为在现代版本的sdk中,collectionViews被用来替代这个功能。 - SmileBot
1
我起初没有理解这个答案,为了帮助别人澄清:Table View 必须是 ActivitiesTVC - Activities 节点的子节点,而不是 View 的子节点。 - GraehamF

17
可能的原因是:
检查.h文件是否是UIViewController的子类,这样可以解决问题。

12

如果您将UITableView用作顶层视图。

像这样:

enter image description here

您需要在控制器中使用UITableViewController。

class ItemsViewController: UITableViewController

如果您在Storyboard中的一个视图下使用了UITableView。

像这样:

enter image description here

则需要在UIViewController中使用UITableViewDelegate和UITableViewDataSource。

class ItemsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

12

简而言之,你正在将自定义的UITableViewController子类设置为UIViewController!这是不允许的。你应该给UIViewController一个UIViewController子类。


4

当使用Storyboards和1个表格视图时,我找到了解决方案。

关键是在创建自定义类(newViewController)时,只需检查它是否是UITableViewController的子类。一旦创建完成,请转到表格视图控制器(我们的表格),并在Identity Inspector中选择刚刚创建的自定义类(newViewController)。

这对我很有效。希望我的评论能帮助到某些人。


3
请将您的表视图连接为View outlet。outlet必须连接到一个UITableView。

3

可能出现这种情况的原因有几个。

  1. 您可能没有将 UITableViewDelegate & UITableViewDataSource 添加到您的 .h 文件中。

    @interface TableController : UIViewController {

  2. 您可能没有将声明的输出与故事板/ Nib 中的组件连接起来。

  3. 在您的 .h 文件中,您可能会调用一个 UIViewController 而不是一个 UITableView 或者反过来。

@interface TableController : UIViewController

或者

 @interface TableController : UITableViewController 

1

@smileBot的回答帮助我意识到解决方案非常简单,而iOS引发的错误也有道理。

由于未捕获异常而终止应用程序 'NSInternalInconsistencyException',原因:'-[UITableViewController loadView] 加载了“MainListViewController”nib,但没有得到 UITableView。'

他们基本上是说nib的视图控制器没有返回UITableView,因为它实际上不是,对于大多数情况下,你的nib会返回一个View,这是在Xcode IDE中创建新的ViewController时默认为您创建的。

解决方案就像删除那个View一样简单-虽然可能与常规想法相悖-但请继续选择并按退格键,然后将UITableView拖放到ViewController中,这个UITableView现在将作为您的TableViewController中的根视图。

请记住,这仅适用于直接子类化UITableViewController的类。

祝你好运。


1

我曾经遇到过这个问题,解决它只需要一个简单的步骤。

如果你已经创建了 nib,请保留它...

前往(XIB 文件),从对象库中添加一个 tableView 组件到 XIB 文件的 iPhone 屏幕上,然后它应该就可以工作了 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接