2015-04-03 14 views
6

Có cách nào để biết liệu UILabel có tập hợp văn bản sử dụng thuộc tính label.attributedText hoặc label.text không?Làm thế nào để kiểm tra xem UILabel có attributedText hay văn bản bình thường theo chương trình?

Vấn đề là khi bạn đặt attributedText, text cũng được cập nhật và ngược lại, do đó không thể kiểm tra các thuộc tính này cho số không.

+2

bạn đang cố gắng làm gì để tìm ra điều này? – ColdLogic

+0

Hãy chỉ ra rằng bạn có nghĩa là để kiểm tra * lập trình * nếu một nhãn có attributedText (nếu điều này là trong thực tế những gì bạn có ý nghĩa). –

Trả lời

0

Đây là những gì tôi sử dụng. Nếu độ dài phạm vi bằng độ dài văn bản không được phân bổ thì văn bản chỉ có một thuộc tính duy nhất và do đó không được phân bổ.

NSRange range; 
[label.attributedText attributesAtIndex:0 effectiveRange:&range]; 
BOOL isAttributed = label.text.length==range.length; 
+0

Tôi nghĩ dòng cuối cùng phải là 'BOOL isAttributed = label.text.length! = Range.length'. –

0

Tôi đã làm điều này với bảng phân cảnh.

1) Nhấp vào nhãn và sau đó trong cửa sổ bên phải đặt văn bản thành thuộc tính. 2) Sau đó, bạn chọn văn bản và thay đổi phông chữ hoặc màu văn bản. enter image description here

1

Từ apple docs:

Khách sạn này là con số không theo mặc định. Việc gán giá trị mới cho thuộc tính này cũng thay thế giá trị của thuộc tính văn bản bằng cùng một dữ liệu chuỗi, mặc dù không có bất kỳ thông tin định dạng nào. Ngoài ra, gán một giá trị mới sẽ cập nhật các giá trị trong phông chữ, textColor và các thuộc tính liên quan đến kiểu khác để chúng phản ánh thông tin kiểu bắt đầu từ vị trí 0 trong chuỗi được phân bổ.

Bạn nói đúng, không thể tìm ra việc kiểm tra cái này hay cái kia cho con số không. Một cách bạn có thể biết rằng văn bản được phân bổ sẽ sử dụng một cái gì đó như:

NSMutableArray *strAttrs = [NSMutableArray new]; 
NSMutableArray *strRanges = [NSMutableArray new]; 

[label.attributedText enumerateAttributesInRange:NSMakeRange(0, label.attributedText.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { 
     [strAttrs addObject:attrs]; 
     [strRanges addObject:[NSValue valueWithRange:(range)]]; 
}]; 

Bằng cách này bạn có thể xem liệu có nhiều thuộc tính không. Bạn cũng có thể so sánh các thuộc tính cho dù chúng khớp với các thuộc tính chuẩn của bạn và giả sử rằng thuộc tính văn bản đã được thiết lập chỉ trong trường hợp này.

1

Lấy cảm hứng từ @ lukas-o Tôi đã viết phần mở rộng trên UILabel xác định xem nó có chứa attributedText hay không. Trên thực tế, nếu NSAttributedString không chứa bất kỳ thuộc tính nào, thuộc tính được tính toán này sẽ đánh giá thuộc tính đó để không được phân bổ.

extension UILabel { 
    var isAttributed: Bool { 
     guard let attributedText = attributedText else { return false } 
     let range = NSMakeRange(0, attributedText.length) 
     var allAttributes = [Dictionary<String, Any>]() 
     attributedText.enumerateAttributes(in: range, options: []) { attributes, _, _ in 
      allAttributes.append(attributes) 
     } 
     return allAttributes.count > 1 
    } 
} 
Các vấn đề liên quan