Ответ 1
Как проверка работоспособности, вы подтвердили, что значение Table не равно нулю в этой точке?
У меня есть приложение с UITableView. Этот UITableView заполняется NSMutableArray, который хранится (как свойство) в appDelegate. Вы можете думать об этом как о окне электронной почты. Он отображает сообщения в подклассе UITableViewCell. Когда появляется новое сообщение, у меня есть весь код, который загружает сообщение, добавляет данные в appDelegate NSMutableArray, который содержит все сообщения. Этот код работает нормально.
Теперь, как только новое сообщение будет загружено и добавлено в массив, я пытаюсь обновить свой UITableView, используя следующий код, однако - функции делегата UITableView не вызываются.
Странно, когда я просматриваю свой UITableView вверх и вниз, методы делегата, наконец, вызываются, и мои заголовки разделов DO меняются (они показывают количество сообщений для этого раздела). Shoudn't они обновляются в режиме реального времени и не дожидаться, пока моя прокрутка вызовет обновление? Кроме того, новая ячейка никогда не добавляется в раздел!
Пожалуйста, помогите!!
КОД 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
}
Как проверка работоспособности, вы подтвердили, что значение Table не равно нулю в этой точке?
Вы можете попробовать поставить задержку на вызов 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?