UILabel 및 UITextView의 attributedText
속성을 조작하는 메서드를 정의하는 UIView 범주가 있습니다.특정 하위 클래스에서 사용할 수있는 메서드를 호출 할 때 수퍼 클래스의 performSelector가 실패합니다.
@implementation UIView (replaceAttrText)
-(void) replaceAttrText: (NSString *)str {
if ([self respondsToSelector: @selector(setAttributedText)]) {
NSMutableAttributedString *labelText = [self template];
// change it
[self performSelector:@selector(setAttributedText) withObject: labelText];
}
}
@end
respondsToSelector는 UILabel의 및 UITextView 모두 false를 반환 (그들은 setAttributedText에 응답하지만) 및 setAttributedText이 respondsToSelector
확인하지 않고 직접 실행하면 예외가 발생합니다.
카테고리가 선택자없이 UILabel에 직접 구현되면 모든 것이 작동하지만 UILabel 및 UITextView에는 attributedText 속성이있는 공통 조상이 없습니다.
내가 뭘 잘못하고 있니? 감사!
Apple에서 제공하는 클래스를 확장하면 일반적으로 아키텍처가 매우 약해지고 프로그램을 유지 관리하기 어려울 것이라는 신호가됩니다. 이 메소드는'setAttributedText :'를 구현하지 않는 클래스에 대해서는 아무것도하지 않습니다. 당신은 정말로 당신이 이야기하고있는 것을, 아주 구체적으로, 당신이 그것에 이야기하고있을 때 알고 있어야합니다. – bbum
@bbum NSAttributedText를 확장하여 이러한 메서드를 구현할 수는 있지만 그 메서드가 호출 될 때마다 추가 할당이 필요하며 [NSObject의 해시]를 사용하여 컨트롤의 원래 값을 캐시합니다. iOS에 대한 유연성은 안전하지 않다고 느끼지 않습니다. – esp
더 이상 자바 스크립트를 작성하지 않습니다. Objective-C 및 iOS 프레임 워크를 사용하고 있습니다. 애플에 의해 명시 적으로 권장되는 다른 언어의 패턴을 적용하는 것은 즉시 편리 할 수 있지만 고통의 세계로 이어질 것이다. BTW : 만약 정말로 * 정말 * 좋은 생각이라고 생각한다면 적어도 같은 메소드를 접두사에 붙여서 같은 방법을 추가 할 임의의 미래의 업데이트와 충돌하지 않도록하십시오. – bbum