2015-04-03 7 views
6

C'è un modo per dire se UILabel ha il suo set di testo usando la proprietà label.attributedText o label.text?Come verificare se UILabel ha attribuito testo o testo normale a livello di programmazione?

Il problema è quando si imposta attributedText, text viene anche aggiornato e viceversa, quindi non è possibile controllare queste proprietà per zero.

+2

cosa stai cercando di realizzare da capire questo? – ColdLogic

+0

Indicare che si intende controllare * a livello di codice * se un'etichetta ha attribuito Testo (se questo è in realtà ciò che si intende). –

risposta

0

Questo è quello che uso. Se la lunghezza dell'intervallo è uguale alla lunghezza del testo non attribuito, il testo ha solo un singolo attributo e pertanto non è attribuito.

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

Penso che l'ultima riga dovrebbe essere 'BOOL isAttributed = label.text.length! = Range.length'. –

0

Ho fatto questi con storyboard.

1) Fare clic sull'etichetta e quindi nella finestra di destra impostare il testo da attribuire. 2) Quindi si seleziona il testo e si cambia il carattere o il colore del testo. enter image description here

1

Dal apple docs:

Questa proprietà è pari a zero per impostazione predefinita. L'assegnazione di un nuovo valore a questa proprietà sostituisce anche il valore della proprietà di testo con gli stessi dati di stringa, sebbene senza alcuna informazione di formattazione. Inoltre, l'assegnazione di un nuovo valore aggiorna i valori nel carattere, nel testoColore e in altre proprietà correlate allo stile in modo che riflettano le informazioni di stile che iniziano alla posizione 0 nella stringa attribuita.

Hai ragione, non è possibile scoprirlo controllando l'uno o l'altro per zero. Un modo si può sapere che il testo viene attribuito potrebbe essere quella di usare qualcosa come:

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

In questo modo si potrebbe ottenere vedere se più di un attributo è lì. È anche possibile confrontare gli attributi indipendentemente dal fatto che corrispondano agli attributi standard e assumere che la proprietà text sia stata impostata solo in questo caso.

1

Ispirato da @ lukas-o Ho scritto un'estensione su UILabel che determina se contiene o meno. Infatti se lo NSAttributedString non contiene alcun attributo, questa proprietà calcolata lo valuterà per non essere attribuito.

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