如何修复“nib but didn't get a UITableView”错误?

11

为什么会出现这个错误?

因未捕获的异常而终止应用程序,异常信息为 'NSInternalInconsistencyException',原因是“UITableViewController加载了“pB1-re-lu8-view-o7U-YG-E7m”nib文件,但没有得到UITableView。”

以下是我的代码:

class FriendListTableViewController: UITableViewController{


var objects = NSMutableArray()
var dataArray = [["firstName":"Debasis","lastName":"Das"],["firstName":"John","lastName":"Doe"],["firstName":"Jane","lastName":"Doe"],["firstName":"Mary","lastName":"Jane"]]

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table View

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataArray.count
}

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    let object = dataArray[indexPath.row] as NSDictionary
    (cell.contentView.viewWithTag(10) as! UILabel).text = object["firstName"] as? String
    (cell.contentView.viewWithTag(11) as! UILabel).text = object["lastName"] as? String
    return cell
}

 override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.
    return false
}

我的故事板是这样的:

storyboard


如何正确地实现这个? - Ega Setya Putra
在 Void Did Load 方法中编写以下内容:self.delegate=self; self.dataSource=self; 并在 ViewController.h 中扩展:<UITableViewDelegate, UITableViewDataSource>。 - Ashok Londhe
尝试一下,解决了问题后通知我。 - Ashok Londhe
@EgaSetyaPutra,请告诉我你遇到了什么错误。 - Ashok Londhe
1
你的答案不是用 Objective-C 写的吗?因为我正在使用 Swift。 - Ega Setya Putra
3个回答

25

我曾经遇到过同样的问题,而且是非常愚蠢的错误。我子类化了UITableViewController,在其中添加了UITableView,但实际上应该是在UIViewController中添加。

从你的Storyboard图片来看,如果你使用UIViewController而不是UITableViewController,问题可能会得到解决。尝试一下这种方法,可能会解决你的问题,例如:

class FriendListTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

1
我认为你的答案是关于如何使用Objective-C设置代理,我已经像这样设置了代理:“FriendListTableViewController:UIViewController,UITableViewDelegate,UITableViewDataSource”。但我仍然遇到相同的错误。 - Ega Setya Putra
1
你是否检查过你的 UITableView 是否已经与顶层视图连接。你可以通过 UIStoryBoard 的视图层次结构来检查它。 - Viral Savaj
@EgaSetyaPutra 上面的答案是使用 Swift 的... 你是在使用 Swift 还是 Objective-C? - Ashok Londhe
让我们在聊天中继续这个讨论 - Viral Savaj
我正在使用Swift,@ViralSavaj感谢您的答案,它解决了我的问题。 - Ega Setya Putra
显示剩余4条评论

4

SWIFT 2 更新

我尝试了 @Viralsavaj 的答案,但在将 tableView 作为 ViewController 中的 outlet 与 storyboard 相连接之前,它对我无效。

像这样:@IBOutlet weak var tableView: UITableView!

同时,按照 @Viralsavaj 的建议,将以下内容添加到您的类中:

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

我也使用了这个链接的帮助:如何在Segue期间从视图控制器引用tableView 只需将tableView拖到ViewController中并使其成为outlet即可。然后,您可以引用其属性,例如self.tableView.reloadData()
在我将tableView添加为引用outlet之前,这个属性以及其他引用tableView的属性都会出错。
希望这能帮助未来的人们。

是的,我经常使用和你一样的方法。这样更容易。 - Ega Setya Putra
@lukeslvi:根据您对我的回答的评论以及这个回答,我无法确定您的问题是否已经解决或仍然存在? - Viral Savaj
已经不存在了。非常感谢。我将您的建议与另一个链接的建议结合起来,现在它可以正常工作了。 - Lukesivi

3
我在Swift 2和Xcode 7.2中遇到了这个问题。我将一个拖到我的Storyboard的View Controller更改为自定义的UITableViewController类,然后将Table View拖到View Controller上。我没有意识到我将其放置在原始View ControllerView的子级下。
我只需删除View,然后再次将Table View添加为Super View的第一个子项即可。

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