未调用委托方法
Delegate method is not being called
我有一个 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)
}
}
}
万一有人遇到同样的问题,那是因为我在 viewDidLoad 中设置了委托变量,它在最初加载视图时调用。当用户从更深的视图控制器导航回视图时视图再次出现时不会调用它。委托变量应该在 viewWillAppear 中设置。
我有一个 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)
}
}
}
万一有人遇到同样的问题,那是因为我在 viewDidLoad 中设置了委托变量,它在最初加载视图时调用。当用户从更深的视图控制器导航回视图时视图再次出现时不会调用它。委托变量应该在 viewWillAppear 中设置。