【问题标题】:How to pass data to the previous view controller if it is the same class Swift如果它是同一个类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)
    }
}

【问题讨论】:

  • 委托会起作用,因为你有两个不同的对象,即使它们来自同一个类。通常情况下,只是更改显示而不是显示同一控制器的副本,但这并没有错。

标签: swift uitableview uiviewcontroller


【解决方案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() 是否火了?
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多