如果它是同一个类Swift,如何将数据传递给前一个视图控制器
Posted
技术标签:
【中文标题】如果它是同一个类Swift,如何将数据传递给前一个视图控制器【英文标题】:How to pass data to the previous view controller if it is the same class Swift 【发布时间】:2020-09-10 12:24:16 【问题描述】:我有一个表格视图控制器,当我单击 navigationBarItem 中的按钮时,我打开了相同的视图控制器,但设置略有不同,具体取决于标志。通过关闭此视图控制器,我想将值传递给前一个并用新数据重新加载其数据,我该怎么做?委托在这里无济于事,因为它是同一个类。
class LibraryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
...
var isContentFromPlaylist: Bool = false
...
//I open the same VC
@IBAction func addTracksButtonPressed(_ sender: Any)
let storyboard = UIStoryboard(name: "LibraryViewController", bundle: nil)
let vc = storyboard.instantiateViewController(identifier: "Library") as! LibraryViewController
...
navigationController?.showDetailViewController(vc, sender: nil)
...
@objc private func doneButtonPressed()
...
//Here I want to change value isContentFromPlaylist to true in previous VC when this VC will close
dismiss(animated: true, completion: nil)
【问题讨论】:
委托会起作用,因为你有两个不同的对象,即使它们来自同一个类。通常情况下,只是更改显示而不是显示同一控制器的副本,但这并没有错。 【参考方案1】:您可以使用这种方法。向类添加属性
class LibraryViewController
//...
var creator: LibraryViewController?
//...
然后,在控制器实例化后设置该属性...
@IBAction func addTracksButtonPressed(_ sender: Any)
let storyboard = UIStoryboard(name: "LibraryViewController", bundle: nil)
let vc = storyboard.instantiateViewController(identifier: "Library") as! LibraryViewController
//...
vc.creator = self // Here it is
//...
navigationController?.showDetailViewController(vc, sender: nil)
并以您喜欢的方式使用它:
@objc private func doneButtonPressed()
...
//Here I want to change value isContentFromPlaylist to true in previous VC when this VC will close
creator?.isContentFromPlaylist = .........
dismiss(animated: true, completion: nil)
附:要重新加载数据,请使用 UI 线程:
DispatchQueue.main.async
creator?.tableView.reloadData()
【讨论】:
很好!它工作,我能够传输数据。据我了解,这是委托的简化版本?但是问题的第二部分呢?单击 doneButton 时如何更新上一个窗口中的 tableView?我仍然可以看到带有旧数据的 tableView。我尝试使用creator?.tableView.reloadData(),但是不行。 @VyacheslavBakinkskiy 不应该这样。更新了我的答案。 您可以使用协议和委托重新加载您的 tableView。 @Roman Ryzhiy 对不起,但它不起作用,当我关闭第二个窗口 (VC) 时,我看不到 viewDidLoad 或 viewWillAppear 方法在第一个窗口 (VC) 中是如何工作的。它似乎冻结了相同的数据,并且更新 tableView 什么都不做。在 viewWillAppear 方法中,我必须从 UsersDefaults 中获取新数据,我通过单击第二个窗口 (VC) 中的“完成”按钮保存了这些数据。如何强制整个第一个窗口 (VC) 重新启动? @VyacheslavBakinkskiyreloadData()
与 viewDidLoad 等无关。创作者中的reloadData()
是否火了?以上是关于如果它是同一个类Swift,如何将数据传递给前一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
Swift segue 不会将数据传递给旧的 ViewController