2016-08-02 19 views
0

Ich versuche, den detaillierten Text in einer UITableView-Zelle (die eine Telefonnummer "String" ist) abrufen und dann in einer Funktion verwenden, die einen Anruf tätigen wird.Wie kann man den detailedText von einer Zelle abrufen und dann in einer Funktion verwenden?

  • Problem:

    Meine app hält mit dem Fehler Absturz „fatalen Fehler: unerwartet gefunden null, während ein optionaler Wert auspackt“ obwohl es einen Wert in der Variable ist.

Ich bin sicher, dass ich etwas falsch mit Kraft mache das optionale

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    let getPhone = cell?.detailTextLabel?.text 

    if indexPath.section == 0 && indexPath.row == 0 { 

    if let phoneNumber = getPhone{ 
     openPhoneApp(phoneNumber) 
    } 
} 

// Open Phone App 
func openPhoneApp(phoneNum: String){ 
    UIApplication.sharedApplication().openURL(NSURL(string: "tel:\(phoneNum)")!) 
} 
Abwickeln

enter image description here

+0

Setzen Sie einen Unterbrechungspunkt am Anfang Ihrer Funktion, und überprüfen Sie jede Eigenschaft, wenn ich null bin. – MCMatan

+1

Das einzige Unwrap, das ich sehe, ist in NSURL, also erstellen Sie wahrscheinlich eine schlecht formatierte URL. BTW: zwinge NICHT, Dinge auszupacken –

+0

Xcode schlägt vor, es auszupacken: "Wert des optionalen Typs 'NSURL?' nicht ausgepackt " – AziCode

Antwort

3

keine Gewalt Abwickeln Verwenden Sie, wenn Du bist nicht 100% sicher es kann ausgepackt werden. Und meide es wenn möglich auch dann!

Ihre openPhoneApp Funktion muss eine Nicht-Null-Zeichenfolge erhalten, daher ist bis zu diesem Moment alles in Ordnung.

Versuchen Sie, Ihre Kraft unwrap mit so etwas zu ersetzen:

func openPhoneApp(phoneNum: String) { 
    guard let url = NSURL(string: "tel:\(phoneNum)") else { 
     print("badly formed telephone url") 
     return 
    } 
    UIApplication.sharedApplication().openURL(url) 
} 

Obwohl ich argumentieren würde, dass der Name Ihre Funktion impliziert, dass es das Telefon App öffnen, so sollten Sie vielleicht einfach gehen und fragen sie nach einer URL korrekt gebildet wird, wie folgt aus:

func openPhoneApp(phoneURL: NSURL) { 
    UIApplication.sharedApplication().openURL(phoneURL) 
} 

und für diese Art von Sachen überprüfen, bevor es sogar Aufruf:

if let phone = getPhone, phoneURL = NSURL(string: "tel:\(phone)") { 
    openPhoneApp(phoneURL) 
} 
+0

Ja, die Telefonnummern, die ich aus der Zelle abgerufen habe, wurden wie folgt formatiert "(510) 222 2222". Jetzt werde ich die Leerzeichen zwischen den Zahlen los, und ich werde auch die beiden Klammern um die (510) loswerden, bevor ich "openPhoneApp" anrufe. – AziCode

1

Bitte benutzen Sie tel: // Schema und rufen immer

UIApplication.sharedApplication().canOpenURL 

vor

+0

Ich möchte nicht TextLabel verwenden, da es nur ein Titel ist, ich müssen detailTextLabel abrufen, das die Telefonnummer enthält, die ich verwenden möchte – AziCode

+1

Bitte überprüfen Sie meine Bearbeitung –