[ios] Nib에서 재사용 가능한 UITableViewCell로드

사용자 지정 UITableViewCell을 디자인하고 http://forums.macrumors.com/showthread.php?t=545061 에있는 스레드에 설명 된 기술을 사용하여 잘로드 할 수 있습니다 . 그러나 해당 메서드를 사용하면 더 이상 재사용 식별자로 셀을 초기화 할 수 없습니다. 즉, 호출 할 때마다 각 셀의 완전히 새로운 인스턴스를 만들어야합니다. 누군가 재사용을 위해 특정 셀 유형을 캐시하는 좋은 방법을 알아 냈지만 여전히 Interface Builder에서 설계 할 수 있습니까?



답변

적절한 메서드 서명을 사용하여 메서드를 구현하기 만하면됩니다.

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}


답변

실제로 Interface Builder에서 셀을 빌드하고 있으므로 재사용 식별자를 설정하십시오.

IB_reuse_identifier

또는 Xcode 4를 실행중인 경우 Attributes inspector 탭을 확인하십시오.

여기에 이미지 설명 입력

(편집 : XIB가 XCode에 의해 생성 된 후 빈 UIView가 포함되어 있지만 UITableViewCell이 필요하므로 UIView를 수동으로 제거하고 Table View Cell을 삽입해야합니다. 물론 IB는 a에 대한 UITableViewCell 매개 변수를 표시하지 않습니다. UIView.)


답변

이제 iOS 5에는 적절한 UITableView 메서드가 있습니다.

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier


답변

이 코드를 처음 어디에서 찾았는지 기억할 수 없지만 지금까지 잘 작동하고 있습니다.

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

Interface Builder 설정 예 …

대체 텍스트


답변

이 질문에 대한 답을보십시오.

Interface Builder에서 NSCell 서브 클래스를 디자인 할 수 있습니까?

IB에서 UITableViewCell을 디자인 할 수있을뿐만 아니라, 그렇지 않으면 모든 수동 배선 및 여러 요소의 배치가 매우 지루하기 때문에 바람직합니다. 가능한 경우 모든 요소를 ​​불투명하게 만들도록주의하는 한 성능은 괜찮습니다. 재사용 ID는 UITableViewCell의 속성에 대해 IB에서 설정되며, 대기열에서 빼려고 할 때 코드에서 일치하는 재사용 ID를 사용합니다.

또한 작년에 WWDC의 일부 발표자로부터 IB에서 테이블 뷰 셀을 만들면 안된다는 말을 들었습니다.


답변

iOS 4.0 경부터이 작업을 초고속으로 만드는 구체적인 지침이 iOS 문서에 있습니다.

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

UITableViewCell 서브 클래 싱에 대해 설명하는 위치로 스크롤하십시오.


답변

다음은 또 다른 옵션입니다.

NSString * cellId = @"reuseCell";
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}