我有一个splitview控制器,Master视图有一个按钮(Note),它将Note视图推送到Detail视图。详细信息视图使用导航控制器来帮助用户在多个视图控制器之间来回导航。在这些视图控制器中,我有委托方法将Note视图推送到自身。这就是我的UI的样子:
“注释”按钮的工作方式与我最初运行应用时的预期相同。当我点击其中一个列表元素并遍历更深层次的视图时,它仍然有效。但是,当我回到第一个视图(最初工作)时它停止工作。我不确定是什么导致了这种不一致的行为,如果你们能帮助我解决这个问题,我很感激。
这是我的代码的摘录:
主视图
protocol ChildViewDelegate: class {
func updateView()
func pushOntoDetailViewNaviController(_ viewName: String)
}
class MasterViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate, GADBannerViewDelegate {
....
@IBAction func noteTapped(_ sender: UIBarButtonItem) {
pushOntoActiveNaviController("NoteGalleryView")
}
private func pushOntoActiveNaviController(_ viewName: String) {
guard let splitView = self.splitViewController else {
return
}
if splitView.viewControllers.count > 1 {
// Push view onto any active detailed view
self.delegate?.pushOntoDetailViewNaviController(viewName)
} else { //If active view is the master view (true for iphone), then push it onto the master view
if let vc = storyboard?.instantiateViewController(withIdentifier: viewName) {
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
....
}
详细信息视图
class DetailTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, GADBannerViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
masterViewController = (self.splitViewController?.viewControllers.first as! UINavigationController).topViewController as? MasterViewController
masterViewController?.delegate = self
}
extension DetailTableViewController: ChildViewDelegate {
func updateUI() {
....
}
func updateView() {
DispatchQueue.main.async {
self.tableView.reloadData()
self.updateUI()
}
}
func pushOntoDetailViewNaviController(_ viewName: String) {
if let vc = storyboard?.instantiateViewController(withIdentifier: viewName) {
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
答案 0 :(得分:0)
如果有人遇到同样的问题,那是因为我在viewDidLoad中设置了委托变量,该变量在最初加载视图时被调用。当用户从更深层视图控制器导航回视图时,再次出现视图时不会调用它。委托变量应该在viewWillAppear中设置。