当用户选择了某个项目时,我正在尝试将所选项目的索引以及对记录控制器的引用传递给UINavigationController
。 我遇到的问题是我不确定如何正确传递这些变量。我试图避免通过“错误的方式”。 [编辑:如果我将项目保存在AppDelegate
]中的静态变量中,则该应用程序将正常运行
下面,我显示用户选择项目时运行的代码,在导航控制器中运行的代码(使用错误的方式传递变量)以及最后在视图控制器上运行的代码(指示变量未传递。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let storyboard = storyboard, let controller = storyboard.instantiateViewController(withIdentifier: "DetailNavigationController") as? DetailNavigationController else {
print("ERROR: didn't get the view controller we expected")
return
}
print("initializing the newly created page view controller with index \(indexPath.row)")
controller.bIndexPath = indexPath
controller.bController = bController
present(controller, animated: true, completion: nil)
}
。
override func viewDidLoad() {
super.viewDidLoad()
print("DetailNavigationController vdl and index \(bIndexPath.row)")
guard let storyboard = storyboard, let controller = storyboard.instantiateViewController(withIdentifier: "ManagePageViewController") as? ManagePageViewController else {
print("ERROR: didn't get the view controller we expected")
return
}
controller.bIndexPath = bIndexPath
controller.bController = bController
}
。
DetailNavigationController vdl and index 4
但是在ManagePageViewController
中,我们显然没有得到相同的实例,因为未设置变量。我“知道这行不通”,但不知道还能尝试什么。
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad ManagePageViewController \(bIndexPath)")
if let viewController = viewPhotoCommentController(currentIndex ?? 0) {
if let bController = bController {
viewController.bController = bController
} else {
print("ManagePageViewController viewDidLoad bController.performFetch")
let bSortedByName = SaucerItem.order(Column("name").asc, Column("name"))
bController = try! FetchedRecordsController(dbQueue, request: bSortedByName)
try! bController.performFetch()
vController.brewController = bController
}
let viewControllers = [viewController]
print("setting a view controller instance with currentIndex \(currentIndex ?? 0)" )
setViewControllers(viewControllers, direction: .forward, animated: false, completion: nil)
}
dataSource = self
}
。
viewDidLoad ManagePageViewController nil
ManagePageViewController initializing the newly created page view controller with index 0
ManagePageViewController viewDidLoad bController.performFetch
setting a view controller instance with currentIndex 0
。
这表明先前设置的变量一定在其他实例上,所以这是错误的方法。
我以为我可以在AppDelegate
中进行设置,但这对我来说似乎是错误的。必须有一种干净地传递数据的方法。我尝试过的其他一些事情包括使用UINavigationController
中包含的功能来确定它将要运行的内容,并在该实例上设置变量,但是我无法发现控制器将要运行的实例。运行。
为了回答一个问题,为什么我似乎要从“ A”到“ C”到“ B”,我将在此处放置一个图表并尝试解释原因。最重要的是,必须以这种方式配置它才能在详细信息屏幕上启用分页。
从DetailNavigationController.viewDidLoad()打印controller
到ManagePageViewController
,从ManagePageViewController.viewDidLoad()打印viewController
到PageViewController
。
那么将这些信息传递给下一个视图控制器的正确方法是什么?