programing

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

cafebook 2023. 8. 26. 12:16
반응형

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

저는 http://forums.macrumors.com/showthread.php?t=545061 에 있는 스레드에 설명된 기술을 사용하여 맞춤형 UITableViewCells를 설계하고 올바르게 로드할 수 있습니다.그러나 이 메서드를 사용하면 더 이상 reuseIdentifier를 사용하여 셀을 초기화할 수 없습니다. 즉, 호출할 때마다 각 셀의 완전히 새로운 인스턴스를 만들어야 합니다.재사용을 위해 특정 셀 유형을 캐시하면서도 인터페이스 빌더에서 설계할 수 있는 좋은 방법을 찾은 사람이 있습니까?

실제로, 인터페이스 빌더에서 셀을 빌드할 때는 재사용 식별자를 설정하기만 하면 됩니다.

IB_reuse_identifier

또는 Xcode 4를 실행 중인 경우 Attributes inspector 탭을 확인합니다.

enter image description here

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

적절한 메소드 서명을 사용하여 메소드를 구현합니다.

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

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;
}

인터페이스 작성기 설정 예제...

alt text

제가 이 질문에 대해 한 대답을 보세요.

Interface Builder에서 NSell 하위 클래스를 설계할 수 있습니까?

IB에서 UITableViewCell을 설계하는 것은 가능할 뿐만 아니라, 그렇지 않으면 여러 요소를 수동으로 배선하고 배치하는 것이 매우 번거롭기 때문에 바람직합니다.성능은 가능한 모든 요소를 불투명하게 만드는 데 주의하기만 하면 됩니다.재사용ID는 UITableViewCell의 속성에 대해 IB에 설정된 후 코드에서 일치하는 재사용 ID를 사용하여 대기열을 해제합니다.

저는 작년에 WWDC의 몇몇 발표자들로부터 IB에서 테이블 뷰 셀을 만들지 말아야 한다는 말을 들었습니다. 하지만 그것은 엄청난 양입니다.

iOS 4.0 이후로 iOS 문서에는 이 작업을 매우 빠르게 수행하는 특정 지침이 있습니다.

http://developer.apple.com/library/ios/ #documentation/사용자 환경/개념/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;
    }
}

IBO 콘센트를 통해 셀을 연결하는 것을 제외하고는 비슷한 방법으로 사용자 정의 보기 셀을 만듭니다.

[nib objectAt...]접근 방식은 배열에서 항목의 위치를 변경할 수 있습니다.

UIViewController접근법은 좋습니다. 방금 시도해 보았는데 충분히 잘 작동합니다.

그렇지만.....

에 모든경우에,에,initWithStyle생성자가 호출되지 않으므로 기본 초기화가 수행되지 않습니다.

저는 사용에 대한 다양한 장소를 읽었습니다.initWithCoder또는awakeFromNib둘 중 하나가 옳은 방법이라는 결정적인 증거는 없습니다

에서 어떤 초기화 방법을 명시적으로 호출하는 것을 제외하고는.cellForRowAtIndexPath방법 아직 답을 찾지 못했습니다.

얼마 전에는 blog.atebits.com 에서 이 주제에 대한 블로그 게시물을 발견했고, 그 이후로 로렌 브릭터 ABTableViewCell 클래스를 사용하여 모든 UITableViewCells를 수행하기 시작했습니다.

모든 위젯을 저장할 수 있는 간단한 컨테이너 UIView가 제공되며 스크롤 속도가 매우 빠릅니다.

이것이 유용하기를 바랍니다.

또한 이 기술은 메모리 관리를 위해 뷰 컨트롤러에 펑키한 아이바가 필요하지 않고 작동합니다.여기서 사용자 정의 테이블 보기 셀은 "CustomCell.xib"라는 이름의 xib에 있습니다.

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }

루이스 방법이 효과가 있었습니다.다음은 니브에서 UITableViewCell을 만드는 데 사용하는 코드입니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}

구스타브 용액은 저에게 효과가 없습니다. 제가 시도한 것은:

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

효과가 있는 것 같습니다.blogTableViewCell은 셀의 IBOutlet이고 ChainesController는 파일의 소유자입니다.

관련 dequeueWithReuseIdentifier"다시 사용할 셀 개체를 식별하는 문자열입니다.기본적으로 재사용 가능한 셀의 식별자는 클래스 이름이지만 임의의 값으로 변경할 수 있습니다."

재정의 - 재사용 Identifier 사용자 자신은 위험합니다.셀 하위 클래스의 하위 클래스가 두 개 있는데 이 두 클래스를 단일 테이블 보기에서 모두 사용하면 어떻게 됩니까?슈퍼로 재사용 식별자 호출을 보내면 잘못된 유형의 셀을 디큐합니다. ......reuseIdentifier 메서드를 재정의해야 하지만 대체 식별자 문자열을 반환해야 합니다.또는 클래스를 지정하지 않은 경우 클래스를 문자열로 반환합니다.

제가 아이폰 기술자에게 이것에 대해 질문한 것은 아이폰 테크 토크 중 하나였습니다.그의 대답은 "네, IB를 사용하여 세포를 만드는 것은 가능합니다.하지만 하지 마세요.제발, 하지 마."

저는 벤 모셔(감사합니다!)가 연결한 대로 애플의 지시를 따랐지만 애플이 중요한 점을 누락했다는 것을 발견했습니다.IB에서 설계하는 객체는 UITableViewCell일 뿐만 아니라 로드하는 변수이기도 합니다.그러나 실제로 UITableViewCell의 사용자 정의 하위 클래스로 설정하고 하위 클래스의 코드 파일을 작성하면 코드에 IBOutlet 선언 및 IBAction 메서드를 작성하여 IB의 사용자 정의 요소에 연결할 수 있습니다.그러면 보기 태그를 사용하여 이러한 요소에 액세스할 필요가 없으며 원하는 모든 종류의 비정상적인 셀을 만들 수 있습니다.코코아 터치 천국입니다.

언급URL : https://stackoverflow.com/questions/413993/loading-a-reusable-uitableviewcell-from-a-nib

반응형