Swift 2.1阵列错误 - 在解包任意值时意外发现为零
当我输入模块名称的值时,我一直遇到XCode终止问题。它只发生一半的时间,所以有一分钟它正在工作,值被保存到阵列,应用程序终止的下一分钟。请帮忙。Swift 2.1阵列错误 - 在解包任意值时意外发现为零
的DetailView ControllerCode:
var courseWork: CourseWork? {
didSet {
dispatch_async(dispatch_get_main_queue()) {
self.configureView()
}
}
}
func configureView() { // Update the user interface for the detail view
if let detail = self.courseWork {
self.title = detail.valueForKey("courseWorkName")!.description
textFields[0].text = detail.valueForKey("moduleName") as? String //Error with this line
textFields[1].text = detail.valueForKey("markAwarded") as? String
func setupUIElements() {
//text fields
for textF in textFields {
textF.delegate = self
}
textView.delegate = self
}
代码2:
func saveTHeCourseWork(fieldName: String, value: AnyObject) {
courseWork?.setValue(value, forKey: fieldName)
do {
try courseWork?.managedObjectContext?.save()
} catch {
let saveError = error as NSError
print(saveError)
}
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField == textFields[0] { // module name field
saveTHeCourseWork("moduleName", value: textFields[0].text!)
} else if textField == textFields[1] { // mark awarded
saveTHeCourseWork("markAwarded", value: textFields[1].text!)
}
return true
}
错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
索引查找的collectionType并不安全,你必须检查,该指数小于首先,您可以安全地打开该索引处的值。 反正在这种特殊情况下,我认为这是一个更好的方式来做到这一点:
for (index, tf) in textFields.enumerate() {
if textField == tf {
saveTHeCourseWork(index == 0 ? "moduleName" : "markAwarded", value: textFields[index].text!)
}
}
重要的是,你必须确保文本框的数组包含您所搜索的索引在文本框.. 。你会得到这个错误,因为数组在索引0处没有textField。
我会用什么代码代替? –
if textField == textFields [0] {//模块名字段 saveTHeCourseWork(“moduleName”,value:textFields [0] .text!) } else if textField == textFields [1] {//标记为 saveTHeCourseWork (“markAwarded”,value:textFields [1] .text!)} –
我刚刚注意到你在另一行有错误...等一下...并且无论如何都要替换那部分。 –
代码中有很多可能不安全的解包代码,用于在集合类型中对optionals和index lookup进行强制解包 - 可能会有很多的东西。也许重构这两种方法将消除这个问题。
更新configureView
带(可以自由与其他后备字符串替换"N/A"
):
func configureView() {
guard textFields.count > 1 else { return }
self.title = self.courseWork?.valueForKey("courseWorkName")?.description ?? "N/A"
textFields[0].text = self.courseWork?.valueForKey("moduleName") as? String ?? "N/A"
textFields[1].text = self.courseWork?.valueForKey("markAwarded") as? String ?? "N/A"
}
而且shouldChangeCharactersInRange
有:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard
let index = textFields.indexOf(textField),
let value = textField.text
else { return true }
switch index {
case 0:
saveTHeCourseWork("moduleName", value: value)
case 1:
saveTHeCourseWork("markAwarded", value: value)
default:
break
}
return true
}
什么'textFields'和'detail'?他们是否被定义为隐式解包选项?发布代码的相关部分。 – ozgur
通过包含更多相关代码改进了问题 –
@IOSProgrammer您仍未显示如何定义'textFields'和'courseWork' - 请使用这些定义编辑您的问题。 – Hamish