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 
+2

什么'textFields'和'detail'?他们是否被定义为隐式解包选项?发布代码的相关部分。 – ozgur

+0

通过包含更多相关代码改进了问题 –

+0

@IOSProgrammer您仍未显示如何定义'textFields'和'courseWork' - 请使用这些定义编辑您的问题。 – Hamish

索引查找的collectionType并不安全,你必须检查,该指数小于首先,您可以安全地打开该索引处的值。 反正在这种特殊情况下,我认为这是一个更好的方式来做到这一点:

for (index, tf) in textFields.enumerate() { 
    if textField == tf { 
     saveTHeCourseWork(index == 0 ? "moduleName" : "markAwarded", value: textFields[index].text!) 
    } 
} 

重要的是,你必须确保文本框的数组包含您所搜索的索引在文本框.. 。你会得到这个错误,因为数组在索引0处没有textField。

+0

我会用什么代码代替? –

+0

if textField == textFields [0] {//模块名字段 saveTHeCourseWork(“moduleName”,value:textFields [0] .text!) } else if textField == textFields [1] {//标记为 saveTHeCourseWork (“markAwarded”,value:textFields [1] .text!)} –

+0

我刚刚注意到你在另一行有错误...等一下...并且无论如何都要替换那部分。 –

代码中有很多可能不安全的解包代码,用于在集合类型中对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 
}