我有UIView类别,该类别定义了操作UILabel和UITextView的attributedText
属性的方法。
@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
对于UILabel和UITextView,responsToSelector均返回false(尽管它们响应setAttributedText),并且如果setAttributedText在不使用
respondsToSelector
的情况下直接执行,则会引发异常。当类别直接在UILabel上实现(不带选择器)时,一切正常,但是不幸的是,UILabel和UITextView没有具有attributedText属性的共同祖先。
我究竟做错了什么?谢谢!
最佳答案
UILabel
和UITextView
没有名为setAttributedText
的方法。但是他们确实有一个名为setAttributedText:
的方法。注意冒号。冒号是方法名称的一部分。是否拥有代表两种完全独立的方法。
将您的代码更改为:
-(void) replaceAttrText: (NSString *)str {
if ([self respondsToSelector: @selector(setAttributedText:)]) {
NSMutableAttributedString *labelText = [self template];
// change it
[self performSelector:@selector(setAttributedText:) withObject: labelText];
}
}
换句话说,在对
setAttributedText
的两个引用中都添加一个冒号。