如何检查UILabel是否以编程方式检查了attributedText或普通文本?

问题描述 投票:8回答:4

是否可以使用label.attributedTextlabel.text属性判断UILabel是否设置了文本?

问题是,当您设置attributedText时,text也被更新,反之亦然,因此无法检查这些属性是否为零。

ios uilabel nsattributedstring
4个回答
0
投票

这就是我用的。如果范围长度等于未归因的文本长度,则该文本仅具有单个属性,因此未被归因。

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

3
投票

受@ lukas-o的启发,我在UILabel上写了一个扩展名,确定它是否包含attributedText。实际上,如果NSAttributedString不包含任何属性,则此计算出的属性会将其评估为未归因。

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
    }
} 

2
投票

apple docs

此属性默认为nil。为该属性分配新值也将使用相同的字符串数据替换text属性的值,尽管没有任何格式信息。另外,分配一个新值将更新字体,textColor和其他与样式相关的属性中的值,以便它们反映从属性字符串的位置0开始的样式信息。

您是对的,不可能发现一个或另一个是否为nil。您可能知道该文本是属性的一种方法是使用类似以下内容:

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)]];
}];

这样,您可以查看是否存在多个属性。您也可以比较属性是否与标准属性匹配,并假设仅在这种情况下设置了text属性。


0
投票

这是我想出的实现,但逻辑有些改动。它是@Vallette接受的答案的Swift端口,带有附加的保护声明。

如果true不为零,不为空并且具有至少一个不适用于整个文本范围的属性,则该函数仅返回attributedText

extension UILabel {

    var isPartiallyAttributed: Bool {
        guard let attributedText = attributedText else {
            return false
        }
        guard !attributedText.string.isEmpty else {
            return false
        }
        var range = NSRange()
        attributedText.attributes(at: 0, effectiveRange: &range)
        return attributedText.string.count != range.length
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.