2016-04-05 12 views
0

in diesem Beispiel zu öffnen versuchen, öffnen Sie eine Adresse http wie folgt aussehen: http://www.url.com/ und ich empfangen eine Fehlermeldung:Xamarin Formen, Fehler, wenn ein webhttp-Link

Invalid URI: The format of the URI could not be determined.

Dies ist der Code, den ich verwende. Und was, wenn ein Benutzer eine schlechte Adresse aufsetzt, wie zum Beispiel htp:/ohne zwei t's, wie kann ich einen Absturz vermeiden?

Dies ist mein Code:

foreach (var currentItem in getInfofromDB["results"]) { 

    URLstring = currentItem ["url"].ToString(); 


URLButton.Clicked += (object sender, EventArgs e) => { 

    Device.OpenUri(new Uri(URLstring)); //Invalid URI: The format of the URI could not be determined. 

    }; 

} 
+0

Was ist die genaue Form von 'URLstring' – SushiHangover

+0

regulär leer: String URLstring; – medvedo

+0

Ich meinte den eigentlichen URI-Text, den Sie im Konstruktor verwenden, aber ich würde die folgenden Antworten verwenden und 'TryCreate' verwenden, um herauszufinden, was mit Ihrem URI-Format nicht stimmt. – SushiHangover

Antwort

0
  1. Können Sie überprüfen, welche Zeichenfolge Sie tatsächlich in Ihrem Ereignisanruf erhalten?
  2. Versuchen Sie, jedes Mal eine neue Variable für den Zyklus zu erstellen. anstatt eine externe String-Variable zu verwenden.

Grund: Sie mehrere Schließungen in Ihrem Zyklus erstellen, aber Sie verwenden eine globale unveränderliche Variable für diese Sache (Ihr urlString hat keinen Grund, überhaupt zu existieren).Ich kann mir nicht vorstellen, was dort vor sich geht, aber du könntest zum Zeitpunkt des Ereignisses etwas erhalten.

foreach (var currentItem in results) 
{ 
    var s = currentItem ["url"].ToString(); 
    URLButton.Clicked += (object sender, EventArgs e) => { 
     Debug.WriteLine(s); 
     Device.OpenUri(new Uri(s)); }; 
} 
+0

das ist das gleiche wie mein Code, aber mit einem Var anstelle einer Zeichenfolge? Wird diese kleine Änderung es beheben? – medvedo

+0

Der Unterschied ist, wo URLstring Variable definiert ist. Meine Variable wird jeden Zyklus neu definiert und es ist eine neue Schließung. in Ihrem Fall erhalten Sie möglicherweise die gleiche Variable in allen Schließungen (es ist unwahrscheinlich, aber hängt vom Compiler ab) –

0

Sie gültig UriTryCreate mit erstellen können.

MSDN

Creates a new Uri. Does not throw an exception if the Uri cannot be created.

Uri = outvalue; 

if(Uri.TryCreate("http://www.google.com", UriKind.Absolute, out outvalue)) 
{ 
    //logic 
} 
+0

gleiche Sache hier, ich erreiche nie die Funktion in der if-Anweisung. – medvedo

+0

mit diesem Code: Uri outvalue; \t \t \t \t \t \t \t 'if (Uri.TryCreate (urlString, UriKind.Absolute, aus outvalue)) \t \t \t \t \t \t \t { \t \t \t \t \t \t \t \t Device.OpenUri (outvalue) ; \t \t \t \t \t \t \t \t System.Diagnostics.Debug.WriteLine ("Reach"); \t \t \t \t \t \t \t} ' – medvedo

+0

Es sollte funktionieren, lesen Sie in diesem [Beispiel] (https://dotnetfiddle.net/5nTodx) –

0

Ich nehme an, das irgendwo außerhalb Ihres geschrieben Code existiert:

string URLString; 
Button URLButton; 

Mit Ihrer Schleife, Sie einige Dinge falsch machen.

Zuerst fügen Sie einen Clicked-Handler für jedes Element in Ihrer "Ergebnis" -Liste hinzu. Wenn die Schaltfläche angetippt wird, wird versucht, sie alle einzeln auszulösen (Event-Handler werden als Multicast-Delegaten implementiert). Wenn einer von ihnen fehlschlägt, werden die verbleibenden nicht ausgeführt.

Zweitens referenzieren Sie URLString innerhalb des Clicked-Handlers. Dies bedeutet, dass ALLE Clicked-Handler mit dem gleichen Wert ausgeführt werden.

Drittens, da URLString außerhalb der Schleife definiert ist und Sie seinen Wert innerhalb der Schleife zuweisen, bedeutet dies, dass nach Abschluss der Schleife NUR der Wert des letzten Elements in den "Ergebnissen" angezeigt wird. Liste.

Vielleicht gibt es hier mehr Code, den Sie uns nicht gezeigt haben - wie URLString und URLButton tatsächlich innerhalb des Schleifenkörpers deklariert werden? Diese Probleme müssen jedoch behoben werden, bevor Sie erwarten können, dass Ihr Code wie vorgesehen funktioniert.

Ich habe meine "bereinigte" Version Ihres Codeausschnitts hier aktualisiert. Es ist das gleiche wie die aktualisierte Schnipsel aber nicht stumm stattdessen eine Ausnahme zu werfen, wenn eine schlechte URL schlagen:

foreach (var currentItem in getInfofromDB["results"]) { 
    URLstring = currentItem ["url"].ToString(); 
    URLButton.Clicked += (object sender, EventArgs e) => { 
     Uri uri; 
     if (Uri.TryCreate(URLstring, UriKind.Absolute, out uri)) { 
      Device.OpenUri(uri); 
     } 
    }; 
} 
+0

stürzt nicht ab, aber es erreicht niemals die Funktion innerhalb der if-Anweisung – medvedo

+0

Ich habe die angeklickte Funktion innerhalb der foreach-Schleife btw – medvedo

+0

Ich habe meine Antwort basierend auf Ihren nachfolgenden Kommentaren aktualisiert. Du machst mehrere Dinge falsch, aber ich vermute, dass es mehr Code gibt, den du noch nicht gezeigt hast? –

0

die mit URL nur versuchen lassen, ohne die foreach:

URLstring = getInfofromDB["results"][0]["url"].ToString(); 

URLButton.Clicked += (object sender, EventArgs e) => { 
    Uri uri; 
    if (Uri.TryCreate(URLstring, UriKind.Absolute, out uri)) { 
     Device.OpenUri(uri); 
    } 
}; 

Mit dem foreach, Sie weisen den URLButton-Ereignishandler so oft wie die Anzahl der Ergebnisse zu. Es ist nicht gut, zu viele URLs zu öffnen, oder?

Verwandte Themen