如何在ios,swift中更新子控制器中的数据
Posted
技术标签:
【中文标题】如何在ios,swift中更新子控制器中的数据【英文标题】:how to update data in subcontroller in ios, swift 【发布时间】:2018-08-31 06:36:54 【问题描述】:我有viewcontroller
,它分为两个视图。一种是由tableviewcontroller
控制的视图,即viewcontroller
的childcontroller
,一种是statusview
,当我调用@987654330 时,tableviewcontrollers
didselectrowatindexpathis called. but when i can
t 在状态视图中重新加载我的数据时直接显示数据@。我可以在tableview
中重新加载我的数据,但状态视图不反映数据。
深灰色区域为状态视图,中间视图为tableview
。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
self.tableView.reloadData()
通过此代码,我可以在 tableview
中重新加载我的数据。但是当我使用父控制器(viewcontroller)的setneedsDisplay
或setneedslayout
时,它会崩溃。我该如何解决这个问题?
【问题讨论】:
你希望数据在状态栏中是什么? 如果你想用与 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中更新子控制器中的数据的主要内容,如果未能解决你的问题,请参考以下文章
每当iOS Swift中的对象发生更改时如何调用notificationCenter?
Swift 3:将数据从 TabBarController 传递到子视图控制器