Что с [UITableView reloadData]? - PullRequest
       8

Что с [UITableView reloadData]?

22 голосов
/ 30 апреля 2009

У меня есть приложение, которое имеет UITableView. Этот UITableView заполняется NSMutableArray, хранящимся (как свойство) в appDelegate. Вы можете думать об этом как о окне электронной почты. Он перечисляет сообщения в подклассе UITableViewCell. Когда появляется новое сообщение, у меня есть весь код, который загружает сообщение, добавляет данные в NSMutableArray appDelegate, который содержит все сообщения. Этот код работает нормально.

Теперь, когда новое сообщение загружено и добавлено в массив, я пытаюсь обновить свой UITableView, используя следующий код, однако - функции делегата UITableView не вызываются.

Странно то, что когда я прокручиваю свой UITableView вверх и вниз, методы делегата наконец-то вызываются, и заголовки моего раздела меняются (они показывают количество сообщений для этого раздела). Разве они не обновляются в режиме реального времени и не ждут, пока моя прокрутка вызовет обновление? Также новая ячейка никогда не добавляется в раздел !!

Пожалуйста, помогите !!

КОД APPDELEGATE:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method

-(void)refreshMessagesDisplay{
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO];
}

-(void)performMessageDisplay{
    [myMessagesView refresh];
}

Код UITableViewController:

-(void) refresh{
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate];

    //self.messages is copied from appDelegate to get (old and) new messages.
    self.messages=mainDelegate.messages;

    //Some array manipulation takes place here.

    [theTable reloadData];
    [theTable setNeedsLayout];  //added out of desperation
    [theTable setNeedsDisplay];  //added out of desperation
}

Ответы [ 4 ]

29 голосов
/ 30 апреля 2009

Как проверка работоспособности, подтвердили ли вы, что в этой точке таблица не равна нулю?

12 голосов
/ 11 мая 2009

Вы можете попытаться установить задержку для вызова reloadData - у меня была похожая проблема, когда я пытался обновить свое представление таблицы при переупорядочении ячеек, за исключением того, что приложение вылетало, если во время него я вызывал reloadData.

Так что, возможно, стоит попробовать что-то подобное:

Метод обновления:

    - (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

, а затем вызвать его с (скажем) задержкой в ​​0,5 секунды:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

Надеюсь, это сработает ...

6 голосов
/ 16 ноября 2011

Если вы вызываете reloadData из отправленного метода, обязательно запустите его в главной очереди.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

    // hard work/updating here

    // when finished ...
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.myTableView reloadData];
    }); 
});

.. то же в методе:

-(void)updateDataInBackground {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

        // hard work/updating here

        // when finished ...
        [self reloadTable];
    });
}

-(void)reloadTable {
       dispatch_async(dispatch_get_main_queue(), ^(void) {
            [myTableView reloadData];
        }); 
}
0 голосов
/ 30 апреля 2009

Вы пытались установить точку останова в своем методе обновления просто для того, чтобы убедиться, что ваш массив сообщений содержит правильное содержимое перед вызовом reloadData?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...