我试图通过几个不同的类传递一个变量来用于核心数据(一对多关系)。
提供正在发生的事情的背景。我有一个tableViewController(jobs),当用户点击其中一个单元格时,它将它们带到带有4个viewControllers的tabBarController。然后在第一个viewController上是一个tableView,如果用户点击一个特定的单元格,它会将它们带到另一个tabBarController。我试图传递变量
var job:Job?
从顶层到最后一个tabBarController,但是在尝试将变量从第一个TabBarcontroller传递到第二个tabBarController时似乎迷路了。我很难看到没有通过ViewControllers传递变量有什么问题。
这里是每个ViewControllers变量以及我如何传递它们:
JobViewController:
var jobs = [Job]()
// CELL DID SELECT ROW
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let jobTab = jobTabController()
jobTab.job = jobs[indexPath.row]
show(jobTab, sender: self)
}
这是第一个tabBarController - jobTabController:
var job: Job?
这是第一个附加到jobTabController的ViewController - jobInfo:
// OBSERVE JOB
var job: Job? {
let tabBarController = self.tabBarController as! jobTabController
return tabBarController.job
}
// CELL DID SELECT ROW
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 1 {
if indexPath.row == 1 {
let camLens = cameraLensesTabController()
camLens.job = self.job
show(camLens, sender: self)
}
}
}
注意:这是变量似乎丢失的地方 - 在jobInfo和amp;之间。 cameraLensesTabController - name: cameraLensesTabController
var job: Job?
然后这是我的viewController附加到cameraLensesTabController - cameraController:
var job: Job?
@IBAction func HandleAddCamera(sender : UIButton) {
let newCamera = newCameraController()
newCamera.job = self.job
let navController = UINavigationController(rootViewController: newCamera)
present(navController, animated: true, completion: nil)
}
在cameraController上我有一个添加按钮,可以将你带到另一个名为 newCameraController 的ViewController,你可以在cameraController上的tableView中添加项目:
var job: Job?
答案 0 :(得分:1)
在jobInfo
控制器中,您可以通过var job
访问tabBarController.job
。但是在cameraLensesTabController
中,您的var Job?
明显初始化为nil
,就像cameraController
一样。
您是否期望这两个控制器可以访问tabBarController.job
的原始值?显然,你从来没有把它转发给他们。
编辑:
当viewController执行segue(即切换到)到另一个时,它首先调用prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
或其Swift等价。在此函数中,您可以访问目标viewController并在那里设置属性,请参阅https://stackoverflow.com/a/7865100/1987726。
编辑2:
在任何情况下都会调用prepareForSegue:sender:
方法。请查看Perform Segue programmatically and pass parameters to the destination view。