如何更新,而不是重新加载,UITableView?

时间:2015-11-04 08:01:07

标签: ios iphone swift uitableview

我的问题可能看起来很简单,但它不起作用。我搜索了很多并尝试了很多方法,但它并不想要工作!

所以,我有一个UITableView。在后台我的一个函数工作和检测,如果收到一条新消息,它会将此值写入Core Data,我想在收到新消息时在我的单元格上添加徽章。

但是当我尝试这个时:

func reloadTableView() {
    dispatch_async(dispatch_get_main_queue(),{
        self.tableView.reloadData()
    })
}

它不会更新我的tableView,也不会显示新的徽章。为此,我需要:

  1. 更改我的控制器并返回
  2. 或者我需要将tableView拖到顶部并保留
  3. 在这些情况下,它会显示我的徽章。

    那么,我怎样才能更新我的tableView以显示新添加的徽章而不用上述两种方法?

    更新

    enter image description here

    更新2

    我有2个文件:ContactsTableViewController和Messages.swift。

    在我的Messages.swift中,我处理新消息,当我收到新消息时,我会收到日志:

    print("New message for \(user.jidStr)")
    ContactsTableViewController().reloadTableView()
    

    在我的ContactsTableViewController中:

    func reloadTableView() {
        self.tableView.reloadData()
        print("updated")
    }
    

    重新加载我的tableView,因为我在日志中收到updated消息,但它没有更新它和我的徽章

4 个答案:

答案 0 :(得分:2)

尝试仅更新接收新消息的单元格:

 var app =angular.module('PhoneCat',[]);
app.factory('info', ['$http', function($http){ 
  var data = {};
  data.getInfo = $http.get('http://cdn.rawgit.com/angular/angular-phonecat/master/app/phones/phones.json')
  .success(function(data){
     return data;
  })
   .error(function(err){
     return err;
   });

  return data;

 }]);
app.controller('HomeController', ['$scope','info',
function($scope, info) {
info.getInfo.then(function(res){
    $scope.datar = res.data;
 });  
}]);

其中self.tableView.beginUpdates() self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: row, inSection: section)], withRowAnimation: UITableViewRowAnimation.Fade) self.tableView.endUpdates() - 接收消息的单元格中的行

答案 1 :(得分:1)

Objective-C中的示例:

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];

Swift 2.0中的示例:

self.tableView.reloadRowsAtIndexPaths([NSIndexSet, indexSetWithIndex:0], withRowAnimation: UITableViewRowAnimation.Automatic)

答案 2 :(得分:0)

您是否尝试过NSOperationQeue?

gcc-5 -o foo foo.c -I -DDEBUG.
> ./foo 
hello world

编辑(因为我无法发表评论)

func reloadTableView() {
  NSOperationQueue.mainQueue().addOperationWithBlock {
        self.tableView.reloadData()
    })
}         

如果你正在使用这样的东西,你每秒都会调用更新功能,这没有意义。您应该在获取数据后调用它

答案 3 :(得分:0)

reloadData应该可以工作......(我认为最好在主线程上调用它。)

您是否检查过您的对象数组是否正确?如果它来自CoreData请求,它可能使用缓存。确保已同步CoreDataContext(通过在插入后调用上下文中的save方法)并且fetch返回最后创建的对象。

只是一个猜测......