5

iOS 7 consente di inizializzare una NSAttributedString con un file o dati HTML. Voglio utilizzare questa funzionalità per semplificare l'inserimento dei link nei testi "Informazioni" delle app.Inizializzazione di NSAttributedString con file HTML analizza i collegamenti HTTP come file URL

Per raggiungere questo obiettivo, ho inizializzare il NSAttributedString con il seguente codice:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"test.html" withExtension:nil]; 
NSError *error = nil; 
NSDictionary *options = nil; 
NSDictionary *attributes = nil; 
_textView.attributedText = [[NSAttributedString alloc] initWithFileURL:url options:options documentAttributes:&attributes error:&error]; 

e un file con il seguente contenuto:

<html><body> 
<p>This is a <a href=\"http://www.stackoverflow.com\">test link</a>. It leads to StackOverflow.<p> 
</body></html> 

Aggiornamento

È possibile che questo HTML ancora ha avuto i segni di fuga dal tentativo di usarlo in codice come NSString. Rimuovendo gli escape, funziona perfettamente. Ha anche risposto alla mia domanda qui sotto.

aggiornamento Fine

Questo funziona bene, e dà una stringa con l'URL correttamente formattato e cliccabile. Facendo clic sul collegamento chiama delegate di UITextView -textView: shouldInteractWithURL: inRange: method. Tuttavia, l'ispezione del parametro URL mostra che l'URL ha effettivamente la seguente stringa assoluta:

file:///%22http://www.google.com/%22 

che ovviamente non apre la pagina Web appropriata. Non trovo la documentazione su NSAttributedText abbastanza chiara da determinare il motivo per cui ciò accade.

Qualcuno sa come dovrei inizializzare NSAttributedString per generare l'URL appropriato?

risposta

0

La risposta a questa domanda è che il file HTML non è valido.

Dopo aver copiato/incollato l'html direttamente da una stringa definita in Objective-C, ho dimenticato di rimuovere gli escape prima di ogni quota. Questo, naturalmente, è stato tradotto direttamente in un url di file anziché in un URL HTML. Rimuovendo i segni di fuga corregge questo.

1

provare a leggere il file HTML in un NSString e quindi utilizzare:

NSString *path = [[NSBundle mainBundle] pathForResource:@"test.html" ofType:nil]; 
NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; 
_textView.attributedText = [[NSAttributedString alloc] initWithHTML:html baseURL:nil options:options documentAttributes:&attributes]; 

Almeno questo dovrebbe funzionare se è simile con quello che succede in UIWebViews. L'URL è stato risolto utilizzando il valore baseURL. Sembra che nel tuo codice l'URL sorgente sia usato anche come baseURL. Quindi sto passando un URL nil per impedire la risoluzione contro un URL di file locale.

+2

Questo non funzionerebbe, poiché -initWithHTML è un metodo solo OSX e non è definito per iOS. Tuttavia, la tua soluzione mi ha dato un indizio per la soluzione. Grazie mille! – SpacyRicochet

+0

Ho controllato la documentazione di 'NSAttributedString' per iOS e hai ragione. Tuttavia è menzionato nella guida alla programmazione della stringa attribuita https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/AttributedStrings/Tasks/CreatingAttributedStrings.html#//apple_ref/doc/uid/20000714-BBCCGGCC Ciò nonostante Sono contento di averti aiutato indirettamente :) – gimenete

+0

Yup. Lo abbiamo capito dopo aver rivisitato l'HTML dopo averlo inserito in un oggetto NSData. È venuto fuori che ho dimenticato di rimuovere gli escape dal contenuto HTML. – SpacyRicochet

Problemi correlati