【问题标题】:Calling/messaging code crashing?呼叫/消息传递代码崩溃?
【发布时间】:2015-04-28 15:37:36
【问题描述】:

我有一些按钮,按下时会从数组中调用/发送消息。即 button1 将调用数组索引 0 处的数字,button2 索引 1 处的数字,等等。由于某种原因,只要数组中的数字包含 xxx-xxx-xxx 以外的格式,它就会崩溃(即 (xxx) xxx-xxx )。然而,即使数组不为零,日志也会给我以下错误:

有人知道为什么会这样吗? 这是所有内容的代码:

import UIKit
import AddressBook

var contactInfo: [String] = []

[...]

override func viewDidLoad() {
        super.viewDidLoad()

//this is the function that grabs the array from an app group

    setUpCallMessageButtons()

[...]

callButton1.addTarget(self, action: "call:", forControlEvents: UIControlEvents.TouchUpInside)
}

func call(sender:UIButton!)
    {
        if (sender == callButton1) {
            println("\(contactInfo)")
            var url:NSURL? = NSURL(string: "tel:\(contactInfo[0])")
            self.extensionContext?.openURL(url!, completionHandler:{(success: Bool) -> Void in
            })
        }
}

func setUpCallMessageButtons(){
        let appGroupID = "**redacted**"
        let defaults = NSUserDefaults(suiteName: appGroupID)
        contactInfo = (defaults!.objectForKey("contactInfo") as! [String])

        println("\(contactInfo)")
//This is gives the log down below. As you can see, none are nil.
}

按钮 1,2 和 5 正常工作,而 3 和 4 总是崩溃。

【问题讨论】:

    标签: ios arrays xcode swift


    【解决方案1】:

    我的猜测是,如果电话号码的格式不正确,将其转换为 NSURL 的调用将失败并返回 nil。

    您可能需要将对 openURL 的调用包装在一个可选绑定(“if let”)块中:

    var url:NSURL? = NSURL(string: "tel:\(contactInfo[0])")
    if let url = url
    {
      self.extensionContext?.openURL(url!, 
        completionHandler:
        {
          (success: Bool) -> Void in
        }
    }
    else
    {
      println("Phone number \(contactInfo[0]) is not in a valid format")
    }
    

    在尝试创建 URL 之前,您可能希望去掉电话号码中的括号。一个简单的方法是使用 NSString 方法stringByReplacingOccurrencesOfString:withString:

    【讨论】:

    • 这非常有效!谢谢!这里的所有答案都非常有帮助
    【解决方案2】:

    这是一个小故事板——它告诉你 nil 是从哪里来的

    Unexpectedly found nil 表示有一个变量预期为非 nil,但在运行时为 nil

    这是导致问题的代码行

    self.extensionContext?.openURL(url!, completionHandler:{(success: Bool)
    

    它期望 url 为非零(即!)但它绝对是零(见图)

    【讨论】:

    • 感谢您的洞察力!原来空格是导致问题的原因。另外,感谢您的视觉支持!
    【解决方案3】:

    如果此数据来自用户或互联网,您可能需要一种方法来去除所有非数字字符。像这样的东西(从我刚刚敲出来的一个工作操场上):

    import UIKit
    
    func digitsOnly(#fromString: String) -> String
    {
      var workString = NSMutableString(string: fromString)
      let digitsSet = NSCharacterSet.decimalDigitCharacterSet()
      var index: Int
      for index = count(fromString)-1; index>=0; index--
      {
        if !digitsSet.characterIsMember(workString.characterAtIndex(index))
        {
          workString.deleteCharactersInRange(NSRange(location:index, length:1))
        }
      }
      return workString as String
    }
    
    let testString = "(555) 111-2222"
    let result = digitsOnly(fromString:testString)
    println("digitsOnly(\"\(testString)\") = \"\(result)\" ")
    

    这显示:

    digitsOnly("(555) 111-2222") = "5551112222"

    编辑:

    或者同样功能的更类似于 Swift 的版本:

    func digitsOnly(#fromString: String) -> String
    {
      var result = String()
      let digitsSet = NSCharacterSet.decimalDigitCharacterSet()
      for char in fromString
      {
        if digitsSet.characterIsMember(char as unichar)
        result += char
      }
    }
    

    编辑#2:

    您可以通过更改您使用的字符集来增加保留的字符集。换行

    let digitsSet = NSCharacterSet.decimalDigitCharacterSet()
    

    let digitsSet = NSCharacterSet(charactersInString: "0123456789+-")
    

    保留“+”号和破折号。 (编辑字符串以包含您需要的字符。)

    【讨论】:

    • @Cyril,看看第二个答案。它提供了在将电话号码转换为 URL 之前清理您的电话号码的代码。
    • 无论如何/不/删除+如果有一个?
    • let digitsSet = NSCharacterSet(charactersInString: "0123456789+-") 这很好用?另一个不可用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多