当你在firstVC时如何在secondVC中运行一个函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当你在firstVC时如何在secondVC中运行一个函数?相关的知识,希望对你有一定的参考价值。

虽然我非常确定这个问题的简单解决方案,但问题在于第二个VC与第一个VC没有任何区别或形式。第二个VC就是你点击tableViewCell时得到的。您点击的单元格(使用indexPath)我将一些数据发送到secondVC,然后您可以在secondVC中编辑该任务,甚至为其设置通知提醒。

在第二个VC中,我正在运行一些代码,这些代码在用户为该特定任务设置的时间触发计时器。返回的计时器调用一个选择器方法,该方法更新标签并将其更改为“Time's Up”。

当这个标签是“Time Up”时,我将firstVC中tableviewcell中的bellicon设置为白色或从特定任务中移除bellicon。

即使我不在第二个VC中,我也想要运行这些代码。 (我在viewDidAppear中运行此代码)。如果我把这段代码放在一个函数中,然后在我进入firstVC时调用它,代码就不知道它应该选择哪个时间。

override func viewWillAppear(_ animated: Bool) {
adjustTextViewHeight()
edittaskview.becomeFirstResponder()
cardremindery?.constant = -999

guard let selectedDate = editnotes?.sSelectedDate,
    var needsToRemind = editnotes?.sReminderState  else {
        print("No date selected")
        return
}
if (needsToRemind) {
    self.timesUpTimer = Timer(fireAt: selectedDate, interval: 0, target: self, selector: #selector(updateTimeLabel), userInfo: nil, repeats: false)
    RunLoop.main.add(timesUpTimer!, forMode: RunLoopMode.commonModes)
}


}

更新belliconcolor的选择器代码:

@objc func updateTimeLabel()
{
  editnotes?.sReminderDate = "Time's up"
  editnotes?.belliconcolor = .white
  reminderMsg.text = editnotes?.sReminderDate
  print("Time is up ok")
}

当你在第二个VC时,上面的代码工作。即使我在第一个VC,我希望这个工作。由于我使用的是FetchedResultsController,我很确定如果数据被更改,tableView将会更新,因为belliconcolor是我在coreData中保存的元素,所以更新它会更新tableview。

问题是:如何从firstVC为tableview的所有元素运行这段代码? bellicon出现在您在secondVC中设置提醒的那些任务旁边。您可以通过点击tableview中的相关单元格来访问secondVC:enter image description here

您在此secondVC中设置提醒。如果时间到了,那么截止日期下面的标签会变为'Time's Up',并且特定任务的belliconcolor会更改为.white

enter image description here

时间到! - >这段代码已被删除,这个特殊任务的belliconcolor是.white。当我去第一个VC时,这将是显而易见的。即使我在firstVC中,我也希望这段代码能够运行,以便自动更新tableview。 enter image description here

答案

通常,有两种方法:

  1. 使用NotificationCenter。
  2. 使用委托模式。

他们俩都可以工作。如何选择将是一个正确的问题。回答this可能会有所帮助。

通常,如果我想在2个对象之间只有1个连接,我通常会使用Delegate。如果要在应用程序中通知许多对象,请使用NotificationCenter。

希望能帮助到你。如果有什么不清楚,请告诉我,我会尽力解释。

更新:

再次阅读并且如果您离开该屏幕,则来自SecondVC的通知/代表将不起作用。离开屏幕将取消你在那里的一切。因此,您需要一些单独的类,它将始终保存在内存中。所以。从SecondVC中,您将计时器设置为单例,然后单例将单击通知/代理到FirstVC(或您可能需要的任何其他地方)。

另一答案

我在这里找到了关于stackoverflow的一个很好的讨论,它提出并解释了你遇到的问题类型的许多解决方案,Passing Data between View Controllers

以上是关于当你在firstVC时如何在secondVC中运行一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 FirstVC 中选择单元格后,如何为 SecondVC 中的每个单元格调用按钮操作?

无法使用 segue 将值从 FirstVC 传递到 SecondVC

如何在 ViewController 之间传递委托

一次显示 2 个视图控制器,带有一个动画

Swift 4,加载下一个 ViewController

如何将两个视图控制器显示为模态但仅对第二个进行动画转换?