2015-06-05 7 views
11

voglio recuperare il valore di ritorno JavaScript nel mio ViewController,Ottenere valore restituito da JavaScript UIWebView

Il problema è che, se non v'è piccola quantità di dati come String, sto diventando esso.

Ma se ci sono dati grandi come l'oggetto JSON, sta mostrando zero.

Quando chiamo la stessa funzione JS in Safari> Sviluppo> simulatore iOS, fornisce oggetti JSON dopo 1-2 secondi.

Ecco il mio codice:

var value = IBwebView.stringByEvaluatingJavaScriptFromString("get_small_string()") 
println(value) //Printing value 

ma viene stampato nulla,

var value = IBwebView.stringByEvaluatingJavaScriptFromString("get_JSON()") 
println(value) //Printing nil 

qualcuno sa come posso recuperare formato grande valore di ritorno JS in oggetto iOS?

+2

Avete provato ad aggiungere 'come? NSDictionary'? –

+0

sì, sta anche dando zero –

+0

Non è possibile usare le classi NSURL per recuperare il JSON? Altrimenti sei alla mercé delle velocità di connessione e dei tempi di risposta del server. Le mie uniche altre riflessioni sono se puoi usare una JSVirtualMachine, come ho fatto in questo [Playground] (https://github.com/sketchytech/Swiftography) dove tutto JS è locale. – sketchyTech

risposta

5

Questo risolvere il mio problema,

var value = IBwebView.stringByEvaluatingJavaScriptFromString("get_JSON()") 

var err:NSError? 
var obj:AnyObject? = NSJSONSerialization.JSONObjectWithData(value!.dataUsingEncoding(NSUTF8StringEncoding)!, options:nil, error:&err) 

if let items = obj as? NSDictionary { 
var data1:String = items.objectForKey("data1") as? String 
var data2:String = items.objectForKey("data2") as? String 
var data3:String = items.objectForKey("data3") as? String 
} 
1

Se il metodo di script java "get_JSON()" restituisce più di 10 MB di dati, non è consentito dal metodo stringByEvaluatingJavaScriptFromString.

Oppure Se occorrono più di 10 secondi per elaborare l'output, in tal caso si otterrà il valore nullo come output.

+0

ci sono solo dati di testo, quindi ovviamente meno di 1 MB, Ci vogliono 1-2 secondi in Safari> Sviluppo> simulatore iOS, come ho detto. –

+0

Dove hai chiamato questo metodo? –

+0

Ho chiamato questo metodo su IBAction di un pulsante, sto premendo il pulsante dopo che la pagina è stata caricata completamente. –

4

Non appena si ritorna un oggetto che non funziona, che cosa si può provare invece è quello di restituire una versione stringata del vostro oggetto

JSON.stringify(yourObject); 

e analizzare questa stringa sul lato nativo.

+0

Grazie ha funzionato. Stavo cercando di recuperare oggetti analizzati e non ha funzionato. – ArunGJ