我正在尝试将数据从主VC(称为StartVC)传递到嵌入式VC(称为MPList - 它本身包含一个tableview)。
我发现的解决方案都指向使用prepareforsegue方法,但这似乎对我没有用。该应用程序运行时没有错误,并且表格视图没有填充我发送的数据。
在StartVC中,我已经实现了prepareforsegue方法,如下所示(在属性检查器中,embed segue肯定有一个标识符“LeftPane”。):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "LeftPane"{
let mpListVC = segue.destination as? MPList
mpListVC?.mpNames = self.mpNames
}
}
mpNames是一个在嵌入式MPList中初始化的字符串数组,如下所示(mpListTV是所讨论的tableview的IBOUTLET):
class MPList: UIViewController, UITableViewDataSource, UITableViewDelegate{
var mpNames = [String]()
override func viewDidLoad() {
super.viewDidLoad()
mpListTV.delegate = self
mpListTV.dataSource = self
print("names in MPList is: \(mpNames)")
}
通常的tableview控件方法也在MPList中实现(这也是使用mpNames的地方。):
//MARK: - TABLEVIEW METHODS
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return mpNames.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = mpNames[indexPath.row]
return cell
}
我还确保右键单击并从tableview拖动到MPList视图控制器顶部的小黄色图标,并设置数据源和委托。
我可能只是累了(并且遗漏了一些非常明显的东西)现在在这里待了几个小时,但有人可以请我摆脱我的痛苦并告诉我我的错误是什么吗?
答案 0 :(得分:0)
我在这里看到可能出现的问题:
//in prepareForSegue
let mpListVC = segue.destination as? MPList
确保IB 中的目标视图控制器确实设置为MPList
。因为这个原因,mpListVC
可能nil
。只需调试并确保mpListVc
不是零。
同时调试并确保没有可选项为nil。更好的是,使用强制解包(!
)尝试在某处找到可能的nil
。
只需设置断点并检查mpNames
是否确实已设置。
viewDidLoad
之前可能会MPList
prepareForSegue
reloadData
被调用,尽管它不应该。无论哪种方式,重置阵列后UITableView
的{{1}}都是一个很好的做法。
var mpNames = [String]() {
didSet {
mpListView?.reloadData()
}
}