-1

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

 dismiss(animated: true, completion: nil)

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

4

5 回答 5

2

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

第 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)。

于 2020-05-25T04:15:06.867 回答
1

您可以在第一个视图控制器中使用 viewWillappear 函数来刷新或仅使用完成处理程序作为下一步:

1)在第二个控制器中添加这个变量。

var completion: (() -> Void)?

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

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

3)在此处进行刷新是您在调用解除函数之前需要在第二个控制器中执行的最后一步。

if let completion = completion{
  completion()
}
于 2020-05-25T07:22:27.440 回答
0

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

override func viewWillAppear(_ animated: Bool) {
        tableview.reloadData() 
}
于 2020-05-25T04:07:48.140 回答
0

你可以做 的或loadDatarefreshData像这样:viewWillAppearFirstViewController

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

    refresData()
}

viewWillAppearFirstViewController在您调用从 解雇后立即被调用SecondViewController

于 2020-05-25T04:07:58.750 回答
0

您可以在第二个视图控制器中为第一个控制器使用委托,并在调用解除之前调用它。如果你想在dismiss之后运行,那么你可以在dismiss函数完成后调用它。

于 2020-05-25T04:10:55.553 回答