2012-05-23 7 views
1

내 질문에 이상하게 들리지만 GenericTableViewCell이라는 UITableViewCell에서 상속받은 클래스와 GenericTableViewCell에서 상속하는 클래스가 있다고 가정 해 보겠습니다. GenericTableViewCell init 메서드에 인수를 전달하여 GenericTableViewCell의 하위 클래스에서이 TableViewCell을 초기화해야한다고 말합니다. Heres는 내가 생각한 것이지만 반복적 인 루프가 있기 때문에 실패 할 것입니다.하위 클래스로 초기화 클래스

@implementation GenericTableViewCell 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellIdentifier: (CellIdentifier *) identifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     if ([identifier class] == [FirstIdentifier class]){ 
      self = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier]; 
     } 
     /// more else statements to check for other identifier cases 
    } 
    return self; 
} 

@end 

어떤 방법이 있습니까? 또는 init 함수 외부의 식별자를 확인하고이를 통해 선언 할 셀을 결정해야합니까?

+0

상황에서는 오히려 하위 클래스 '초기화보다 서브 클래스에 initWithStyle:reuseIdentifier:를 호출해서는 안 NSObject에서'init'을 호출합니다. NSObject 인스턴스가 아닌 NSObject 인스턴스를 반환한다고 가정합니다. 이건 정말 이상한 일입니다 .. – beryllium

+1

왜 이것을 원하나요? cellIdentifier를 알리고 g, 아마도 if/else 또는 switch 문을 어딘가에 가지고있을 것입니다. 왜 그 순간에 올바른 테이블 뷰 클래스를 초기화하지 않는 것이 좋을까요? –

답변

2

예, 가능합니다. 여러분이 가끔 클래스 클러스터라고 부르는 패턴입니다. ARC를 사용하지 않는 경우 self의 원래 값을 해제해야 메모리 누수가 중지됩니다.

그러나 저는 이것을하지 않습니다. GenericTableViewCell에 팩토리 메서드를 만들 것입니다.

+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style 
         reuseIdentifier: (NSString *)reuseIdentifier 
         cellIdentifier: (CellIdentifier *) identifier 
{ 
    GenericTableViewCell* ret = nil; 

    if ([identifier class] == [FirstIdentifier class]) 
    { 
     ret = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    } 
    else 
    { 
     // .... 
    } 
    return [ret autorelease]; 
} 

당신은 CellIdentifier하는 방법을 추가하여 if 문을 제거하고 subclasseslike이에서를 오버라이드 (override) 할 수 있습니다

// in CellIdentifier.m 

-(id) classForCell 
{ 
    return [GenericTableViewCell class]; 
} 

// in FirstIdentifier.m 

-(id) classForCell 
{ 
    return [FirstTableViewCell class]; 
} 

는 그런 다음 팩토리 메소드는

+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style 
         reuseIdentifier: (NSString *)reuseIdentifier 
         cellIdentifier: (CellIdentifier *) identifier 
{ 
    return [[[[identifier classForCell] alloc] initWithStyle:style 
              reuseIdentifier:reuseIdentifier] autorelease]; 
} 
+0

감사합니다. 도움이되었습니다. 내 공장 패턴을 잊어 버린 것에 대해 나쁘다. – Nadavrbn

2

당신이 구현해야하는 일을하게된다 클래스 클러스터 패턴이라고합니다.

GenericTableViewCell에서 :

- (id)initWithCustomIdentifier:(NSString *identifier) { 
    Class cellClass = NSClassFromString(identifier); 

    if (!cellClass) { 
     cellClass = [MyStandardTableViewCell class]; 
    } 
    self = [[cellClass alloc] init]; 

    return self; 
} 
MyStandardTableViewCell에서

(또는 GenericTableViewCell의 다른 서브 클래스 :

- (id)init { 
    self = [super initWithStyle:someStyle reuseIdentifier:NSStringFromClass([self class])]; 

    if (!self) return nil; 

    // do extra setup here 
    return self; 
} 
+0

JeremyP의 솔루션은 내 솔루션보다 유연합니다. – Nadavrbn

관련 문제