문제

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를 호출하기 전에 메시지 배열이 올바른 컨텐츠를 가지고 있는지 확인하기 위해 새로 고침 메소드에서 중단 점을 설정해 보셨습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top