在Swift打印中调用但崩溃

时间:2016-04-06 20:19:48

标签: ios swift crash

我正在使用Factual来获取当地餐馆的电话号码,并且最终用户可以选择在我的应用程序中调用该地点,但由于一些奇怪的原因它会一直崩溃。

这是有效的代码:

   func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        if item.tag == 1 {
            print("\(RestaurantCountry)")
        } 
    }

enter image description here

RestaurantCountry代表电话号码。它在控制台中打印电话号码,但是当我使用此代码时它会崩溃。有人知道为什么会这样吗?

func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
    if item.tag == 1 {
        let url:NSURL = NSURL(string: "tel://\(RestaurantCountry)")!
        UIApplication.sharedApplication().openURL(url)
    } 
}

此代码崩溃,但我觉得它应该可行。任何人都可以告诉我为什么会这样吗?

我删除了!这就是我得到的。它不会让我用? enter image description here

2 个答案:

答案 0 :(得分:2)

将您对选项的不安全处理(强制解包...)放在一边,您需要确保您的电话号码的字符串表示具有正确的编码,以便进行以下NSUrl查询/尝试启动呼叫。在这种情况下,我认为电话号码中的空格是失败查询的根。

您可以使用NSString方法stringByAddingPercentEncodingWithAllowedCharacters(_:)对字符串进行编码,例如

let phoneNr : NSString = "(219) 465-4022"
let fixedPhoneNr = phoneNr
    .stringByAddingPercentEncodingWithAllowedCharacters(
        NSCharacterSet.URLQueryAllowedCharacterSet()) ?? "Non-encodable..."
print(fixedPhoneNr) // (219)%20465-4022

之后你应该(希望)能够(安全地)发起你的呼叫

if let phoneNumberURL = NSURL(string: "tel:\(fixedPhoneNr)") {
    UIApplication.sharedApplication().openURL(phoneNumberURL)
}

另见:

答案 1 :(得分:1)

如果它是零,则需要正确解开可选的url来处理。您似乎还需要删除数字中的“ - ”。

let strippedUrlString = RestaurantCountry.stringByReplacingOccurrencesOfString("-", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

if let url = NSURL(string: "tel://\(strippedUrlString)") {
    UIApplication.sharedApplication().openURL(url)
} else {
    print("url is nil")
}