Swift 如果是同一类,如何将数据传递到上一个视图控制器

Swift 如果是同一类,如何将数据传递到上一个视图控制器,swift,uitableview,uiviewcontroller,Swift,Uitableview,Uiviewcontroller,我有一个表视图控制器,当我单击navigationBarItem中的一个按钮时,我打开了同一个视图控制器,但根据标志的不同设置略有不同。通过关闭此视图控制器,我希望将该值传递给上一个视图控制器,并用新数据重新加载其数据,我如何才能做到这一点?委派在这里没有帮助,因为它是同一个类 class LibraryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ... var isContentF

我有一个表视图控制器,当我单击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)
    }
}

您可以使用这种方法。向类中添加属性

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()
}

委派将起作用,因为您有两个不同的对象,即使它们来自同一个类。通常情况下,只需更改显示,而不显示同一控制器的副本,但这并没有错。很好!它成功了,我能够传输数据。据我所知,这是授权的简化版本?但是问题的第二部分呢?单击“完成”按钮时,如何在上一个窗口中更新tableView?我仍然可以看到包含旧数据的tableView。我尝试使用creator?.tableView.reloadData(),但它不起作用。@vyacheslavbakinkski不应该这样。更新了我的答案。您可以使用协议和委派重新加载tableView。@Roman Ryzhiy抱歉,但它不起作用,当我关闭第二个窗口(VC)时,我看不到viewDidLoad或ViewWillDisplay方法在第一个窗口(VC)中如何工作。它似乎冻结了相同的数据,更新tableView没有任何作用。在viewWillExample方法中,我必须从UsersDefaults获取新数据,我通过单击第二个窗口(VC)中的Done按钮保存这些数据。如何强制整个第一个窗口(VC)重新启动?@VyacheslavBakinkskiy
reloadData()
与viewDidLoad等无关。creator中的
reloadData()