Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 领域异常-领域对象的更新,无论是否持久化_Ios_Swift_Segue_Fetch_Realm - Fatal编程技术网

Ios 领域异常-领域对象的更新,无论是否持久化

Ios 领域异常-领域对象的更新,无论是否持久化,ios,swift,segue,fetch,realm,Ios,Swift,Segue,Fetch,Realm,我正在我的应用程序中使用领域。 我想使用相同的viewController更新/插入用餐对象 这里是DayOverviewController,它显示用户在特定日期吃的饭 这一天OverviewController分为NewMealTableViewController和NewMealTableViewController,在两种情况下—添加新的膳食或单击膳食—进行编辑。 当我应该添加新的膳食时,我会得到一个领域异常,更确切地说,当我应该返回DayOverviewController时,我会得到

我正在我的应用程序中使用领域。 我想使用相同的viewController更新/插入用餐对象

这里是DayOverviewController,它显示用户在特定日期吃的饭

这一天OverviewController分为NewMealTableViewController和NewMealTableViewController,在两种情况下—添加新的膳食或单击膳食—进行编辑。 当我应该添加新的膳食时,我会得到一个领域异常,更确切地说,当我应该返回DayOverviewController时,我会得到它(按下save按钮,膳食被添加到领域,但mealTable.reloadData()-从视图将出现,在DayOverviewController中,在调用cellForRowAtIndexPath之前崩溃。)

在调用NewMealTableViewController中的popViewControllerAnimated之前,事务似乎没有关闭

例外情况:
由于未捕获的异常“RLMException”而终止应用程序,原因:“试图在写入事务之外修改对象-首先在RLMRealm实例上调用beginWriteTransaction”。
我没有找到导致此异常的代码行

class DayOverviewController: UIViewController{
  @IBOutlet weak var mealTable: UITableView!
  let realm = try! Realm()
  var meals: Results<Meal>!
  var selectedMeal: Meal?

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    getMealsFromDay(selectedDate){
      self.mealTable.reloadData()
    }
  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "NewMeal" {
      let meal = Meal()
      meal.date = selectedDate
      let newMealController = segue.destinationViewController as! NewMealTableViewController
      newMealController.meal = meal
      newMealController.kindOfController = .InserterController
    }

    if segue.identifier == "EditMeal" {
      if let meal = selectedMeal{
        let updaterController = segue.destinationViewController as! NewMealTableViewController
        updaterController.meal = meal
        updaterController.kindOfController = .UpdaterController
      }
    }
  } 
}

extension DayOverviewController: UITableViewDataSource, UITableViewDelegate{

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("mealCell", forIndexPath: indexPath) as! MealOverviewCell
    cell.typeOfMealLabel.text = meals[indexPath.row].dishType
    cell.foodItemsLabel.text = meals[indexPath.row].foodItems
    cell.feedbackLabel.text = EmonjiCalculator.getEmonji(Array(meals[indexPath.row].reactions))
    return cell
  }

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedMeal = meals[indexPath.row]
    performSegueWithIdentifier("EditMeal", sender: self)
  }
}

extension DayOverviewController{
   func getMealsFromDay(selectedDate: NSDate, completionBlock : () -> Void ) {
     let dayStart = NSCalendar.currentCalendar().startOfDayForDate(selectedDate)
     let dayEnd: NSDate = {
       let components = NSDateComponents()
       components.day = 1
       components.second = -1
       return NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: dayStart, options: NSCalendarOptions())! 
      }()
     self.meals = realm.objects(Meal).filter("date BETWEEN %@", [dayStart, dayEnd])
     completionBlock()
   }

   func deleteMeal(meal: Meal){
     realm.beginWrite()
     realm.delete(meal.reactions)
     realm.delete(meal)
     try! realm.commitWrite()
   }
}


enum TypeOfController{
  case UpdaterController
  case InserterController
}

class NewMealTableViewController: UITableViewController, UITextViewDelegate{

  let realm = try! Realm()
  var meal: Meal!
  @IBOutlet weak var foodItemsTextView: UITextView!
  var kindOfController: TypeOfController!

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
      case let controller as MealSelectorTableViewController:
        controller.delegate = self
      case let controller as ReactionTableViewController:
        controller.reactionDelegate = self
        controller.meal = meal
      default: break
   }
}

  func saveMeal(saveButton: UIBarButtonItem){
    if kindOfController == .InserterController {
      insertNewMeal(){
        self.navigationController?.popViewControllerAnimated(true)
      }
    }
  }

  func textViewDidEndEditing(textView: UITextView) {
    if kindOfController == .UpdaterController{
      updateMeal{
        self.meal.foodItems = textView.text
      }
    } else {
      meal.foodItems = textView.text
    }
  }
}

extension NewMealTableViewController{

  func updateMeal(updateBlock: ()->()){
    try! realm.write(){
      updateBlock()
    }
  }

