【问题标题】:How to access the master's tableview from detail view in iOS如何从 iOS 中的详细视图访问 master 的 tableview
【发布时间】:2016-01-11 00:15:33
【问题描述】:

我的应用程序的一部分有一个嵌入的主从部分。每个详细视图都使用自定义UIViewController。当我更改其中一个 UIViewControllers 中某些内容的值时,我需要能够将主 UITableViewController 中的表行之一变灰。

我见过的最接近解决方案的是使用NSNotificationCenter 来冒泡任何更改,尽管这感觉有点不整洁..

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

我还尝试通过向上导航层次结构来访问表格视图:

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

   navController.tableView.reloadData()

我知道上面的示例是错误的,但我不知道如何以这种方式访问​​主视图,或者即使它是正确的方法。

哦,我想打电话给reloadData(),因为在主视图中有一些逻辑可以检查是否适用于灰色表格行的条件(我正在使用Core Data

【问题讨论】:

  • 那么问题是什么?我的意思是你面临什么问题?
  • 问题确实在标题中。当元素(例如:开关)发生更改时,如何刷新 UISplitview 的主位中的 tableview?
  • 是的,您还在正文中提到您知道如何处理它。那么您在实现上述代码时遇到了什么问题?
  • 好吧,我已经确定了 3 种可能的方法来处理它,我更喜欢使用导航属性来完成它,我只是不知道如何访问这样的父 tableViewController 即 navController.parentTableViewController .tableview.reloadata()
  • 我也不明白。你的 ViewController 是正确的,所以如果 parentTableViewController 在其中是公共的,那么应该没有任何问题。

标签: ios swift uitableview core-data


【解决方案1】:

因为我能够访问我的 viewController,所以我能够像这样访问父 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()
    

    【讨论】:

      【解决方案3】:

      我已经看到你已经弄清楚了这一点。然而,使用委托协议是一种更简洁、更面向未来的方法:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多