无法调用 tableViewController

Posted

技术标签:

【中文标题】无法调用 tableViewController【英文标题】:Cannot invoke tableViewController 【发布时间】:2015-10-04 15:58:57 【问题描述】:

我一直在努力切换视图控制器。

我得到了以下故事板:

左上角的 VC 是登录 VC,它通过模态 segue 将视图推送到 MainViewController(左下角)。

通过以下方式可以正常工作:

self.performSegueWithIdentifier("MainSegue", sender: self)

MainViewController 承载一个“菜单”栏项目,单击该项目可启动可可控件 SSASideMenu 并呈现 LeftSideMenu VC。这也很好用。

LeftSideMenu VC 有 2 个菜单项(“home”和“order”)。项目“home”将返回 MainViewController(下面的案例 0 - 工作正常)。项目“订单”需要呈现 ItemTableViewController(右上角),它基本上是一个 tableVC,其中一个原型单元嵌入在导航控制器中。

下面的案例 1 是所有错误的地方:

func tableView(..........) 

    tableView.deselectRowAtIndexPath(indexPath,animated: true)

    switch (indexPath.row) 
        case 0: 
            sideMenuViewController?.contentViewController =
                UINavigationController(rootViewController: MainViewController())
            sideMenuViewController?.hideMenuViewController()
        break 
        case 1: 
            sideMenuViewController?.contentViewController =
                UINavigationController(rootViewController: ItemTableViewController())
            sideMenuViewController?.hideMenuViewController()
        break
    

所以,案例1会导致ItemTableViewController的func tableView被调用:

func tableView(tableView: UITableView, cellForRowAtIndexPath ...) 

    let cellIdentifier = "MenuItemTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MenuItemTableViewCell!

    let item = items[indexPath.row]

    cell.cellTitle.text = item.name // **cell is always nil**

    ....

单元格始终为零。

我尝试通过以下方式注册课程(尽管我不应该这样做,因为我正在使用情节提要):

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MenuItemTableViewCell!
    if cell == nil 
            tableView.RegisterClass(MenuItemTableViewCell.self, forCellReuseIdentifier: cellIdentifier)
            cell = MenuItemTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)

    let item = items[indexPath.row]

    cell.cellTitle.text = item.name // **cell is still nil**

我也尝试过使用 segue,但在 LeftSideMenu 错误中出现 segue not exists(它确实存在于正确的 cellIdentifier 中)。

底线是我不能调用ItemTableViewController(右上tableVC)!

请问有什么线索吗?

【问题讨论】:

【参考方案1】:

你永远不应该打电话给dequeueReusableCellWithIdentifier:。始终使用 dequeueReusableCellWithIdentifier:forIndexPath: 代替。它从不返回nil单元格,如果出现问题,它会给你一个很好的错误消息来解释原因。

我预计会发生的是,您会收到一条错误消息,告诉您未连接到情节提要中的原型单元。然后你必须弄清楚为什么。当然,正确获取单元格标识符至关重要:它必须与您的代码的重用标识符完全匹配,包括拼写。但它的意义远不止于此。也许您忘记在情节提要中设置表格视图控制器的自定义类。或者您可能获得了错误的表格视图控制器实例 - 即,您创建了一个新实例,而不是从情节提要中获取实际实例,即具有原型单元格的实例。

【讨论】:

我最初确实使用过它。错误是“无法使具有标识符 MenuItemTableViewCell 的单元格出列 - 必须为标识符注册 nib 或类或连接情节提要中的原型单元格”。我正在使用带有正确标识符的故事板 但是你看,这个错误是有帮助的。通过更改呼叫来隐藏它是错误的。 :) 这告诉您表格视图控制器和情节提要之间的连接是错误的。我不知道您做错了什么,但这就是您需要解决的问题。也许您忘记在情节提要中设置表格视图控制器的自定义类。或者您可能获得了错误的表格视图控制器实例 - 即,您创建了一个新实例,而不是从情节提要中获取实例。这就是问题所在,但只有你能看到并解决它。 如果以前从未实例化过 tableVC 故事板实例,我将如何获得它?这是应用程序中对 VC 的第一次调用。 你说的是:rootViewController: ItemTableViewController()。就像我说的那样,这就是问题所在。那是错误的 ItemTableViewController 实例。这是一个新的独立实例。您需要情节提要中的实例。您需要在情节提要中为表格视图控制器提供一个标识符,并使用该标识符从情节提要获取该实例。 谢谢马特!必须像这样获取实例:让 viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") 作为 UIViewController。效果很好!

以上是关于无法调用 tableViewController的主要内容,如果未能解决你的问题,请参考以下文章

Typescript中的“无法调用类型缺少调用签名的表达式”?

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名

错误 TS2349:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名

为啥 TypeScript 声称它“无法调用类型缺少调用签名的表达式”?

Android:无法调用完成()

无法调用其类型缺少调用签名的表达式