gpt4 book ai didi

ios - 如何在ios、swift中更新子 Controller 中的数据

转载 作者:行者123 更新时间:2023-11-30 11:11:52 25 4
gpt4 key购买 nike

我有viewcontroller它被分成了两种观点。一种是tableviewcontroller控制的 View 这是 childcontrollerviewcontroller ,其中之一是statusview即tableviewcontroller s 时直接显示数据didselectrowatindexpath is called. but when i can当我调用 didselectrowatindexpath 时,不会在状态 View 中重新加载我的数据。我可以在 tableview 中重新加载我的数据但状态 View 不反射(reflect)数据。 enter image description here

深灰色区域是状态 View ,中间 View 是 tableview .

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

通过此代码,我可以在 tableview 中重新加载我的数据。但是当我使用setneedsDisplay时或setneedslayout ParentController(viewcontroller) 的它崩溃了。我该如何解决这个问题?

最佳答案

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

  1. 创建一个主 UIViewController 将实现的协议(protocol),以便 UITableViewController 可以通过委托(delegate)将数据传递到其父 View Controller
  2. UITableViewController 中发布 UINotification,并在状态栏 View 中接收此通知并显示数据。

让我们探索这两个选项:

定义一个协议(protocol),在本例中我只发送被点击的单元格的String:

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

接下来将委托(delegate)属性添加到您的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 子类的委托(delegate):

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 - 如何在ios、swift中更新子 Controller 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52109782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com