2013-02-25 2 views
1

현재 내 앱의 업데이트를 진행 중입니다. 추가하고자하는 새로운 기능 중 하나는 UITableViewCell에있는 UILabel 클래스를 대체해야합니다. 그러나 이전에 셀에 대해 Xcode에서 제공된 기본 스타일 중 하나를 사용 중이었고 클래스를 대체하는 옵션이 비활성화되었습니다.UITableViewCell의 기본 스타일의 하위 뷰 클래스 변경

대부분의 코드를 다시 작성하지 않아도이 문제를 해결할 수 있습니까?

답변

2

당신이 요구하는 것을 구체적으로하기 위해 나는 멋진 Objective-C 해킹을 사용하여 몇몇 클래스를 바꿀 것입니다. 방법은 다음과 같습니다.

1) 새 UILabel 하위 클래스를 만듭니다. 이 예에서는 SwizzleLabel 클래스를 사용합니다.

2)이 새로운 라벨 클래스 안에 텍스트 스타일을 원하는대로 변경하는 등 몇 가지 스타일을 적용하는 메소드를 추가하십시오. 이것은 기본적으로 init 메소드를 대체합니다. 당신이 당신의 뷰 컨트롤러에 등을 예를 들어,이 클래스 변경 (만드는 겁니다 곳) 가져 오기 <objc/runtime.h>)

-(void)applyStyles { 

    [self setBackgroundColor:[UIColor blueColor]]; 
    [self setTextColor:[UIColor redColor]]; 
    [self setHighlightedTextColor:[UIColor orangeColor]]; 

} 

3.

4) cellForRowAtIndexPath: 메서드에서 Class을 만듭니다.

Class newLabelClass = objc_getClass("SwizzleLabel"); 

5) 클래스를 바꿔 넣습니다.

object_setClass([cell textLabel], newLabelClass); 

6) 마지막으로 사용자 정의 스타일을 적용합니다 (기본적으로 init 메소드 대체).

[[cell textLabel] performSelector:@selector(applyStyles)]; 

이제 레이블 클래스를 하위 클래스로 완전히 바꿔야합니다. 내 마지막 cellForRowAtIndexPath: 방법은 다음과 같습니다.

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

    UITableViewCell *cell = [[UITableViewCell alloc] init]; 

    Class newLabelClass = objc_getClass("SwizzleLabel"); 
    object_setClass([cell textLabel], newLabelClass); 
    [[cell textLabel] performSelector:@selector(applyStyles)]; 

    [[cell textLabel] setText:@"Testing"]; 

    return cell; 

} 
관련 문제