0

我在一个视图控制器中拥有两个表视图,这两个视图控制器都拥有彼此不相关的不同类型的数据。出于某种原因,无论何时向任何项目添加新数据,应用程序崩溃都会将新数据添加到两个表视图中,而不是仅添加一个。我试图将数据添加到正确的表格视图。这是我的代码。当我将核心数据添加到表视图时,我的应用崩溃

var tasks: Todo! 
var progress: [Millestone] = [] 
var milestone: Millestone! 
var list: [Todo] = [] 

var taskfetch: NSFetchedResultsController<Todo>! 
var progressfetch : NSFetchedResultsController<Millestone>! 


    let fetching: NSFetchRequest<Todo> = Todo.fetchRequest() 
    let sorting = NSSortDescriptor(key: "dateadded", ascending: true) 
    fetching.predicate = NSPredicate(format: "projectname = %@", "\(title! as String)") 
    fetching.sortDescriptors = [sorting] 
    if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) { 
     let context = appDelegate.persistentContainer.viewContext 
     taskfetch = NSFetchedResultsController(fetchRequest: fetching, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
     taskfetch.delegate = self 

     do { 
      try taskfetch.performFetch() 
      if let fetchedObjects = taskfetch.fetchedObjects { 
       list = fetchedObjects 
      } 
     } catch { 
      print(error) 
     } 
    } 

    let lining: NSFetchRequest<Millestone> = Millestone.fetchRequest() 
    let sorting2 = NSSortDescriptor(key: "dateadded", ascending: true) 
    lining.predicate = NSPredicate(format: "projectname = %@", "\(title! as String)") 
    lining.sortDescriptors = [sorting2] 
    if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) { 
     let context = appDelegate.persistentContainer.viewContext 
     progressfetch = NSFetchedResultsController(fetchRequest: lining, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
     progressfetch.delegate = self 

     do { 
      try progressfetch.performFetch() 
      if let fetchedObjects = progressfetch.fetchedObjects { 
       progress = fetchedObjects 
      } 
     } catch { 
      print(error) 
     } 
    } 
func getdata() { 
    let context = (UIApplication.shared.delegate as! AppDelegate!).persistentContainer.viewContext 

    do { 
     print("getting") 


     let tasking = try context.fetch(Todo.fetchRequest()) 


     let progressname = try context.fetch(Millestone.fetchRequest()) 
    } catch{ 
     print("whoopsie") 
    } 
} 
let oktaskaction = UIAlertAction(title: "Add", style: .default, handler: {(action:UIAlertAction!) -> Void in 

     if text.textFields?[0].text != nil, text.textFields?[0].text != "" { 
      // self.taskTable.beginUpdates() 
      // let song = self.songs[indexPath.row] 
      //(UIApplication.shared.delegate as! AppDelegate).saveContext() 
      if let appDelegate = (UIApplication.shared.delegate as? AppDelegate){ 
       self.tasks = Todo(context: appDelegate.persistentContainer.viewContext) 
       self.tasks.taskname = text.textFields?[0].text 
       self.tasks.projectname = self.title 
       self.tasks.completed = false 
       let formatter = DateFormatter() 
       formatter.dateStyle = DateFormatter.Style.medium 
       formatter.timeStyle = DateFormatter.Style.none 
       self.tasks.dateadded = self.date 
       appDelegate.saveContext() 
      }else { 
       print("nothing there") 
       text.textFields?[0].placeholder = "did not enter text" 
      } 
      self.taskTable.refreshControl?.beginRefreshing() 
      self.getdata() 
      self.taskTable.reloadData() 

     } 

    }) 


    let okAction = UIAlertAction(title: "Add Milestone", style: .default, handler: {(action:UIAlertAction!) -> Void in 
     if text2.textFields?[0].text != nil, text2.textFields?[0].text != "", text2.textFields?[1].text != nil { 
      print("i'm working on adding the milestone") 
      if let appDelegate = (UIApplication.shared.delegate as? AppDelegate){ 
       self.milestone = Millestone(context: appDelegate.persistentContainer.viewContext) 
       self.milestone.progressname = text2.textFields?[0].text 
       self.milestone.date = text2.textFields?[1].text 
       self.milestone.projectname = self.title 
       appDelegate.saveContext() 
        print("adding to graph") 
        self.chartLegend.append(self.milestone.progressname!) 
        self.chartData.append(self.chartData.count + 1) 


       print("saved the new milestone") 
      }else { 
       print("nothing there") 
       text.textFields?[0].placeholder = "did not enter text" 
      } 
      self.milestoneTableView.reloadData() 
      self.projectlinechart.reloadData() 

     } 

    }) 
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    print("Begining") 
    print("\(list.count)") 
    print("\(progress.count)") 
    taskTable.beginUpdates() 
    milestoneTableView.beginUpdates() 

} 
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
    switch type { 
    case .insert: 

     if let newIndexPath = newIndexPath { 
       print("adding") 

      taskTable.insertRows(at: [newIndexPath], with: .fade) 
      milestoneTableView.insertRows(at: [newIndexPath], with: .fade) 

     } 
    case .delete: 
     if let indexPath = indexPath { 
      print("delete") 
      taskTable.deleteRows(at: [indexPath], with: .fade) 
      milestoneTableView.deleteRows(at: [indexPath], with: .fade) 

     } 
    case .update: 
     if let indexPath = indexPath { 
      print("updating") 
      taskTable.reloadRows(at: [indexPath], with: .fade) 
      milestoneTableView.reloadRows(at: [indexPath], with: .fade) 

     } 
    default: 
     print("doing something else") 
     taskTable.reloadData() 
     milestoneTableView.reloadData() 

    } 

    if let fetchedObjects = controller.fetchedObjects { 
     projects = fetchedObjects as! [Project] 
     list = fetchedObjects as! [Todo] 
     progress = fetchedObjects as! [Millestone] 
    } 
} 
    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
     print("ending") 
     print("\(list.count)") 
     print("\(progress.count)") 
     taskTable.endUpdates() 
     milestoneTableView.endUpdates() 



    } 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if tableView.tag == 1 { 
     return list.count 
    } else if tableView.tag == 2 { 
     return progress.count 
    } else { 
     return 0 
    } 
     } 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cellidentifier = "taskcell" 

    let cell = tableView.dequeueReusableCell(withIdentifier: cellidentifier, for: indexPath) as! TaskTableViewCell 
    if tableView.tag == 1 { 
     let tasks = list[indexPath.row]//this is where the crash occurs 
     cell.taskname.text = tasks.taskname 
     cell.taskname.adjustsFontSizeToFitWidth = true 
     if tasks.completed == true { 
      cell.accessoryType = .checkmark 
     } 



    } 
    } else if tableView.tag == 2 { 
     if let appDelegate = (UIApplication.shared.delegate as? AppDelegate){ 
      let progress2 = progress[indexPath.row] 
      if (progress2.progressname != nil), progress2.date != nil{ 
      cell.progressname.text = "\(progress2.progressname!) on \(progress2.date!)" 
      cell.progressname.adjustsFontSizeToFitWidth = true 
      self.chartData.append(self.chartData.count + 1) 
      chartLegend.insert(cell.progressname.text!, at: indexPath.row) 
      } else { 
       cell.progressname.text = "No Milestones" 
      } 

     } 

    } 


    return cell 
} 
+0

