我有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属性的共同祖先。

我究竟做错了什么?谢谢!

最佳答案

UILabelUITextView没有名为setAttributedText的方法。但是他们确实有一个名为setAttributedText:的方法。注意冒号。冒号是方法名称的一部分。是否拥有代表两种完全独立的方法。

将您的代码更改为:

-(void) replaceAttrText: (NSString *)str {
    if ([self respondsToSelector: @selector(setAttributedText:)]) {
        NSMutableAttributedString *labelText = [self template];

        // change it

        [self performSelector:@selector(setAttributedText:) withObject: labelText];
    }
}


换句话说,在对setAttributedText的两个引用中都添加一个冒号。

09-29 23:56