每次点击tableview单元格时,我都会尝试打开同一个tableview实例,但我得到的只是一个新创建的视图。例如,当我转到“CounterViewController”并使用计数器时,当我稍后再回到它时,计数器会回落到零。
以下是我目前用于实例化视图控制器的代码。
return NotFound()
我想请注意,我使用的是导航视图控制器,当我使用此方法时,它也不会显示通过tableview控制器的视图控制器顶部的导航栏。
如果有更多信息需要正确回答此问题,请与我们联系。谢谢。
答案 0 :(得分:0)
正如其他人所指出的那样,每次选择单元格时,您的代码都会使用instantiateViewController(withIdentifier:)
创建视图控制器类的新实例。根据定义,你每次都会得到一个新的细胞。
而是创建一个Optional
视图控制器数组,其中填充了nil
并使用它来获取所需的视图控制器。如果存在,请使用它。如果没有,请创建它并将其保存在您的数组中:
//Create an array of view controller identifiers to use to create VCs
let identifiers = ["TimerViewController", "DateViewController", "CounterViewController"]
//Create an array of [UIViewController?] and populate it with nil values
var viewControllers: [UIViewController?] = Array(repeating: nil, count: identifiers.count)
然后创建一个函数来返回索引的视图控制器。像这样:
func viewControllerAt(index: Int) -> UIViewController {
guard index < viewControllers.count else {
fatalError("index out of range!")
}
var result = viewControllers[index] //try to fetch a VC from the array
//if it's nil, create a VC using the correct identifier and save it to the array
if result == nil {
result = InstantiateViewController(withIdentifier: identifiers[index]
viewControllers[index] = result
}
return result
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = viewControllerAt(indexPath.row)
self.present(vc, animated: true, completion: nil)
}
请注意,我回答了#34;字母&#34;问题:如何在每次点击一个单元格时显示一个视图控制器的相同实例。
Matt指出,最好创建一个状态数据数组,并在每次点击时创建视图控制器的新实例,就像现在一样,但是用新保存的状态数据填充新的子视图控制器那一排。这是如此常见,它有一个名称:主/细节设计模式,甚至有系统支持。尝试搜索iOS主/详细设计模式以获取更多信息。