如果它是同一个类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) 重新启动? @VyacheslavBakinkskiy reloadData() 与 viewDidLoad 等无关。创作者中的reloadData() 是否火了?

以上是关于如果它是同一个类Swift,如何将数据传递给前一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Swift:将数据传递给 segue

Swift segue 不会将数据传递给旧的 ViewController

将数据传递给不是前一个 VC 的 VC

SwiftUI 如何将数据传递给 ObservedObject 函数

如何快速将数据传递给其他 UIViewcontroller

如何将数据传递给嵌套控制器(UIContainerView)?