5

我确定 mutable 意味着它可以更改,那么为什么会发生这种情况?

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;

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

//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”

为什么会这样?

4

2 回答 2

11

NSMutableAttributedString 没有 setFont:range: 函数。

取自这里.... iphone/ipad:究竟如何使用 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 语法。

希望有帮助。

于 2012-09-20T17:19:44.187 回答
1

首先,你说的attrString是一个属性吗?如果是一个属性,你最好检查一下你是否用copy属性声明了这个属性,你大概是在使用编译器生成的setter吗?如果 YES 编译器生成的 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️⃣如何复制一个 NSMutableAttributedString 2️⃣ NSConcreteAttributedString mutableString crash

于 2015-03-27T03:36:13.087 回答