2011-04-23 21 views
5

Tôi có một MSMutableAttributedString displayContent. Các thuộc tính của nội dung thay đổi theo chuỗi tức là màu sắc và kích thước phông chữ có thể thay đổi theo chữ cái.appendAttributedString: trong NSMutableAttributedString

Tôi muốn thêm một ký tự mới vào cuối chuỗi và cho nó để nhận các thuộc tính của ký tự cuối cùng trong displayContent. Tôi không thể biết trước những thuộc tính đó là gì vì chúng nằm dưới sự kiểm soát của người dùng.

Khi tôi nối thêm các nhân vật mới (tempAttr):

NSAttributedString * tempAttr = [[NSAttributedString alloc] initWithString:appendage]; 
[displayContent appendAttributedString:tempAttr]; 

nó xuất hiện để thiết lập lại các thuộc tính của toàn bộ chuỗi các thuộc tính của các nhân vật mới (mà tôi đã không được thiết lập kể từ khi tôi không thể biết họ cần gì).

Làm cách nào để nhận tempAttr để nhận các thuộc tính của ký tự cuối cùng trong displayContent? Cảm ơn.


Cập nhật. Thực hiện tiến bộ về điều này một cách vụng về nhưng chức năng. Sao chép các thuộc tính từ điển từ ký tự cuối cùng trong màn hình (displayContent) rồi áp dụng lại những thuộc tính cho nhân vật mới được thêm vào:

NSMutableDictionary * lastCharAttrs = [NSMutableDictionary dictionaryWithCapacity:5]; 
[lastCharAttrs addEntriesFromDictionary: [displayContent attributesAtIndex:0 
                  effectiveRange:NULL]]; // get style of last letter 
NSMutableAttributedString * tempAttr = [[NSMutableAttributedString alloc] initWithString:newCharacter 
                       attributes:lastCharAttrs]; 

[displayContent appendAttributedString:tempAttr]; // Append to content in the display field 

tôi sẽ hy vọng có một cách thanh lịch hơn để làm điều này như thiết lập một tài sản của NSTextField.

Trả lời

15

Tôi nghĩ rằng tôi đã phát hiện ra một giải pháp cho điều này một cách tình cờ, sau đó tìm thấy trang này trong khi tìm kiếm câu trả lời cho vấn đề tôi đã tạo cho bản thân mình (đối diện với vấn đề của bạn).

Nếu bạn làm như sau:

[[displayContent mutableString] appendString:newCharacter]; 

Bạn sẽ kết thúc với newCharacter nối và các thuộc tính trước "kéo dài" để trang trải nó. Tuy nhiên, tôi không thể tìm thấy hành vi này được ghi lại ở bất cứ nơi nào, do đó bạn có thể mệt mỏi khi đếm nó.

+0

Cảm ơn rất nhiều bài đăng. Tôi thay thế dòng của bạn vào mã và nó hoạt động tốt. Cảm ơn bạn. Bất kỳ cái nhìn sâu sắc về lý do tại sao điều này hoạt động? Phương thức mutableString trả về đơn giản là nội dung chuỗi của chuỗi attributedString. Tài liệu đề cập đến không có gì về bản thân các thuộc tính được sao chép. Vì vậy, tôi không thấy nơi appendedString chọn lên các thuộc tính đúng từ. –

+0

Tôi không biết. Tôi không thể quyết định xem đó có phải là chi tiết triển khai hay không (ví dụ: tác dụng phụ/hành vi có thể thay đổi) hoặc nếu đó là hành vi dự định thực tế. Nhưng suy nghĩ về nó như trái ngược với “appendAttributedString:” rõ ràng là có các thuộc tính riêng của nó, tôi có thể thấy lý do rằng việc mở rộng chuỗi bên dưới sẽ làm cho các thuộc tính tiếp tục. Điều đó nói rằng, làm thế nào nó thực sự plumbed với nhau, tôi không có ý tưởng. –

+1

@BenCochran Bạn nói đúng rằng không có gì đề cập cụ thể về các thuộc tính kéo dài, nhưng các tài liệu nói: 'Người nhận theo dõi các thay đổi đối với chuỗi này và giữ ánh xạ thuộc tính của nó cho đến nay.' Điều đó dường như là những gì đang xảy ra. –

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