我刚刚在xcode组织者中发现了5个崩溃报告。当我打开它们时,我得到了这个堆栈跟踪(标记区域是我的应用程序的名称):
iOS8.4以及iOS9以及iPhone 5和iPhone 6设备上也会出现此错误。
我很难追踪,因为我无法在iPhone5(8.4)和iPhone6(9.0.1)上重现它。
1./2。在某处:
override func onButtonTableViewCellClick(button: BfPaperButton) {}
3
var button: BfPaperButton = BfPaperButton.newAutoLayoutView()
func onClick() {
delegate?.onButtonTableViewCellClick(button) // 3
}
我使用swift 2,xcode 7和iOS9。帮我理解错误。红色图像的第一行是什么意思?为什么这个错误与Swift.String
完全无关?
我找到了这个帖子:https://forums.developer.apple.com/thread/6078我在那里提取了这些信息:
我发现这种崩溃的一个案例是基于Obj-C的对象 调用基于Swift的委托方法,参数值为 没有,但Swift方法签名不是可选类型。在里面 我看到的情况,这是桥接委托方法签名中的错误 - 它实际上应该是可选的。它可能是某种东西 在你的情况下类似(Swift定义不允许 它应该是可选的,或者它可能是Obj-C代码中的错误 (当它不应该生成时为零。
我使用了一个名为BfPaperButton的obj-c lib,它创建了一个看起来像android材质设计的Button。也许错误与这个库有关?
日志:
查看图片:http://i.stack.imgur.com/5aQ8m.png
我有两个字符串扩展名。一个用于长度,一个用于子串:
extension String {
var length: Int { return self.characters.count }
subscript (i: Int) -> String {
return String(Array(self.characters)[i])
}
subscript (r: Range<Int>) -> String {
let start = startIndex.advancedBy(r.startIndex)
let end = startIndex.advancedBy(r.endIndex)
return substringWithRange(Range(start: start, end: end))
}
}
第188行是:
NSUUID().UUIDString[0...4]
使用子字符串扩展名。也许错误在这里?
override func onButtonTableViewCellClick(button: UIButton) {
if let title = button.titleLabel?.text {
if title == "Send code" {
tmpPhoneNumber = ""
var tmp = phoneNumber
if tmp.length > 1 {
if tmp[0] == "0" {
tmp = tmp[1...tmp.characters.count - 1]
}
tmpPhoneNumber = "0049" + tmp
phoneNumberWithCode = tmpPhoneNumber
sendAlert(tmp)
} else {
PfToast.showError("Please enter your phone number.")
}
} else if title == "Finish" {
if let cell: InputTableViewCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 2)) as? InputTableViewCell {
if isLicenceValid(cell.inputField.inputField.text!) {
createCustomer(cell.inputField.inputField.text!)
} else {
PfToast.showError("Please enter correct licence plate.")
}
}
}
}
}
答案 0 :(得分:9)
在我看来,你正在寻找错误的地方。当我查看日志时,我看到的是:
onButtonTableViewCellClick
String
索引Int
(请参阅String.subscript.getter (Swift.Int) -> String
)我们可以确定崩溃发生在这里:
return String(Array(self.characters)[i])
我认为我们可以排除nil
,因为这会导致早期崩溃。您很可能有字符索引超出范围问题。这意味着i
为负数或高于length - 1
(也许您正在索引空文本?)
不幸的是,重要的代码位于onButtonTableViewCellClick
,您还没有发布。