【问题标题】:Pushing same TableViewController into navigation stack multiple times多次将同一个 TableViewController 推入导航堆栈
【发布时间】:2017-02-12 20:31:37
【问题描述】:

对于我的应用,我需要多次推送相同的 TableViewController。当用户点击 didSelect 时,我需要在导航堆栈中推送相同的控制器。

我的应用程序是文件管理器应用程序,它连接到 ftp 服务器并向用户显示里面的内容。但是文件夹中可能有包含更多文件夹(无限)的文件夹。

为此,我无法在情节提要中创建大量 TableViewController,并且当我尝试将同一控制器推入导航堆栈时:

navigationController?.pushViewController(self, animated: true)

我收到错误消息,说我无法在导航堆栈中推送相同的控制器。 所以我创建了我的控制器的新实例并尝试像这样推送:

let newMyTableVC = MyTableVC() navigationController?.pushViewController(newMyTableVC, animated: true)

但是有了这个我也得到错误说:

'无法将标识符为 FolderCell 的单元格出列 - 必须为标识符注册一个 nib 或类或连接情节提要中的原型单元格'

所以我从这个错误中了解到我的第一个 TableViewController 使用了我的单元格标识符并且它在内存中。当我尝试传递具有相同单元格标识符的 TableViewController 的新实例时,它会崩溃,因为单元格已经存在具有相同的标识符。(我可能错了)。

If i am on right track doing this with approach at the above {
    How do i reuse cells with dynamic identifier and provide data to them.
} else {
    How do i accomplish what i want?
  }

感谢您的宝贵时间。

【问题讨论】:

  • 为什么每次都创建一个新的控制器,而不是仅仅更改数据集以匹配当前目录的数据集?然后使用 TableView 的 reloadData() 功能?
  • 这是一个非常好的方法。给 table view controller 一个 storyboard id,并用 self.storyboard instantiateViewControllerWithId 实例化。
  • 大家好,感谢您的回复。我每次都需要创建新的控制器,因为我希望用户能够从缓存中的最后一个文件夹视图控制器返回,而无需等待新的网络请求和重新加载 tableView。此外,当用户点击单元格并重新加载数据而不是将新视图控制器推入导航堆栈时,这也是糟糕的用户体验。

标签: ios objective-c swift uitableview uinavigationcontroller


【解决方案1】:

当你像这样创建一个新实例时:

let newMyTableVC = MyTableVC()

它完全独立于故事板。重要的是,它因此对故事板中定义的原型单元一无所知。因此,错误的相关位是“...或在情节提要中连接原型单元”。

为避免此问题,请在情节提要中为您的表视图控制器设置一个标识符,然后使用:

let newMyTableVC = self.storyboard!.instantiateViewControllerWithIdentifier("identifier") as! MyTableVC

【讨论】:

  • 感谢您的回答,它运行良好。即使我多次使用这种方法,我也从来没有这样想过。那么,当我需要情节提要中的视图控制器实例时,我应该使用这种方法吗?
  • @YasinNazlıcan 是的,如果您想使用情节提要中的设计和布局,您必须使用 instantiateViewControllerWithIdentifier 或使用 segue。
猜你喜欢
  • 2020-01-25
  • 2011-06-26
  • 2021-02-24
  • 1970-01-01
  • 2019-10-08
  • 2019-09-18
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多