2015-10-13 67 views
0

我的应用程序的一部分具有嵌入式主 - 细节部分。每个详细视图都使用自定义UIViewController。当我更改其中一个UIViewControllers内的某个东西的值时,我需要能够灰化主UITableViewController中的一个表行。如何从iOS中的详细视图访问主人的桌面视图

最近我看到一个解决方案是使用NSNotificationCenter冒泡任何改变,尽管这感觉有点凌乱..

另一种解决方案是使用委托?但我还没有遇到任何示例解决方案或教程在如何使用Swift

我也尝试只是想通过浏览备份层次访问表视图:

let navController = self.splitViewController!.viewControllers[0]; 

    navController.tableView.reloadData() 

我知道上面的例子是错误的,但我不知道如何访问母版视图这样,或者即使这是正确的方法。

噢,我试图调用reloadData()因为在主视图有一些逻辑,其检查的条件,以还判定是否为灰色出一个表行是适用(我使用Core Data

+0

那么问题是什么?我的意思是你面临什么问题? – Imran

+0

问题是真的在标题中。当一个元素(例如:一个开关)发生变化时,如何刷新UISplitview的主位中的tableview? – dyatesupnorth

+0

是的,你也在体内提到你知道如何处理它。那么当你实现上面提到的代码时,你遇到了什么问题? – Imran

回答

2

由于我能够进入我的viewController,我能够访问父视图 - 控制像这样:

func reloadMasterTableView(){ 
     let navVC: UINavigationController = self.splitViewController!.viewControllers[0] as! UINavigationController 


     let sectionsVC : UIMasterViewController = navVC.topViewController as! UIMasterViewController 
     sectionsVC.tableView.reloadData() 

    } 
2

我会建议你使用NSNotificationCenter。 如果你想通过导航控制器来做到这一点,代码应该适合你在迅速。

let navController: UINavigationController = self.splitViewController!.viewControllers[0] as! UINavigationController 

let controller: MasterViewController = navController.topViewController as! MasterViewController 
controller.tableView.reloadData() 
4

我已经看到你已经认识到这一点了。然而一个更清洁,更面向未来的方式是使用一个委托协议:

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() 
    } 
} 

不要忘记,当您创建它们设置委托您DetailViewController实例:

let detailViewController = DetailViewController() 
detailViewController.delegate = self 
相关问题