无法调用 tableViewController
Cannot invoke tableViewController
我一直在努力切换 viewControllers。
我得到了以下故事板:
左上角 VC 是登录名 VC,它通过模式转场将视图推送到 MainViewController(左下角)。
这可以通过以下方式正常工作:
self.performSegueWithIdentifier("MainSegue", sender: self)
MainViewController 托管一个 "Menu" 栏项,单击该项会启动 cocoa 控制 SSASideMenu 并显示 LeftSideMenu VC。这也很好用。
LeftSideMenu VC 有 2 个菜单项("home" 和 "order")。项目 "home" 将返回到 MainViewController(下面的案例 0 - 工作正常)。 Item "order" 需要呈现 ItemTableViewController(右上角),它基本上是一个表 VC,带有嵌入导航控制器的原型单元格。
下面的案例 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**
....
单元格始终为零。
我尝试用以下方式注册 class(尽管我不必这样做,因为我使用的是故事板):
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 尝试过,但发现 segue not exists on LeftSideMenu 错误(正确的 cellIdentifier 确实存在)。
底线是我无法调用 ItemTableViewController(右上表VC)!
有什么线索吗?
你永远不应该打电话给 dequeueReusableCellWithIdentifier:
。始终使用 dequeueReusableCellWithIdentifier:forIndexPath:
代替。它可以 永远不会 return 一个 nil
单元格,如果有问题,它会给你一个很好的错误消息来解释原因。
我预计会发生的是您会收到一条错误消息,告诉您未连接到故事板中的原型单元。然后你必须弄清楚为什么。获得正确的单元标识符当然是至关重要的:它必须与您的代码的重用标识符 完全匹配 ,包括拼写。但远不止于此。也许您忘记了在故事板中设置 table 视图控制器的自定义 class。或者您可能获得了 table 视图控制器的错误实例 - 即,您创建了一个新实例,而不是从情节提要中获取实际实例,即具有原型单元格的实例。
我一直在努力切换 viewControllers。
我得到了以下故事板:
左上角 VC 是登录名 VC,它通过模式转场将视图推送到 MainViewController(左下角)。
这可以通过以下方式正常工作:
self.performSegueWithIdentifier("MainSegue", sender: self)
MainViewController 托管一个 "Menu" 栏项,单击该项会启动 cocoa 控制 SSASideMenu 并显示 LeftSideMenu VC。这也很好用。
LeftSideMenu VC 有 2 个菜单项("home" 和 "order")。项目 "home" 将返回到 MainViewController(下面的案例 0 - 工作正常)。 Item "order" 需要呈现 ItemTableViewController(右上角),它基本上是一个表 VC,带有嵌入导航控制器的原型单元格。
下面的案例 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**
....
单元格始终为零。
我尝试用以下方式注册 class(尽管我不必这样做,因为我使用的是故事板):
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 尝试过,但发现 segue not exists on LeftSideMenu 错误(正确的 cellIdentifier 确实存在)。
底线是我无法调用 ItemTableViewController(右上表VC)!
有什么线索吗?
你永远不应该打电话给 dequeueReusableCellWithIdentifier:
。始终使用 dequeueReusableCellWithIdentifier:forIndexPath:
代替。它可以 永远不会 return 一个 nil
单元格,如果有问题,它会给你一个很好的错误消息来解释原因。
我预计会发生的是您会收到一条错误消息,告诉您未连接到故事板中的原型单元。然后你必须弄清楚为什么。获得正确的单元标识符当然是至关重要的:它必须与您的代码的重用标识符 完全匹配 ,包括拼写。但远不止于此。也许您忘记了在故事板中设置 table 视图控制器的自定义 class。或者您可能获得了 table 视图控制器的错误实例 - 即,您创建了一个新实例,而不是从情节提要中获取实际实例,即具有原型单元格的实例。