NSMutableAttributedString在更改字体时崩溃?

时间:2012-09-20 17:13:33

标签: objective-c ios nsattributedstring nsmutablestring

我确信可变性意味着它可以改变,为什么会发生这种情况呢?

attrString = [[NSMutableAttributedString alloc] initWithString:@"Tip 1: Aisle Management The most obvious step – although one that still has not been taken by a disconcerting number of organisations – is to configure cabinets in hot and cold aisles. If you haven’t got your racks into cold and hot aisle configurations, we can advise ways in which you can achieve improved airflow performance."];

        [attrString setFont:[UIFont systemFontOfSize:20] range:NSMakeRange(0, 23)];
        [attrString setFont:[UIFont systemFontOfSize:15] range:NSMakeRange(24, 325)];
        [attrString setTextColor:[UIColor blackColor] range:NSMakeRange(0,184)];
        [attrString setTextColor:[UIColor blueColor] range:NSMakeRange(185,325)];
        break;

我的catextlayer和我的nsmutableattributedsring都在我的头文件中定义。我在交换机中对上面的字符串进行了更改,然后调用此代码来更新字符串显示在的catextlayer:

//updates catext layer
TextLayer = [CATextLayer layer];

TextLayer.bounds = CGRectMake(0.0f, 0.0f, 245.0f, 290.0f);
TextLayer.string = attrString;
TextLayer.position = CGPointMake(162.0, 250.0f);
TextLayer.wrapped = YES;

[self.view.layer addSublayer:TextLayer];

它在尝试设置字体时崩溃了,但我找不到原因?

  

- [NSConcreteMutableAttributedString setFont:range:]:无法识别的选择器发送到实例0xd384420    * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSConcreteMutableAttributedString setFont:range:]:无法识别的选择器发送到实例0xd384420'

为什么会这样?

2 个答案:

答案 0 :(得分:10)

NSMutableAttributedString没有setFont:range:function。

从这里开始...... iphone/ipad: How exactly use NSAttributedString?

所以我从文档中做了一些阅读。

功能是......

[NSMutableAttirbutedString setAttributes:NSDictionary range:NSRange];

所以你应该可以做这样的事情......

[string setAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetice-Neue"]} range:NSMakeRange(0, 2)];

[string setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Helvetice-Neue"], NSFontAttributeName", nil] range:NSMakeRange(0, 2)];

如果您仍在使用旧的ObjC语法。

希望有所帮助。

答案 1 :(得分:1)

首先,attrString是你说的属性吗?如果它是一个属性,你最好检查你是否已经使用copy属性声明了属性,并且你是否可能使用编译器生成的setter?如果是则编译器生成的setter将复制消息发送给对象以进行复制。复制邮件生成不可变副本。也就是说,它创建了一个NSAttributedString,而不是NSMutableAttributedString。

解决这个问题的一种方法是编写自己的使用mutableCopy的setter,如果你使用ARC,就像这样:

- (void)setTextCopy:(NSMutableAttributedString *)text {
   textCopy = [text mutableCopy];
}

或者像这样,如果您使用手动引用计数:

- (void)setTextCopy:(NSMutableAttributedString *)text {
    [textCopy release];
    textCopy = [text mutableCopy];
}

另一个解决方法是使textCopy成为NSAttributedString而不是NSMutableAttributedString,并使其余代码作为不可变对象使用它。

参考: 1️⃣How to copy a NSMutableAttributedString 2️⃣NSConcreteAttributedString mutableString crash