如何在iOS中从详细视图访问主表的视图
我的应用程序的一部分有一个embedded式的主 – 细节部分。 每个细节视图都使用一个自定义的UIViewController
。 当我改变这些UIViewControllers里面的某个东西的值的时候,我需要能够在主UITableViewController
变成一个表格行。
我看到的最接近的解决scheme是使用NSNotificationCenter
来冒泡任何变化,虽然这感觉有点不整洁。
另一个解决scheme是使用代表? 但我还没有遇到任何示例解决scheme或教程如何在Swift
使用它?
我也尝试通过导航备份层次来访问表视图:
let navController = self.splitViewController!.viewControllers[0]; navController.tableView.reloadData()
我知道上面的例子是错误的,但我不知道如何以这种方式访问主视图,或者即使是正确的方法。
噢,我正在尝试调用reloadData()
因为在主视图中有一些逻辑检查条件,以便灰色表格行适用(我正在使用Core Data
)
我已经看到你已经认识到了这一点。 然而,更清洁和更具前途的方法是使用委托协议:
protocol DetailViewControllerDelegate: class { func reloadTableView() }
然后将一个委托属性添加到您的DetailViewController类并实现对该委托的调用:
class DetailViewController: UIViewController { weak var delegate: DetailViewControllerDelegate? .... func reloadMasterTableView() { delegate?.reloadTableView() } }
然后在你的MainViewController中实现委托方法:
extension MainViewController: DetailViewControllerDelegate { func reloadTableView() { tableView.reloadData() } }
不要忘了在创buildDetailViewController实例时将代理设置为:
let detailViewController = DetailViewController() detailViewController.delegate = self
由于我能够访问我的viewController,我能够像这样访问父视图控制器:
func reloadMasterTableView(){ let navVC: UINavigationController = self.splitViewController!.viewControllers[0] as! UINavigationController let sectionsVC : UIMasterViewController = navVC.topViewController as! UIMasterViewController sectionsVC.tableView.reloadData() }
我build议你使用NSNotificationCenter。 如果你想通过导航控制器来做到这一点,代码应该在迅速工作。
let navController: UINavigationController = self.splitViewController!.viewControllers[0] as! UINavigationController let controller: MasterViewController = navController.topViewController as! MasterViewController controller.tableView.reloadData()