呼叫/消息代码崩溃?

时间:2015-04-28 15:37:37

标签: ios arrays xcode swift

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

enter image description here

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

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.
}

enter image description here

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

3 个答案:

答案 0 :(得分:1)

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

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

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")
}

在尝试创建网址之前,您可能希望从电话号码中删除括号。一种简单的方法是使用NSString方法stringByReplacingOccurrencesOfString:withString:

答案 1 :(得分:1)

这是一个小故事板 - 向您展示零来自哪里

enter image description here

意外地发现nil意味着有一个变量,预计是非零的,但在运行时是零

这是导致问题的代码行

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

它希望 url 是非零的(即!),但肯定是零(见图)

答案 2 :(得分:0)

如果此数据来自用户或互联网,您可能需要一种方法来去除所有非数字字符。这样的事情(来自我刚刚开出的工作场所):

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+-")

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