从AppDelegate Swift 4

时间:2018-11-02 13:21:33

标签: ios swift uitableview push-notification appdelegate

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

你好我具有如上图所示的表格视图,并且收到一些静默的推送通知。根据它们的不同,我需要从tableView重新加载特定的单元格。由于我在notification中获得了AppDelegate,目前我正在重新加载整个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中用于填充表格视图

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-2)

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

或者,我发现您节省了大量时间 ,并且使用ALTableViewHelper可以使视图控制器最终变得更加可靠[商业-可以在Framework Central 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
                }
            }
        }
    }
}