2017-02-25 85 views
0

如何防止刪除規則拒絕中的錯誤?我有一個警告,要求用戶刪除一條記錄,但檢查它是否可以刪除首先在覈心數據堆棧的保存方法中發生。我trieb與抓住它:如何防止核心數據中刪除規則拒絕的錯誤Swift 3

if (self?.categoryToEdit.toMyplace == nil){ 
     let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName + " kann nicht gelöscht werden!\r\nSie ist ", preferredStyle: .actionSheet) 
     let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
      self?.tableView.setEditing(false, animated: true) 
      self?.attemptFetch() 
      self?.tableView.reloadData() 
      return 
     }) 
     alertController.addAction(cancelButton) 
     self?.present(alertController, animated: false, completion: nil) 
    }else{ 
     self?.displayActionSheet(indexPath: indexPath as NSIndexPath) 
    } 

所以我從編譯器錯誤:致命錯誤:意外發現零而展開的可選值

我該怎麼解決呢?

在此先感謝!

編輯

謝謝! 這裏是完整的代碼。 它從tableView動作開始,並被轉發到處理警報的單獨函數。這個函數中沒有註釋的部分並不真正起作用。當它處理錯誤時,我首先得到一個警報。 如果記錄沒有從tableView中消失,並且在工作數組的索引中留下香,這將不會是一個巨大的問題。 這個問題一直存在,直到應用程序將重新啓動,沒有機會得到未刪除的記錄。我嘗試新的提取請求並重新載入表格日期,但直到新的開始時它纔會保留。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let edit = UITableViewRowAction(style: .normal, title: "Ändern") { [weak self] action, index in 
     self?.editMode = true 
     let cell = tableView.cellForRow(at: indexPath) as! CategoryTVCell 
     self?.configureCell(cell: cell, indexPath: indexPath) 
     context.performAndWait{ 
      if let obj = self?.controller.fetchedObjects , obj.count > 0 { 
       self?.categoryToEdit = obj[indexPath.row] 
       self?.categoryToEditName = self?.categoryToEdit.name! 
      } 
     } 
     self?.showAlertWithText() 
     self?.showAlertWithText() 
     tableView.isEditing = false 
    } 

    let delete = UITableViewRowAction(style: .normal, title: "Löschen") { [weak self] action, index in 
     self?.displayActionSheet(indexPath: indexPath as NSIndexPath) 
    } 

    edit.backgroundColor = UIColor(colorLiteralRed: 179.0/255.0, green: 179.0/255.0, blue: 179.0/255.0, alpha: 1) 
    delete.backgroundColor = myRedAlertColor 
    return [delete, edit] 
} 
private func displayActionSheet(indexPath: NSIndexPath) 
{ let categoryName = categoryArray[indexPath.row] 
    let alertController = UIAlertController(title: "Kategorie löschen", message: "Soll die Kategorie " + categoryName + " gelöscht werden?\r\nDie Kategorie kann nur gelöscht werden, wenn kein myPlace damit verbunden ist!", preferredStyle: .actionSheet) 

    let deleteCategory = UIAlertAction(title: "Löschen", style: .destructive, handler: { [weak self](action) -> Void in 
     self?.tableView.isEditing = false 
     //if (self?.categoryToEdit.toMyplace == nil)/*((self?.myPlace?.toCateogry == nil))*/{ 
      context.delete((self?.controller.fetchedObjects?[indexPath.row])!) 
      self?.categoryArray.remove(at: indexPath.row) 
      self?.attemptFetch() 
      self?.tableView.reloadData() 
     //}else{ 
      /*let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName + " kann nicht gelöscht werden!\r\nSie ist ", preferredStyle: .actionSheet) 
      let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
       self?.tableView.setEditing(false, animated: true) 
       self?.attemptFetch() 
       self?.tableView.reloadData() 
      }) 
      alertController.addAction(cancelButton) 
      self?.present(alertController, animated: false, completion: nil)*/ 
     //} 
     do{ 
      try context.save() 
     }catch{ 
      let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName + " kann nicht gelöscht werden!\r\nAlle myPlaces verlieren sonst diese Zuordnung!", preferredStyle: .actionSheet) 
      let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
       self?.tableView.setEditing(false, animated: true) 
       self?.attemptFetch() 
       self?.tableView.reloadData() 
      }) 
      alertController.addAction(cancelButton) 
      self?.present(alertController, animated: false, completion: nil) 

     } 
    }) 

    let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
     self?.tableView.setEditing(false, animated: true) 
    }) 

    alertController.addAction(deleteCategory) 
    alertController.addAction(cancelButton) 
    alertController.view.tintColor = .orange //UIColor(red: 0, green: 0, blue: 51) 
    //self.navigationController!.present(alertController, animated: true, completion: nil) 
    present(alertController, animated: false, completion: nil) 
} 
+0

能否請您分享您的代碼,不會刪除。另外你的核心數據棧是什麼樣的? –

回答

0

