根据Section index

时间:2017-04-27 18:59:48

标签: ios swift uitableview core-data

我是IOS开发的新手,并尝试制作我的第一个应用程序(当你可以选择锻炼计划或创建自定义计划时,像锻炼跟踪器这样的东西)。 当我使用CoreData时,我有下一个dataModel - DataModel。 当用户可以在程序中添加更多日期时,我有一个屏幕,并在特定日期添加更多运动。 此屏幕由tableView显示,其中Days - 是部分,属于特定日期的练习 - 是行。 tableView由FetchedResultsController填充数据:

 fileprivate lazy var fetchedResultController: NSFetchedResultsController<Exercise> = {
    let fetchRequest:NSFetchRequest<Exercise> = Exercise.fetchRequest()
    let sortDescriptor = NSSortDescriptor(key: "day.weekDayNum", ascending: true)
    let sortDesctiptor2 = NSSortDescriptor(key:"countingNumber", ascending: true)
    fetchRequest.predicate = NSPredicate(format: "day.programm = %@", self.selectedProgramm)
    fetchRequest.sortDescriptors = [sortDescriptor, sortDesctiptor2]
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:self.managedObjectContext, sectionNameKeyPath:  #keyPath(Exercise.day.weekDayNum), cacheName: nil)
    fetchedResultsController.delegate = self
    return fetchedResultsController
}()

为了在当天添加新练习(部分),我有一个带标签的自定义章节标题和&#34;添加练习&#34;用于将练习添加到特定部分(日)的按钮。 为此,我需要一种方法来识别用户点击的部分索引。在这里我所做的就是提供这种能力 - 1)因为我的部门名称由Day&#34; weekDayNum&#34;表示。 int16属性 - 我可以将此num分配给tableView的viewForHeaderInSection中的AddExercise按钮TAG。 - &GT;

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView()
    view.backgroundColor = UIColor.red.withAlphaComponent(0.5)

    let button = UIButton()

    button.setTitle("Add Ex", for: .normal)
    button.addTarget(self, action: #selector(addExerciseToDay(sender: )), for: .touchUpInside)

    let label = UILabel()
    guard let sectionInfo = fetchedResultController.sections?[section] else { fatalError("Unexpected Section") }
    label.text = "Day:" + "\(sectionInfo.name)"
    button.tag = Int(sectionInfo.name)!

    view.addSubview(label)
    view.addSubview(button)

2)当用户按下此按钮时,将调用segue

 func addExerciseToDay(sender: UIButton){
    performSegue(withIdentifier: "AddExerciseSegue", sender: sender)
    print("Bttn touched at day num \(sender.tag)")
}

}然后我找到那天并将其传递给下一个VC,并选择所有练习列表

 if segue.identifier == "AddExerciseSegue"{
        if let sender = sender as? UIButton?{
            let weekDayNum = sender?.tag
            let day = Day.getDay(forProgram: selectedProgramm, withWeekDayNum: weekDayNum!)
            let allExercisesVC = segue.destination as! AllExercisesViewController
            allExercisesVC.managedObjectContext = self.managedObjectContext
            allExercisesVC.selectedDay = day
        }

我只是将选定的运动分配到那一天。 它对我来说很好,但最有意思的部分是在我尝试将新的一天添加到程序时开始的。 为此,我有UITabBarButton,其工作方式与之前的AddExercise bttn几乎相同(因为要显示的部分(日)我需要在新的一天(部分)添加至少一个练习)。 这里代码 - &gt;

@IBAction func addDayButtonPressed(_ sender: UIBarButtonItem) { performSegue(withIdentifier: "AddExerciseSegue", sender: sender) }

  if let _ = sender as? UIBarButtonItem?{
            print("\(String(describing: selectedProgramm.days?.allObjects.count))")
            let day = Day(withWeekDayNum: Int16((selectedProgramm.days!.allObjects.count + 1)))
            selectedProgramm?.addToDays(day)
            let allExercisesVC = segue.destination as! AllExercisesViewController
            allExercisesVC.managedObjectContext = self.managedObjectContext
            allExercisesVC.selectedDay = day

        }

Day(withWeekDayNum:..) - 只是方便的init.AndDayNum计算为此程序中所有天数的计数+ 1,以便将其添加为tableView上的最后一天。 它也可以正常工作,但前提是你只删除或添加最后一部分(作为堆栈)。但是,如果,例如,我有3天,我删除第二个,然后尝试添加新的一天 - 它只是添加练习到第3天,但不要创建第四天的运动,因为它应该。我明白为什么会发生这种情况 - 因为在删除我的第二天之后 - 这个节目中的所有日子的数量是2.而前三天仍然有周日日数= 3.正如我之前说的那样&#34; weekDayNum计算为此计划中所有天数的计数+ 1,以便将其添加为tableView上的最后一天。&#34;因此2 + 1 = 3..不是4。 我需要根据&#34; REAL SECTION NUMBER&#34;更新我的weekDayNum日属性的方法。当你删除第二天 - 第三天成为第二天 - 下一个 - 第三天,下一个第四天.. 那是真的吗?或者我的方法是完全错误的,如果是 - 我会很高兴听到另一个。 对于错误的抱怨,英语不是我的第一语言。 先感谢您!

//对于下面的评论 - 这里是FRC委托方法,但在我看来,我需要一种方法来手动&#34;告诉FRC更新 weekDayNum 属性,因为DAY实体的INDEX和weekDayNum属性是单独的东西。

extension FillUPProgrammViewController: NSFetchedResultsControllerDelegate{

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    tableView.beginUpdates()
}


func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .delete:
        tableView.deleteRows(at: [indexPath!], with: .fade)
    case .insert:
        tableView.insertRows(at: [newIndexPath!], with: .fade)
    default:
        break
    }
}


func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    tableView.endUpdates()
}



func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
    switch type {
    case .delete:
        tableView.deleteSections(IndexSet(integer:sectionIndex), with: .fade)
    case .insert:
        tableView.insertSections(IndexSet(integer:sectionIndex), with: .fade)
    default :
        break
    }
}

}

0 个答案:

没有答案