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

时间:2018-02-27 18:00:49

标签: ios swift function uitableview uiviewcontroller

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

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

当此标签为“Time is 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中设置提醒。如果时间已到,则截止日期下方的标签将更改为“时间已启动”,并且特定任务的belliconcolor将更改为.white

enter image description here

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

2 个答案:

答案 0 :(得分:1)

通常,有两种方法:

  1. 使用NotificationCenter。
  2. 使用委托模式。
  3. 他们两个都可以工作。如何选择将是一个正确的问题。回答this可能会有所帮助。

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

    希望它有所帮助。如果有事情不清楚,请告诉我,我会尝试解释。

    更新:

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

答案 1 :(得分:0)

我在stackoverflow上找到了一个很好的讨论,它提供了许多解决方案,并解释了你所拥有的问题,Passing Data between View Controllers