【问题标题】:How to run a function in a secondVC when you are in firstVC?当您在 firstVC 中时,如何在 secondVC 中运行函数?
【发布时间】:2018-02-27 18:00:48
【问题描述】:

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

在 secondVC 中,我正在运行一些代码,该代码会在用户为该特定任务设置的时间触发计时器。作为回报,计时器调用选择器方法更新标签并将其更改为“时间到了”。

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

即使我不在 secondVC 中,我也希望这段代码能够运行。 (我在 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")
}

当您在 secondVC 中时,上述代码有效。即使我在 firstVC 中,我也希望它能够工作。由于我使用的是 FetchedResultsController,因此我很确定如果数据发生更改,tableView 将被更新,并且由于 belliconcolor 是我保存在 coreData 中的一个元素,因此更改它将更新 tableview。

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

你在这个 secondVC 中设置了提醒。如果时间到了,则到期日期下方的标签更改为“时间到了”,特定任务的 belliconcolor 更改为 .white

时间到了! -> 这段代码已经被执行,这个特定任务的 belliconcolor 是 .white。当我去 firstVC 时,这一点会很明显。即使我在 firstVC 中,我也希望此代码能够运行,以便自动更新 tableview。

【问题讨论】:

  • 我不清楚您的整体设计是什么,但您可以将计时器代码移到单独的对象中。它可以在需要更新时通知视图。
  • 你能详细说明一下吗?
  • 委托模式呢?您可以将 firstVC 设为 secondVC 的委托,并从 secondVC 调用委托方法。你可以在网上找到很多关于 Delegate 主题的文章。

标签: ios swift function uitableview uiviewcontroller


【解决方案1】:

通常有两种方法:

  1. 使用通知中心。
  2. 使用委托模式。

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

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

希望对您有所帮助。如果有什么不清楚的地方请告诉我,我会尽力解释。

更新:

再读一遍,是的,如果您离开该屏幕,来自 SecondVC 的通知/委托将不起作用。离开屏幕将取消你在那里的一切。因此,您需要一些,例如,将一直保存在内存中的单例类。所以。从 SecondVC 中,您将计时器设置为单例,稍后单例会将通知/委托触发到 FirstVC(或您可能需要的任何其他地方)。

【讨论】:

  • 谢谢! 1. 例如,如果我使用 NotificationCenter。我将如何实施它?问题是帖子中提到的功能仅在您加载了 secondVC 时才有效,因此 coreData 不会更新。为了让我在更新 secondVC 标签/coreData 时向 firstVC 发送通知,即使用户在 firstVC 中,我也需要在 secondVC 中运行该函数。 2. 当tableView中涉及多个元素时,我将如何实现这一点。一些示例代码可以在这里帮助我。谢谢!
  • 刚刚检查了更新的答案。问题是我在某种程度上节省了 coreData 中的时间,我可以从任何地方访问它。如何实现单例?我没有太多经验。对不起!
  • 抱歉,现在是另一个问题了。你可以很容易地谷歌它。我们无法回答 1 个问题中的所有问题 :))) 尝试用谷歌搜索它很容易
【解决方案2】:

我在这里找到了关于 stackoverflow 的精彩讨论,该讨论针对您遇到的问题类型提供并解释了许多解决方案,Passing Data between View Controllers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2020-11-12
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多