[![在此处输入图片描述] [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
中用于填充表格视图
答案 0 :(得分:2)
让应用程序委托在主线程上广播特定于应用程序的通知中心通知。让包含表视图的视图控制器侦听该通知,并根据需要更新有问题的单元格。这样,您就不会污染应用程序委托。应用程序委托应仅处理系统级应用程序内容,而不处理业务逻辑。
答案 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
}
}
}
}
}