2016-05-15 43 views
-3

當我輸入模塊名稱的值時,我一直遇到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

回答

0

索引查找的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

我剛剛注意到你在另一行有錯誤...等一下...並且無論如何都要替換那部分。 –

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 
} 
相關問題