从 AppDelegate Swift 4 更新 tableView 行

Posted

技术标签:

【中文标题】从 AppDelegate Swift 4 更新 tableView 行【英文标题】:Update tableView row from AppDelegate Swift 4 【发布时间】:2018-11-02 13:21:33 【问题描述】:

[![在此处输入图片描述][1]][1]

你好。我有一个如上图所示的表格视图,并且我收到了一些无声推送通知。根据它们,我需要从tableView 重新加载特定单元格。由于我在AppDelegate 中获得了notification 并且目前我正在重新加载整个tableView...但我个人认为这不是最好的解决方案,因为我只需要更新一个特定的行。

任何提示请我如何从 appDelegate 更新一个特定的单元格?

if userInfo["notification_type"] as? String == "update_conversation" 
            if let rootVC = (self.window?.rootViewController as? UINavigationController)?.visibleViewController 
                if rootVC is VoiceViewController 
                    let chatRoom = rootVC as! VoiceViewController
                    chatRoom.getConversations()
               // the get Conversations method makes a call to api to get some data then  I reload the whole tableView
                
            


    func getConversations() 
    let reachabilityManager = NetworkReachabilityManager()
    if (reachabilityManager?.isReachable)! 
        ServerConnection.getAllConversation  (data) in
            if let _ = data
                self.conversations = data
                self.onlineRecent = self.conversations
                GlobalMainQueue.async 
                    self.mainTableView.reloadData()
                
            
        
    

这是我的getConversation 方法,在VoiceViewController 中用于填充我的tableview

【问题讨论】:

如果没有看到minimal reproducible example 形式的所有相关代码,很难给出准确的答案。但是,您绝对应该更新 VoiceViewControllergetConversations 方法,使其仅更新修改的行而不是整个表。 我会使用 AppDelegate 发出的通知来告诉 VoiceViewController,它是否“可见”并正在监听更新内容。 我已经更新了我的问题。问题是目前这工作正常..但我认为这不是最好的方法,因为如果我收到一个静默的通知,我只需要更新特定单元格的 UI 你的应用代理不应该有任何视图控制器的知识。 【参考方案1】:

让应用委托广播特定于应用的通知中心通知(在主线程上)。让包含您的表格视图的视图控制器侦听该通知并根据需要更新有问题的单元格。这样您就不会污染您的应用程序委托。应用程序委托应该只处理系统级应用程序的东西,而不是业务逻辑。

【讨论】:

【参考方案2】:

您可以使用self.mainTableView.cellForRow(at:IndexPath(…) 获取您所在行的单元格,然后直接更新它。

或者,我发现您可以节省大量时间并且使用 ALTableViewHelper [商业 - 可在 Framework Central here] 上使用,您的视图控制器最终会更加可靠。可以免费试用。 帮助器完成了大部分工作——您描述了数据如何连接到 UITableView。我已经整理了一个示例(在 GitHub here 上),我希望它与您正在尝试做的一样。

import ALTableViewHelper
class VoiceViewController 
    // @objc for the helper to see the var’s, and dynamic so it sees any changes to them
    @obj dynamic var conversations: Any?
    @obj dynamic var onlineRequest: Any?

    func viewDidLoad() 
        super.viewDidLoad()
        tableView.setHelperString(“””
        section
            headertext "Conversation Status"
            body
                Conversation
                    $.viewWithTag(1).text <~ conversations[conversations.count-1]["title"]
                    $.viewWithTag(2).text <~ "At \\(dateFormat.stringFromDate(conversations[conversations.count-1]["update"]))"
                UpdateButton
                    $.viewWithTag(1).isAnimating <~ FakeConversationGetter.singleton.busy
        “””, context:self)
    

    func getConversations() 
        let reachabilityManager = NetworkReachabilityManager()
        if (reachabilityManager?.isReachable)! 
            ServerConnection.getAllConversation  (data) in
            if let _ = data 
                // change the data on the main thread as this causes the UI changes
                GlobalMainQueue.async 
                    self.conversations = data
                    self.onlineRequest = self.conversations
                
            
        
    

【讨论】:

如何在收到通知时仅更新一行?你的样本没有做这些。 在“setHelperString()”内部的键值观察被设置为监视数据的变化。这样做是为了使数据更新导致 UI 发生变化,如帮助器字符串中所述。在这种情况下,对话数组的最后一个元素用于设置标签的文本,因此对对话数组的更改将导致该标签的文本(仅)更新。它与普通的 ios 方法有点不同——一旦你描述了“将这个 UI 连接到那个数据”,这几乎是你所有的视图控制器都完成了——看看 GitHub 上的示例。 是的,我投了反对票,因为我认为它不能直接回答这个问题。它需要大量的 3rd 方库(包括您自己的商业库)才能工作。此外,您在 GitHub 上的示例不能“开箱即用”编译。 非常感谢您的反馈。我会尽量让我未来的答案更加关注这个问题。此外,我发现关于 GitHub 项目的小反馈非常有用 - 它告诉我,我至少需要自述文件中的需求部分,并且理想情况下,该项目需要引导用户下载 Framework Central,而不是简单地失败。我会去那些......

以上是关于从 AppDelegate Swift 4 更新 tableView 行的主要内容,如果未能解决你的问题,请参考以下文章

从 appdelegate 更新视图控制器 - 最佳实践?

Swift:从 AppDelegate 中的 UNTextInputNotificationAction 获取内容

Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?

从 appdelegate swift 访问 UIwebview

Swift:如何通过快速操作从 AppDelegate 访问某个 TabBar 选项卡?

Swift - 从viewController访问AppDelegate窗口