委托方法没有被调用
问题描述:
我有一个分割视图控制器和主视图有一个按钮(注意)将注释视图推到细节视图。 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)
}
}
}
答
万一有人有同样的问题,那是因为我在viewDidLoad中设置委托变量,当view最初加载时调用该变量。当用户从更深的视图控制器导航回视图时,视图再次出现时不会调用它。委托变量应该已经在viewWillAppear中设置了。