无法调用 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:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名