1

UILabel 텍스트가 너무 길면 윤곽선으로 하위 뷰 UILabel ivar에 애니메이션을 적용하는 UIView 하위 클래스 (나는 MarqueeLabel이라고 부름)를 만들고 있습니다. 포함하는보기. 인스턴스 변수의 setter/getters를 클래스에 넘김

은 내가 UILabel의의 바르의 모든 표준 UILabel의 (텍스트, 글꼴, 색상 등) 인스턴스 변수 검색/설정 단지 내 MarqueeLabel 클래스 의 메소드를 작성하지 않고도 깨끗한 구현을 기대했다. 메시지 포워딩을 통해 이것을 수행하는 방법을 발견했습니다. 인식 할 수없는 모든 메소드를 MarqueeLabel으로 보내면 UILabel ivar로 전달됩니다. 필자의 경우, MarqueeLabel으로 인식 할 수없는 메소드가 UILabel에서 일반적으로 사용되는 메소드입니다.

그 접근 방식에 몇 가지 문제가 있지만이 있습니다
1. 당신은, 오히려 marqueeLabel.text
2 컴파일러는 위의 줄에 경고를주는 것보다, [marqueeLabel setText:@"Label here"]를 사용해야 할 이유는

'MarqueeLabel'이 (가) '-setText :'에 응답하지 않을 수 있습니다.

다른 사람을 괴롭히는 것입니다.

이러한 문제를 피하려면 메소드를 ivar 메소드로 가져 와서 ivar 오브젝트에서 계속 작동하면서 클래스를 사용하여 액세스 할 수있는 방법이 있습니까?

감사합니다.

참고 : 내가 설정 한 방법으로도이 작업을 수행 할 수있는 최선의 방법이 아닐 수 있습니다. 아마도 UILabel을 서브 클래 싱하거나 클래스를 계속 사용하는 것이 더 좋았지 만, 애니메이션 + 클리핑 (텍스트 스크롤이 UIView를 포함하지 않고 사라지는 경우)이 이러한 메서드를 사용하여 수행 될 수있는 방법을 파악할 수 없었습니다.

주 2 : 나는 subLabel은 서브 뷰 UILabel의 어디에 있는지 marqueeLabel.subLabel.text을 사용할 수 있습니다 알고 있습니다. 그리고 이것은 제가 취하는 방향일지도 모릅니다. 그러나 더 나은 해결책이 있는지도 알 수 있습니다!

답변

1

속성의 경우 인터페이스에서 속성을 정의하고 구현에서 @dynamic을 사용하여 스텁 구현을 만들지 않아도됩니다. valueForUndefinedKey:setValue:forUndefinedKey:도 무시하고 라벨로 전달하십시오.

속성의 일부가 아닌 메서드의 경우 범주를 사용하여 메서드를 구현하지 않고 선언 할 수 있습니다. 이렇게하면 경고가 제거되지만 기본 전달 기능은 계속 사용됩니다.

//MarqueeLabel.h 
#import <UIKit/UIKit.h> 
@interface MarqueeLabel : UIView {} 
@property (nonatomic, copy) NSString *text; 
@end 
@interface MarqueeLabel (UILabelWrapper) 
- (void)methodToOverride; 
@end 

//MarqueeLabel.m 
#import "MarqueeLabel.h" 
@implementation MarqueeLabel 
@dynamic text; 
- (id)valueForUndefinedKey:(NSString *)key { 
    return [theLabel valueForKey:key]; 
} 
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { 
    [theLabel setValue:value forKey:key]; 
} 
@end 
+0

정확히 내가 생각했던대로 작동합니다. 감사합니다. 나는'@ dynamic'을 어떻게 든 사용해야한다고 생각하고 있었지만 forUndefinedKey 메소드를 보지 않았고 forwardInvocation 만 보았습니다. 나는 아마 당신이 결국 [[theLabel setValue : value forKey : key];를 의미한다고 생각한다. – Chuck

+0

네, 있습니다. 나는 그것을 고쳐 줄 것이다. – ughoavgfhw

+0

나는 이와 비슷한 것을하려고하는데, getters와 setters (이 경우'marqueeLabel.text')를 사용하는 것은 undefinedKey 메소드에서 끝나지 않습니다. 내가 잘못된 것을하고 있거나 단순히 잘못된 장소를보고 있습니까? –

관련 문제