您可以分享应用程序崩溃的位置以及您收到的错误消息吗?这段代码 –

+0

确保应用程序崩溃让任务列表= [indexPath.row] 我得到的错误是致命的错误:NSArray的元素眼福雨燕阵列 –

+0

添加异常断点,然后再次运行。一般来说,如果这是一个核心数据问题,它会清楚地报告发生了什么并停止在线。同时共享控制台输出将非常有帮助。 –

回答

0

摆脱以下变量progresslist的。 fetchedResultsController正在跟踪对象的变化,所以当一个对象被删除,插入或移动时它会为你更新。通过将获取的结果复制到数组中,您可以在发生更改后查看过时的信息。相反,看看直接在fetchedResultsController的值(即接入self.taskfetch.fetchedObjects或使用self.taskfetch.object(at:indexPath)

这导致崩溃的原因是因为你的基础上修改的fetchedResultsController(一个或多个)的通知您,而不是更新的tableview更新表格中的行数,因为您查看的是陈旧的数据

另一个问题是,当两组数据中的任何一组数据发生更改时,您正在更新BOTH表。在所有的控制器方法中,首先检查它是哪个控制器,类似于if controller == taskfetch {

+0

是否有可能我需要使两种不同的方式改变每组数据的funcs? –

+0

我已经更新了我的回答,地址是 –

+0

谢谢,这是它 –

相关问题