uitable view reloaddata]는 무엇입니까?
-
03-07-2019 - |
문제
UitableView가있는 응용 프로그램이 있습니다. 이 uitableview는 nsmutablearray가 AppDelegate에서 재산으로 개최되는 것으로 채워집니다. 이것을 이메일 창로 생각할 수 있습니다. 서브 클래스 uitableviewcell에 메시지를 나열합니다. 새 메시지가 나타나면 메시지를 다운로드하는 모든 코드가 완료되어 모든 메시지를 보유하는 AppDelegate의 NSMutableARRay에 데이터를 추가합니다. 이 코드는 잘 작동합니다.
이제 새 메시지가 다운로드되어 배열에 추가되면 다음 코드를 사용하여 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
}
해결책
정신 점검으로서, 그 시점에서 thetable이 nil이 아니라고 확인 했습니까?
다른 팁
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를 호출하기 전에 메시지 배열이 올바른 컨텐츠를 가지고 있는지 확인하기 위해 새로 고침 메소드에서 중단 점을 설정해 보셨습니까?