현재 내 앱의 업데이트를 진행 중입니다. 추가하고자하는 새로운 기능 중 하나는 UITableViewCell
에있는 UILabel
클래스를 대체해야합니다. 그러나 이전에 셀에 대해 Xcode에서 제공된 기본 스타일 중 하나를 사용 중이었고 클래스를 대체하는 옵션이 비활성화되었습니다.UITableViewCell의 기본 스타일의 하위 뷰 클래스 변경
대부분의 코드를 다시 작성하지 않아도이 문제를 해결할 수 있습니까?
현재 내 앱의 업데이트를 진행 중입니다. 추가하고자하는 새로운 기능 중 하나는 UITableViewCell
에있는 UILabel
클래스를 대체해야합니다. 그러나 이전에 셀에 대해 Xcode에서 제공된 기본 스타일 중 하나를 사용 중이었고 클래스를 대체하는 옵션이 비활성화되었습니다.UITableViewCell의 기본 스타일의 하위 뷰 클래스 변경
대부분의 코드를 다시 작성하지 않아도이 문제를 해결할 수 있습니까?
당신이 요구하는 것을 구체적으로하기 위해 나는 멋진 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;
}