как обновить данные в субконтроллере в ios, swift - PullRequest
0 голосов
/ 31 августа 2018

У меня есть viewcontroller, и он разделен на два вида. один - это представление, которое обрабатывается tableviewcontroller, то есть childcontroller из viewcontroller, а другое - statusview, которое показывает данные напрямую, когда tableviewcontroller s didselectrowatindexpath is called. but when i can t перезагружает мои данные в statusview, когда я звонил didselectrowatindexpath. я могу перенести свои данные в tableview, но просмотр состояния не отражает данные. enter image description here

темно-серая область - статусная, а средняя - tableview.

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

по этому коду я могу перезагрузить свои данные в tableview. но когда я использую setneedsDisplay или setneedslayout parentController (viewcontroller), происходит сбой. как я могу решить эту проблему?

1 Ответ

0 голосов
/ 31 августа 2018

В этом случае вам понадобится один из следующих двух вариантов:

  1. Создайте протокол, который будет реализован вашим основным UIViewController, чтобы UITableViewController мог передавать данные через делегат своему родительскому контроллеру представления
  2. Опубликуйте UINotification в UITableViewController и получите это уведомление в виде строки состояния и отобразите данные.

Давайте рассмотрим оба варианта:

Определите протокол, в этом примере я отправляю только 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)
    }
}
...