【问题标题】:Make call in Swift printing but crashing在 Swift 打印中拨打电话但崩溃
【发布时间】:2016-04-06 20:19:47
【问题描述】:

我正在使用 Factual 获取当地餐馆的电话号码,并为最终用户提供了在我的应用程序中拨打该地点的选项,但由于某些奇怪的原因,它一直在崩溃。

这是有效的代码:

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

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

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

这段代码崩溃了,但我觉得它应该可以工作。谁能告诉我为什么会这样?

我删除了 !这就是我得到的。它不会让我用吗?

【问题讨论】:

  • 我的猜测是你的强制解包失败,因为 NSURL 返回 nil。省略“tel:”后的“//”
  • 您可能还需要删除空格。使用不安全!在这个情况下。你应该使用 ?如果 URL 为 nil,则打印某种错误
  • 请更新您的问题,并提供有关崩溃错误消息的明确详细信息,并指出导致崩溃的确切行。那么所有的猜测都可以停止了。
  • Swift 提供了a million safe ways of dealing with optionals... 而你选择了不安全的那个;)
  • 仅供参考 - 您对问题所做的更新表明您的应用没有崩溃。它甚至没有运行。这只是 Xcode 指出编码问题。

标签: ios swift crash


【解决方案1】:

抛开对选项的不安全处理(强制解包...),您需要确保电话号码的字符串表示具有正确的编码,以用于以下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)
}

另见:

【讨论】:

    【解决方案2】:

    如果它是 nil,你需要正确解包可选的 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")
    }
    

    【讨论】:

    • 它不再崩溃但如果它正在打印电话号码,为什么url会为零?
    • 因为 url 是可选的,所以最好检查和处理它,以防它无法从您的字符串中创建 url。还刚刚更新了我的答案,去掉了电话号码中的破折号。
    • NSURL 没有 stringByReplacingOccurrencesOfString 类型的成员
    • 是的,对不起,应该在餐厅字符串上替换字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多