我有按钮,按下时,会从数组中调用/发送一个数字。即button1将调用数组索引0处的数字,索引1处的button2等等。出于某种原因,只要数组中的数字包含xxx-xxx-xxx以外的格式,它就会崩溃(即(xxx)xxx-xxx )。然而,即使数组不是nil,日志也会给出以下错误:
任何人都知道为什么会这样吗? 以下是所有内容的代码:
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总是崩溃。
答案 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)
这是一个小故事板 - 向您展示零来自哪里
意外地发现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
}
}
您可以通过更改使用的字符集来增加留在原位的字符集。替换
行let digitsSet = NSCharacterSet.decimalDigitCharacterSet()
使用
let digitsSet = NSCharacterSet(charactersInString: "0123456789+-")
保留“+”标志和破折号。 (编辑字符串以包含您需要的字符。)