Вопрос

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

Теперь, когда новое сообщение загружено и добавлено в массив, я пытаюсь обновить свой 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
}
Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

Если вы вызываете 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];
        }); 
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top