我编写了UIBarButtonItem,以便在切换到上一个视图之前执行某些操作。我想知道如何从我的UIBarButtonItem获取转换场景的viewcontroller?那么,场景1 - >场景2(当前场景) - >场景1(点击UIBarButtonItem按钮后)
我试图将之前的场景变量(我需要)传递给当前场景以执行操作(感觉我不认为过渡场景是实例化新视图,但这不起作用
override func viewDidLoad() {
super.viewDidLoad()
loadTuple()
let addButton: UIBarButtonItem = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveExercise(_: )))
self.navigationItem.setRightBarButton(addButton, animated: true)
}
@objc func saveExercise(_ sender: UIBarButtonItem) {
self.addNewTupleToDB(element: self.getNewTuple())
self.saveData()
debugPrint("saveExercise")
self.exerciseVCTableView?.reloadData() // tried to pass the table view from the previous scene to call here
self.navigationController?.popViewController(animated: true)
// Want to save reload the table data of the scene this button transitions to
}```
您可以使用委托模式来解决此问题。委托模式是将某些工作委托给其他人并在委托完成后返回工作的东西。
假设ViewController1
有UIBarButton,去ViewController2
,完成一些功能并返回ViewController1
让我们采取一个协议
protocol MyProtocol {
func myFunction()
}
然后在ViewController2
中添加一个委托方法。假设在ViewController2
,你必须调用一个方法doMyWork
,一些工作将在这里完成,然后你必须弹出。
class ViewController2 {
var delegate : MyProtocol?
override func viewDidLoad() {
super.viewDidLoad()
doMyWork()
}
func doMyWork() {
// my works
delegate?.myFunction()
self.navigationController.popViewController()
}
}
现在viewController1必须接收委托工作已完成。
在viewController1
中,在barButtonItem中
class ViewController1 {
@objc func barButton(_sender : UIBarButton) {
let viewController = ViewController2()
viewController.delegate = self
self.naviagtionController.pushViewController(viewController, animated : true)
}
}
现在你必须实现协议方法
extension ViewController1 : MyProtocol {
func myFunction() {
self.tableView.reloadData()
}
}