2011-02-08 7 views
0

사용자 정의 셀을 사용하고 닙에서로드 한 후 initWithNibName : bundle을 사용하여 컨트롤러에 연결하는 UITableView가 있습니다. 기본적으로 dequeueReusableCellWithIdentifier는 이미로드 된 셀을 반환하지만 그렇지 않아야한다는 것을 알았습니다.dequeueReusableCellWithIdentifier가 잘못된 셀을 반환합니다.

- (UITableViewCell *) tableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath { 
    return [[self controllerForTableView: tv cellForRowAtIndexPath: indexPath] cell]; 
} 

- (TableViewCellBaseController *) controllerForTableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath { 
    [self checkValidTableView: tv]; 

    UIViewController *controller; 
    Class class; 
    Event *event; 
    int row = [indexPath row]; 

    DLOG(@"at index path row: %i", row); 

    if (row == [currentEvents count]) { 
    controller = [self tableCellContainerFromNibName: nibName 
              tableView: tv 
              atIndex: row 
              withClass: class]; 
    } else { 
    class = [EventFeaturedTableViewCell class]; // TODO: OR class = [EventNonFeaturedTableViewCell class]; 
    event = [self findEventFromIndex: row]; 

    lastSelectedEvent = event; 
    DLOG(@"event: %@", event); 

    controller = [self tableCellContainerFromNibName: NSStringFromClass(class) 
              tableView: tv 
              atIndex: row 
              withClass: class 
              perform: @selector(initTableCellWithController:) 
                on: self]; 
    } 

    return controller; 
} 

- (TableViewCellBaseController *) tableCellContainerFromNibName: (NSString *) nibName 
                 tableView: (UITableView *) tableView 
                 atIndex: (int) index 
                 withClass: (Class) class 
                 perform: (SEL) selector 
                  on: obj { 

    CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier: nibName]; 
    TableViewCellBaseController *controller; 

    DLOG(@"Cell: %@", cell); 
    DLOG(@"Cell Identifier: %@", nibName); 

    if (cell == nil) { 
    controller = [[class alloc] initWithNibName: nibName bundle: nil]; 

    if (obj) { 
     [obj performSelector: selector withObject: controller]; 
    } 

    // run this after setting data as controller.view eager loads the view 
    cell = controller.cell = controller.view; 
    cell.controller = controller; 
    } else { 
    controller = cell.controller; 

    if (obj) { 
     [obj performSelector: selector withObject: controller]; 
    } 
    } 

    return controller; 
} 

- (void) initTableCellWithController: (EventsIndexTableViewCell *) controller { 
    controller.event = lastSelectedEvent; 
} 

사용자 지정 셀 컨트롤러의 뷰 속성뿐만 아니라 '세포'속성을 사용하여 컨트롤러에 IB에 매여되었습니다 여기

내 대리자 메서드입니다. 맞춤형 셀에는 펜촉에 직접 설정된 고유 한 식별자가 있습니다.

컨트롤러의 데이터가 올바른지 이미 확인했습니다. 경우 '대서양 베이'표에 나중에 다음 표에 먼저 표시되는지

http://screencast.com/t/NI2Tpc7GKEi

주의 사항 :

는 여기에 내가 시뮬레이터에서보고 있어요 효과입니다. 백업을 스크롤 할 때 더 이상 테이블의 첫 번째 항목으로 표시되지 않습니다!

+1

그러나 컨트롤러의 setEvent : 메소드가 셀 내용을 수정하기 위해 오버라이드 되었습니까? 대답이 아니라면, 당신은 기본적으로 대기열에서 제외 된 셀 구조 (cell.controller)를 변경하지만 내용은 변경하지 않기 때문입니다. 컨트롤러 Nib가로드되고 뷰가 생성되고 컨트롤러의 setEvent를 사용하여 컨트롤러를 명시 적으로 업데이트하지 않으면 셀 구조가 한 번 만들어 졌다고 생각하십시오. 코드 위치에 다른 위치가 표시되지 않습니다. Nibs가 매번 호출되기 때문에 테이블의 첫 번째 셀은 정상입니다. 시스템이 대기열에있는 셀을 다시 시작하기 전까지 발생합니다. – viggio24

+0

안녕하세요 viggio24 - 아래 Rob의 게시물 아래에있는 댓글을 참조하십시오. – smtlaissezfaire

답변

1

viggio24의 행을 계속하려면 셀을 올바르게 다시 구성하고있는 곳이 표시되지 않는 데 동의합니다. 당신이 죽을 때 ... 이미 "물건"을 가지고있는 세포를 얻게 될 것입니다. 모든 것을 다시 초기화하는 것이 당신의 임무입니다.

신중하게 읽어야합니다. Loading Custom Table-View Cells From Nib Files. 일반적으로 -initWithNibName:bundle: 대신 -loadNibNamed:owner:options:을 사용합니다.

+0

셀을 어떻게 다시 구성합니까? 첫 번째로드에서 셀은 포함 된 컨트롤러의 viewDidAppear에있는 내용과 함께로드됩니다. viewWillAppear과 비슷한 것이 있나요? viewWillAppear : 컨트롤러에서 작동하지 않는 것 같습니다. – smtlaissezfaire

+1

셀에 대한 -viewWillAppear에 해당하는 것은'-tableView : willDisplayCell : forRowAtIndexPath :'입니다. –

+0

그래서 cellableNeedsDisplay를 호출하려고합니다 : -tableView : willDisplayCell : forRowAtIndexPath :? – smtlaissezfaire

관련 문제