  func insertNewMeal(completionBlock: () -> ()){
    meal.id = NSUUID().UUIDString
    realm.beginWrite()
    realm.add(meal)
    try! realm.commitWrite()
    completionBlock()
  }
}
class DayOverviewController:UIViewController{
@IBV弱var测量表:UITableView!
让realm=try!realm()
结果!
var Selected美餐:美餐?
覆盖功能视图将出现(动画:Bool){
超级。视图将显示(动画)
GetMeasFromDay(选定日期){
self.mealTable.reloadData()
}
}
覆盖函数prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?){
如果segue.identifier==“newmein”{
吃饭
用餐日期=所选日期
让newMealController=segue.destinationViewController为!NewMealTableViewController
newMealController.fine=膳食
newMealController.kindOfController=.InserterController
}
如果segue.identifier==“editMine”{
如果让膳食=已选择的膳食{
将updaterController=segue.destinationViewController设为!NewMealTableViewController
updaterController.mean=膳食
updaterController.kindOfController=.updaterController
}
}
} 
}
扩展日期概览控制器:UITableViewDataSource、UITableViewDelegate{
func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(“mealCell”,forIndexPath:indexPath)作为!MealVersionCell
cell.typeOfMealLabel.text=膳食[indexPath.row].dishType
cell.foodItemsLabel.text=膳食[indexPath.row].foodItems
cell.feedbackLabel.text=EmonjiCalculator.getEmonji(数组[indexPath.row].reactions))
返回单元
}
func tableView(tableView:UITableView,didSelectRowAtIndexPath:nsindepath){
selectedMeal=finds[indexPath.row]
performsguewithidentifier(“编辑餐”,发件人:self)
}
}
扩展DayOverview控制器{
func getMealsFromDay(所选日期:NSDate,completionBlock:()->Void){
让dayStart=NSCalendar.currentCalendar().startOfDayForDate(selectedDate)
let dayEnd:NSDate={
let components=NSDateComponents()
组件。天=1
组件。秒=-1
返回NSCalendar.currentCalendar().dateByAddingComponents(components,toDate:dayStart,options:NSCalendarOptions())!
}()
self.fines=realm.objects(fine.filter(“日期介于%@,[dayStart,dayEnd]”之间)
completionBlock()
}
func deletemine(餐:餐){
realm.beginWrite()
realm.delete(膳食反应)
域。删除(膳食)
试试看!realm.commitWrite()
}
}
枚举类型控制器{
案例更新控制器
机箱插入控制器
}
类NewMealTableViewController:UITableViewController、UITextViewDelegate{
让realm=try!realm()
饭:饭!
@IBOutlet弱var foodItemsTextView:UITextView!
控制器类型:控制器类型!
覆盖函数prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?){
开关segue.destinationViewController{
案例let控制器作为MealSelectorTableViewController:
controller.delegate=self
case let控制器作为ReactionTableViewController:
controller.reactionDelegate=self
controller.fine=进餐
默认值:中断
}
}
func保存餐(保存按钮:UIBarButtonItem){
如果kindOfController=.InserterController{
InsertNewMein(){
self.navigationController?.popViewControllerAnimated(真)
}
}
}
func textViewDidEndEditing(文本视图:UITextView){
如果kindOfController==.UpdaterController{
更新的{
self.fine.foodItems=textView.text
}
}否则{
foodItems=textView.text
}
}
}
扩展NewMealTableViewController{
func updateMeal(updateBlock:()->()){
试试!realm.write(){
updateBlock()
}
}
func INSERTNEWMEIN(completionBlock:()->()){
dine.id=nsuid().uuiString
realm.beginWrite()
添加(膳食)
试试看!realm.commitWrite()
completionBlock()
}
}

看起来是代码的这一部分:

} else {
  meal.foodItems = textView.text
}
它应该位于方法
updateMeal()
的闭包内

编辑2: 我建议:

} else {
    try! realm.write(){
        meal.foodItems = textView.text
    }
}


在那一刻吃饭是不会坚持的。这只是一个普通的用餐对象。你能解释一下吗?因为我不明白。
self.fine.foodItems=textView.text
fine.foodItems=textView.text
是等价的语句(在您的代码示例中),无论是否持久化。您正在执行写入更改,它应该位于写入块中。我正在使用NewMealTableViewController添加新的膳食或进行更新。更新时-我使用一个持久化对象,直接来自领域;当插入时,我在segue中输入一个空的用餐对象:如
mean()
查看编辑,我会这样做,看看是否有帮助。从文本的墙壁上看,代码可能失败的地方并不十分清楚。这一个也是
fine.id=nsuid().UUIDString
。是啊哈
realm.beginWrite()
meal.id = NSUUID().UUIDString
realm.add(meal)
try! realm.commitWrite()
completionBlock()