謝謝! 這裏是完整的代碼。 它從tableView動作開始,並被轉發到處理警報的單獨函數。這個函數中沒有註釋的部分並不真正起作用。當它處理錯誤時,我首先得到一個警報。 如果記錄沒有從tableView中消失,並且在工作數組的索引中留下香,這將不會是一個巨大的問題。 這個問題一直存在,直到應用程序將重新啓動,沒有機會得到未刪除的記錄。我嘗試新的提取請求並重新載入表格日期,但直到新的開始時它纔會保留。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let edit = UITableViewRowAction(style: .normal, title: "Ändern") { [weak self] action, index in 
     self?.editMode = true 
     let cell = tableView.cellForRow(at: indexPath) as! CategoryTVCell 
     self?.configureCell(cell: cell, indexPath: indexPath) 
     context.performAndWait{ 
      if let obj = self?.controller.fetchedObjects , obj.count > 0 { 
       self?.categoryToEdit = obj[indexPath.row] 
       self?.categoryToEditName = self?.categoryToEdit.name! 
      } 
     } 
     self?.showAlertWithText() 
     self?.showAlertWithText() 
     tableView.isEditing = false 
    } 

    let delete = UITableViewRowAction(style: .normal, title: "Löschen") { [weak self] action, index in 
     self?.displayActionSheet(indexPath: indexPath as NSIndexPath) 
    } 

    edit.backgroundColor = UIColor(colorLiteralRed: 179.0/255.0, green: 179.0/255.0, blue: 179.0/255.0, alpha: 1) 
    delete.backgroundColor = myRedAlertColor 
    return [delete, edit] 
} 
private func displayActionSheet(indexPath: NSIndexPath) 
{ let categoryName = categoryArray[indexPath.row] 
    let alertController = UIAlertController(title: "Kategorie löschen", message: "Soll die Kategorie " + categoryName + " gelöscht werden?\r\nDie Kategorie kann nur gelöscht werden, wenn kein myPlace damit verbunden ist!", preferredStyle: .actionSheet) 

    let deleteCategory = UIAlertAction(title: "Löschen", style: .destructive, handler: { [weak self](action) -> Void in 
     self?.tableView.isEditing = false 
     //if (self?.categoryToEdit.toMyplace == nil)/*((self?.myPlace?.toCateogry == nil))*/{ 
      context.delete((self?.controller.fetchedObjects?[indexPath.row])!) 
      self?.categoryArray.remove(at: indexPath.row) 
      self?.attemptFetch() 
      self?.tableView.reloadData() 
     //}else{ 
      /*let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName + " kann nicht gelöscht werden!\r\nSie ist ", preferredStyle: .actionSheet) 
      let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
       self?.tableView.setEditing(false, animated: true) 
       self?.attemptFetch() 
       self?.tableView.reloadData() 
      }) 
      alertController.addAction(cancelButton) 
      self?.present(alertController, animated: false, completion: nil)*/ 
     //} 
     do{ 
      try context.save() 
     }catch{ 
      let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName + " kann nicht gelöscht werden!\r\nAlle myPlaces verlieren sonst diese Zuordnung!", preferredStyle: .actionSheet) 
      let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
       self?.tableView.setEditing(false, animated: true) 
       self?.attemptFetch() 
       self?.tableView.reloadData() 
      }) 
      alertController.addAction(cancelButton) 
      self?.present(alertController, animated: false, completion: nil) 

     } 
    }) 

    let cancelButton = UIAlertAction(title: "Abbrechen", style: .cancel, handler: { [weak self](action) -> Void in 
     self?.tableView.setEditing(false, animated: true) 
    }) 

    alertController.addAction(deleteCategory) 
    alertController.addAction(cancelButton) 
    alertController.view.tintColor = .orange //UIColor(red: 0, green: 0, blue: 51) 
    //self.navigationController!.present(alertController, animated: true, completion: nil) 
    present(alertController, animated: false, completion: nil) 
} 
+0

請刪除這篇文章,因爲這是有問題的更新,我已將此更新合併爲問題。 – NeverHopeless

0

這裏的解決方案:

let delete = UITableViewRowAction(style: .normal, title: "Löschen") 
{ 
    [weak self] action, index in 

    do{ 
      try self?.controller.fetchedObjects?[indexPath.row].validateForDelete() 
      self?.displayActionSheet(indexPath: indexPath as NSIndexPath) 
     }catch{ 
      let categoryName = self?.categoryArray[indexPath.row] 
      let alertController = UIAlertController(title: "Kategorie löschen", message: "Die Kategorie " + categoryName! + " kann nicht gelöscht werden!\r\nSie wird bereits verwendet!", preferredStyle: .actionSheet) 
      let cancelButton = UIAlertAction(title: "Abbrechen", 
              style: .cancel, handler: { 

         [weak self](action) -> Void in 
         self?.tableView.setEditing(false, animated: true) 
         self?.attemptFetch() 
         self?.tableView.reloadData() 
      }) 

      alertController.addAction(cancelButton) 
      self?.present(alertController, animated: false, completion: nil) 
     } 
} 

它只是功能.validateForDelete()

相關問題