响应不受支持的实现的选择器方法

时间:2013-07-18 08:12:39

标签: iphone ios objective-c ios5 ios6

在我的应用中,我需要在标签中显示在线下文字,因此我使用以下代码显示带下划线的文字

NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:normalString];
    [attributeString addAttribute:NSUnderlineStyleAttributeName
                            value:[NSNumber numberWithInt:1]
                            range:(NSRange){0,[attributeString length]}];

wesiteAddressLabel.attributedText = attributeString;

此方法和其他一些在iOS 6.1中正常工作的实现

但是当我在iOS 5.1及更低版本中执行时,app会因为原因而崩溃,

[attributeString addAttribute:NSUnderlineStyleAttributeName
                            value:[NSNumber numberWithInt:1]
                            range:(NSRange){0,[attributeString length]}];

以前版本不支持

所以我想使用respondsToSelector:方法检查实例是否响应并为不支持的选择器实现另一种方法。

我如何使用这种方法?

2 个答案:

答案 0 :(得分:2)

从文档中可以看出:

  

attributedText标签显示的样式文本。

     

@property(非原子,复制)NSAttributedString * attributedText   讨论默认情况下,此属性为零。为...分配新值   此属性还将text替换为text属性的值   相同的字符串数据,尽管没有任何格式信息。在   另外,分配一个新的值会更新字体中的值,   textColor和其他与样式相关的属性使它们反映出来   样式信息从属性字符串中的位置0开始。

     

可用性适用于iOS 6.0及更高版本。在UILabel.h中声明

您应该检查特定的UIView元素是否能够响应attributedText。在这种情况下:

[wesiteAddressLabel respondsToSelector:@selector(attributedText)];

应该够了

答案 1 :(得分:1)

对于previoes版本,您必须在文本下方绘制UIImageView,方法是在每行中获取文本的with和Height。

或者您可以使用DrawRect方法创建一个标签类别。

    - (void)drawRect:(CGRect)rect
 {
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(ctx, 0.0f/255.0f, 0.0f/255.0f, 255.0f/255.0f, 1.0f); // Your underline color
  CGContextSetLineWidth(ctx, 1.0f);

  UIFont *font = [UIFont systemFontOfSize:16.0f];
  CGSize constraintSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
  CGSize labelSize;
  labelSize = [self.text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];  

  CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
  CGContextAddLineToPoint(ctx, labelSize.width + 10, self.bounds.size.height - 1);

  CGContextStrokePath(ctx);

  [super drawRect:rect];  
}