2012-05-24 6 views
10

내 뷰 클래스 (UIView의 자손)에 사용자 지정 모양 속성이 있습니다.UIAppearance를 사용하여 속성을 사용할 수있는 시점은 언제입니까?

@interface View : UIView 
@property(strong) UIColor *someColor UI_APPEARANCE_SELECTOR; 
@end 

@implementation View 
@synthesize someColor; 

// Somewhere in other code before the initializer is called: 
// [[View appearance] setSomeColor:[UIColor blackColor]]; 

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"%@", someColor); // nil 
    return self; 
} 

@end 

그들은 이미 설정되어 값이 [[MyClass appearance] setFoo:…]을 사용하여 설정하기 때문에 그 시점에서 유효하지 않습니다, 나는이 속성에 따라 뷰의 모양을 사용자 정의 할,하지만 난 초기화 안에 할 수 없어 layoutSubviews이지만 뷰 사용자 정의를 수행하는 것은 좋지 않습니다. 일부 사용자 정의로 인해 layoutSubviews이 다시 트리거되어 무한 루프가 발생할 수 있습니다.

사용자 지정을 수행하기에 좋은 점은 무엇입니까? 또는 모양 값을 적용하는 코드를 트리거하는 방법이 있습니까? 그것은 당신에게 문제를주고 경우

+0

일단 사용자 지정 클래스가 할당되면 멤버의 속성에 항상 액세스하고 요구 사항에 따라 변경 한 다음 개체를 코드의 수정 된 정보와 함께 사용할 수 있다고 생각합니다. –

+1

그냥, 외관 프록시 ('UIAppearance')를 통해 설정된 속성에 대해 이야기하고 있습니다. 이 값은 이니셜 라이저보다 나중에 설정됩니다. 속성 설정자에 중단 점을 설정하면 값이'[CALayer layoutSublayers]'에서 적용되었음을 알 수 있습니다. – zoul

답변

2

한 가지 가능한 해결 방법은 프록시에서 직접 값을 잡아하는 것입니다

이 뷰 용기에 따라 모양을 변화 할 수있는 옵션을 죽이고 일반적으로 추악한 물론
- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"%@", [[View appearance] someColor); // not nil 
    return self; 
} 

. 내가 찾은 두 번째 옵션은 설정자에서 사용자 정의를 수행하는 것입니다.

- (void) setSomeColor: (UIColor*) newColor 
{ 
    someColor = newColor; 
    // do whatever is needed 
} 

여전히 외관 속성이 설정된 후 호출되는 일부 훅을 갖고 싶습니다.

+0

내 대답보기; '후크'는 UIView didMoveToSuperview입니다., 나는 믿습니다. – TomSwift

1

- (void)willMoveToSuperview:(UIView *)newSuperview { 
    [super willMoveToSuperview:newSuperview]; 

    if (newSuperview) { 
     ... code here ... 
    } 
} 

때까지 기다릴 수 없다?

+2

그건 내 다음 시도지만 그 시점에서 값을 설정하지 않습니다. – zoul

0

일회성 일 경우 viewDidLoad가 가장 좋을 것이라고 생각했을 것입니다. 그렇지 않으면 viewWillAppear.

편집 :

그때의 라인을 따라 뷰의 사용자 정의 초기화 만들 것입니다 당신이보기에서하고 싶은, 그리고 그것을 컨트롤러의 경우 :하여 색상을 통과

-(id) initWithFrame:(CGRect) frame andAppearanceColor:(UIColor)theColor; 

을 생성시보기로

+0

이들은 컨트롤러 메소드이며 뷰에서 처리하는 편이 낫습니다.게다가이 호출 중에 값이 아직 설정되지 않았을 가능성이 큽니다. – zoul

+0

초기화 도구에서 색상을 전달하는 것도 옵션이 아닙니다. 설정해야 할 모양 속성이 더 많고 이니셜 라이저가 컨트롤러의 ... erm, * control * 외부에서 호출되기 때문입니다. 외관 프록시 API의 핵심은 항상 손으로 값을 설정하지 말아야한다는 것입니다. – zoul

+0

나는 어디에서 왔는지 알아. 어쩌면 모양 속성을 설정하고 NSNotification (모양 속성이 지정 될 때 전송 됨)에 대한 응답으로이 속성을 호출하는 메서드를 만들 수 있습니까? – ader

0

UIAppearance 속성은보기 계층 구조에 추가 될 때보기에 적용됩니다. 아마도 UIView didMoveToSuperview의 설정 속성에 액세스 할 수 있습니다.

1

경고 : Swift 2를 사용하고 있으므로 Swift/Objective-C의 이전 버전에 대해서는 확신 할 수 없습니다. 그러나 나는 didMoveToSuperview()이 작동하지 않는다는 것을 발견했습니다. 이 속성은 layoutSubviews()에서 사용할 수 있지만이 작업은 두 번 이상 호출 될 수 있으므로 위와 같은 작업을 수행 할 수있는 좋은 곳은 아닙니다. 내가 찾은 뷰의 lifeCycle에서 이러한 속성에 액세스하는 가장 좋은 장소는 didMoveToWindow()입니다.

관련 문제