2012-09-20 30 views
5

Tôi chắc chắn có thể thay đổi có nghĩa là nó có thể thay đổi, vậy tại sao điều này lại xảy ra?NSMutableAttributedString có đang gặp sự cố khi thay đổi phông chữ không?

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; 

Cả catextlayer và nsmutableattringsring của tôi đều được xác định trong tệp tiêu đề của tôi. Tôi làm cho những thay đổi chuỗi của tôi ở trên trong một chuyển đổi, sau đó gọi mã này để cập nhật các catextlayer chuỗi được hiển thị trong:

//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]; 

Nó bị treo trên khi nó cố gắng để thiết lập font chữ, nhưng tôi không thể làm việc ra sao ?

- [NSConcreteMutableAttributedString setFont: khoảng:]: chọn không được công nhận gửi đến dụ 0xd384420 * Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do: '- [NSConcreteMutableAttributedString setFont: khoảng:]: chọn không được công nhận gửi ví dụ 0xd384420 '

Tại sao điều này xảy ra?

+0

Dưới đây là một số mã miễn phí đó chứng tỏ việc sử dụng các chuỗi do: github.com/artmayes167/Attribute – AMayes

Trả lời

10

NSMutableAttributedString không có hàm setFont: range:.

Taken từ đây .... iphone/ipad: How exactly use NSAttributedString?

Vì vậy, tôi đã làm một chút đọc từ các tài liệu.

Các chức năng là ...

[NSMutableAttirbutedString setAttributes:NSDictionary range:NSRange]; 

Vì vậy, bạn sẽ có thể làm điều gì đó như thế này ...

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

hoặc

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

nếu bạn vẫn sử dụng cú pháp ObjC cũ.

Hy vọng điều đó sẽ hữu ích.

+0

tôi nhận được một lỗi trên sử dụng không khai báo NSFontAttributeName? Tôi chưa thử màu sắc. – dev6546

+0

được chỉnh sửa sau khi đọc tài liệu. https://developer.apple.com/library/mac//#/documentation/Cocoa/Reference/Foundation/Classes/NSMutableAttributedString_Class/Reference/Reference.html – Fogmeister

+0

Tôi nghĩ những tài liệu đó chỉ hoạt động với os x 10+ cũng gây ra tai nạn. – dev6546

1

Trước hết, là attrString bạn nói một tài sản? Nếu đó là một tài sản, bạn nên kiểm tra xem bạn đã khai báo thuộc tính với thuộc tính sao chép, và có lẽ bạn đang sử dụng trình biên dịch tạo ra trình biên dịch? Nếu CÓ Trình thiết lập do trình biên dịch gửi sẽ gửi thông điệp sao chép tới đối tượng để tạo một bản sao. Tin nhắn sao chép tạo một bản sao bất biến. Tức là, nó tạo ra một NSAttributedString, không phải là một NSMutableAttributedString.

Một cách để sửa lỗi này là viết setter của riêng bạn mà sử dụng mutableCopy, như thế này nếu bạn đang sử dụng ARC:

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

hay như thế này nếu bạn đang sử dụng sổ tay hướng dẫn đếm:

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

Một sửa chữa khác là làm cho textCopy trở thành NSAttributedString thay vì NSMutableAttributedString và làm cho phần còn lại của mã của bạn hoạt động với nó như một đối tượng bất biến.

tham khảo: 1️⃣ How to copy a NSMutableAttributedString 2️⃣ NSConcreteAttributedString mutableString crash

Các vấn đề liên quan