如何打开相同的视图控制器实例?

时间:2018-06-16 21:44:56

标签: swift uitableview didselectrowatindexpath

每次点击tableview单元格时,我都会尝试打开同一个tableview实例,但我得到的只是一个新创建的视图。例如,当我转到“CounterViewController”并使用计数器时,当我稍后再回到它时,计数器会回落到零。

以下是我目前用于实例化视图控制器的代码。

return NotFound()

我想请注意,我使用的是导航视图控制器,当我使用此方法时,它也不会显示通过tableview控制器的视图控制器顶部的导航栏。

如果有更多信息需要正确回答此问题,请与我们联系。谢谢。

1 个答案:

答案 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主/详细设计模式以获取更多信息。