繁体   English   中英

Swift:关闭 ViewController2 后从 ViewController1 调用方法

[英]Swift: Call a method from ViewController1 after dismissing ViewController2

我目前正在构建一个家庭作业跟踪应用程序,您可以在其中在 TableView 中添加课程。 在一个 ViewController 中,我有一个已经存在的课程列表。 我还有一个按钮,允许用户添加新课程。 当他们单击按钮时,应用程序会触发模态搜索到新的 ViewController,他们可以在其中填写表单以添加新课程。 但是,当他们完成并单击将当前 ViewController 关闭到 go 的按钮返回课程列表时,我找不到使用用户刚刚添加的课程更新课程列表的方法。 我知道如果使用 segue,您可以使用 prepare 方法。 不过我打电话

 dismiss(animated: true, completion: nil)

我要调用以重新加载表的方法位于第一个 ViewController 中。 有没有办法在第二个 ViewController 关闭之前或之后调用第一个 ViewController 中的 load 方法?

根据您的要求,一个简单的“委托”将起作用。

第 1 步:定义协议。

protocol ViewController2Delegate: class {
func refresh()
}

Step2:在 ViewController2 创建一个委托

weak var delegation: ViewController2Delegate?

步骤 3:当您使用按钮中的“segue”从 ViewController1 创建 ViewController2 时,使用 ViewController1 中的prepareForSegue方法并设置 ViewController1 符合委托。 ViewController1 将符合委托并重新加载表。

第4步:在ViewController2中,点击doneButton,根据您的要求调用delegate?.refresh() (在关闭viewcontroller2之前/关闭viewcontroller2之后-使用dismiss()方法的completionBlock)。

您可以在第一个视图 controller 中使用 viewWillappear function 来刷新或仅使用完成处理程序如下:

1) 在第二个 controller 添加这个变量。

var completion: (() -> Void)?

2) 在第一个 controller 显示第二个 controller 之前,您需要添加此代码。

let controller = secondController()
controller.completion = {
  // here you can refresh your first controller
}

3)在此处进行刷新是您在调用驳回 function 之前需要在第二个 controller 中执行的最后一步。

if let completion = completion{
  completion()
}

您可以在 ViewController1 上的 viewWillAppear 中调用 reloadData

override func viewWillAppear(_ animated: Bool) {
        tableview.reloadData() 
}

您可以在FirstViewControllerviewWillAppear上执行loadDatarefreshData ,如下所示:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    refresData()
}

FirstViewControllerviewWillAppear将在您调用以从SecondViewController中关闭后立即调用。

您可以在第二个视图 controller 中为第一个 controller 使用委托,并在调用解雇之前调用它。 如果要在dismiss后运行,那么可以在dismiss完成后调用它function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM