如何在ios,swift中更新子控制器中的数据

Posted

技术标签:

【中文标题】如何在ios,swift中更新子控制器中的数据【英文标题】:how to update data in subcontroller in ios, swift 【发布时间】:2018-08-31 06:36:54 【问题描述】:

我有viewcontroller,它分为两个视图。一种是由tableviewcontroller 控制的视图,即viewcontrollerchildcontroller,一种是statusview,当我调用@987654330 时,tableviewcontrollersdidselectrowatindexpathis called. but when i cant 在状态视图中重新加载我的数据时直接显示数据@。我可以在tableview 中重新加载我的数据,但状态视图不反映数据。

深灰色区域为状态视图,中间视图为tableview

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
      self.tableView.reloadData()

通过此代码,我可以在 tableview 中重新加载我的数据。但是当我使用父控制器(viewcontroller)的setneedsDisplaysetneedslayout 时,它会崩溃。我该如何解决这个问题?

【问题讨论】:

你希望数据在状态栏中是什么? 如果你想用与 tableview 的选定行相关的一些数据来更新statusView,你可以通过(self.parent as? ParentViewController)?.statusView 访问statusView 并在tableViewDidSelectRowAtIndexPath 中更新它。跨度> 我想在状态视图的每个单元格中显示数字!! hardik parmar 嘿!它确实有效,但 statusView 没有改变 【参考方案1】:

在这种情况下,您将需要以下两个选项之一:

    创建一个您的主 UIViewController 将实现的协议,以便 UITableViewController 可以通过委托将数据传递到其父视图控制器 在UITableViewController 中发布 UINotification 并在您的状态栏视图中接收此通知并显示数据。

让我们探索这两个选项:

定义一个协议,在这个例子中我只发送一个被点击的单元格的String

@objc protocol YourDataProtocol 
    func didSelectCell(withString string: String)

接下来将委托属性添加到您的UITableViewController

class YourTableViewController: UIViewController 
    weak var delegate: YourDataProtocol?
...

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let cell = tableView.cellForRow(at: indexPath)
        //call the delegate method with your text - in this case just text from textLabel
        if let text = cell?.textLabel?.text 
            delegate?.didSelectCell(withString: text)
        
        

让您的UIViewContoller 成为UITableViewController 子类的代表:

class YourViewController: UIViewController, YourDataProtocol 
    ...
    let yourTableVC = YourTableViewController(...
    yourTableVC.delegate = self 

    func didSelectCell(withString string: String) 
        statusBar.text = string//update the status bar
    

第二个选项是使用NotificationCenter

在您的UITableViewController 中发布通知

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let cell = tableView.cellForRow(at: indexPath)

    if let text = cell?.textLabel?.text 
        let notificatioName = Notification.Name("DataFromTableViewCell")
        NotificationCenter.default.post(name: notificatioName, object: nil, userInfo: ["YourData": text])
    

在状态栏中您开始收听此通知

NotificationCenter.default.addObserver(self, selector: #selector(didReceiveData(_:)), name: notificatioName, object: nil)

@objc func didReceiveData(_ notification: Notification) 
    if let userData = notification.userInfo, let stringFromCell = userData["YourData"] 
        print(stringFromCell)
    

【讨论】:

以上是关于如何在ios,swift中更新子控制器中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为 iOS 创建 SDK?

每当iOS Swift中的对象发生更改时如何调用notificationCenter?

Swift 3:将数据从 TabBarController 传递到子视图控制器

Swift如何更新先前视图控制器中的标签

如何将数据传递到 UIView 侧的嵌入式 UIViewController - Swift 5

如何在 Swift 中的视图控制器之间传递数据?