【问题标题】:How to update a UITableViewCell in firstVC when a change occurs in secondVC automatically and in realtime当 secondVC 中发生更改时,如何自动实时更新 firstVC 中的 UITableViewCell
【发布时间】:2018-02-23 19:46:25
【问题描述】:

我有一个 editviewcontroller(secondVC)(您可以通过点击 uitableviewcell 任务访问它),您可以在其中选择设置提醒。当您设置提醒时;在 firstVC 的 UITableViewCell 中的任务前面会出现一个图标。现在我希望一旦触发提醒并发送通知,任务中的图标就会被实时删除。目前,我设置它的方式;如果您在提醒任务后访问editVC,我会将当前时间与用户设置的时间进行比较,然后更新一个标有“时间到了”的标签。

我希望在 firstVC 中的相应单元格上发生类似的事情。

FIRSTVC

时间到了,它会告诉你时间到了,当你回到第一个VC时,铃铛图标会被移除。但我希望它实时发生,即使您在 firstVC 中并且您不必去 secondVC 然后返回 firstVC 来获取更改。

简而言之,我希望在向用户提醒在 secondVC 中设置的任务时删除铃铛图标。谢谢!

EditVC:

代码: 以下代码在 viewDidLoad 中的 editVC 中执行。如果当前时间超过所选时间,它会将标签更改为“时间到了”,并将该特定提醒的 bellicon tintcolor 更改为白色。

      guard let selectedDate = editnotes?.sSelectedDate,
        var needsToRemind = editnotes?.sReminderState else {

            print("nil")
            return
    }

    if selectedDate <= Date() && needsToRemind {
        editnotes?.sReminderDate = "Time's up"
        editnotes?.belliconcolor = .white
        reminderMsg.text = editnotes?.sReminderDate

    }

【问题讨论】:

  • 请展示移除铃铛的代码以及它现在的调用方式。
  • @PhillipMills 用代码更新了帖子。看看吧。

标签: ios swift function uitableview unusernotificationcenter


【解决方案1】:

您可以用来触发发布通知。发布通知用于执行操作而无需转到特定的 VC。

【讨论】:

  • 你能详细说明一下吗?如何在 firstVC 中实现这个?
【解决方案2】:

您知道帖子通知或通知中心吗?如果是,那么很容易在您的代码中实现,否则您需要对其进行一些研发。首先,在第一个 vc 上注册发布通知,然后在 secondvc 上触发这个在第一个 vc 上注册的通知。这很简单。如果你不能得到它,那么我会发送一些代码以便轻松得到它。

【讨论】:

  • 我明白了这背后的想法。唯一的问题是我将如何知道必须编辑 tableview 的哪一行?有什么方法可以在特定时间触发此通知(sSelectedDate?)
【解决方案3】:

您可以在计时器停止时开火。还有一件更重要的事情,当你触发通知时,你必须通过当前的停止时间。因为这个时候用的第一个vc方法就是register。在这种方法中,您可以比较您的提醒时间和通知传递的当前时间,如果两者相同,则可以隐藏铃铛,否则不。还有一件事,请在重新加载表后管理数组以准确代码。

【讨论】:

    【解决方案4】:

    我可以立即看到您的代码的一个问题是您只会在编辑 VC 的 viewDidLoad 中说“时间到了”。如果时间在viewDidLoad 之后几秒钟(甚至一秒钟)会发生什么?

    如果这是我的代码,我将在 BOTH editVC 和父(或第一个)视图控制器上拥有一个 Timer 属性。它看起来像这样:

    var timesUpTimer : Timer?
    

    你可以在viewWillAppear中设置:

    if let selectedDate = editnotes?.sSelectedDate
    {
        self.timesUpTimer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(doSomething), userInfo: nil, repeats: false)
        RunLoop.main.add(timesUpTimer, forMode: RunLoopMode.commonModes)
    }
    
    // in the editVC you can have this:
    func doSomething()
    {
        editnotes?.sReminderDate = "Time's up"
        editnotes?.belliconcolor = .white
        reminderMsg.text = editnotes?.sReminderDate
    }
    

    你会在doSomething中做你在firstVC中的适当的事情。

    另外,在viewWillDisappear 中,对于每个视图控制器,您需要使 Timer 属性无效并将其设置为 nil。

    【讨论】:

    • 谢谢,我会试试这个代码。对于 firstVC,我如何确定哪个 tableviewcell 任务提醒已完成并触发?这就是我遇到问题的地方?
    • 我没有看到你的 firstVC 中的任何代码,所以我不得不一般性地建议:听起来你的 firstVC 中的每个 tableviewcell 都有一个日期。您可以根据需要创建任意数量的计时器(您甚至可以将它们放在一个数组中,例如“var timerArray : [Timer]”)。然后,您只需要弄清楚当计时器触发时需要更新哪一行。
    • 是的,那些设置了提醒的人有提醒日期。所以我可以设置一个在reminderDate 触发的计时器,然后从特定行中删除bellicon?对吗?
    • 嘿,只是需要一些帮助来弄清楚这个逻辑。第一个视图控制器有一个 tableview,我只是不知道如何用它实现计时器。如何跟踪用于触发更新相应单元格的计时器的日期/时间?我有带有 NSFetchedresultscontroller 的简单 TableVC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多