我正在研究一个基本的列表训练应用程序,它可以跟踪锻炼情况,然后记录每次锻炼的锻炼。我想扩展TableViewController的当前“编辑”模式,以允许更高级的编辑选项。以下是我到目前为止的情况:
如您所见,我在表格视图的顶部插入一个部分,以便可以编辑锻炼的标题。我面临的问题有两个:
我首先触发setEditing函数中的两个不同函数之一,根据布尔编辑是返回true还是false来切换到读取模式或编辑模式。
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: true)
tableView.setEditing(editing, animated: true)
if editing {
switchToEditMode()
} else {
switchToReadMode()
}
}
然后我将“addTitle”部分(在第二个图像中看到的文本字段)插入到一个名为tableSectionsKey的数组中,我用它来确定如何显示表(在下面进一步看到),然后重新加载表数据。
func switchToEditMode(){
tableSectionsKey.insert("addTitle", at:0)
self.tableView.reloadData()
}
func switchToReadMode(){
tableSectionsKey.remove(at: 0)
self.tableView.reloadData()
}
这是我的tableView数据方法。基本上它的要点是我有上面提到的名为tableSectionsKey的数组,并且我根据我所处的模式和应该显示的信息添加与部分相关的字符串。最初它只有“addExercise”,它与“Add exercise to routine”单元格
相关class WorkoutRoutineTableViewController: UITableViewController, UITextFieldDelegate, UINavigationControllerDelegate {
var tableSectionsKey = ["addExercise"]
}
然后在viewDidLoad中我添加“exercise”部分(用于练习列表),如果当前的训练例程有任何,我添加addTitle部分,如果它处于新模式,用于确定视图控制器是否正在通过添加新的锻炼按钮或从预先存在的锻炼列表中访问(以确定该页面是用于创建锻炼还是更新现有锻炼)
override func viewDidLoad() {
super.viewDidLoad()
if workoutRoutine.exercises.count > 0 {
tableSectionsKey.insert("exercise", at:0)
}
if mode == "new" {
tableSectionsKey.insert("addTitle", at: 0)
}
}
然后在cellForRowAt函数中,我根据表的一部分与tableSectionsKey数组中的索引的关系来确定如何设置单元格的样式
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let section = indexPath.section
let sectionKey = tableSectionsKey[section]
let cellIdentifier = sectionKey + "TableViewCell"
switch sectionKey {
case "addTitle":
guard let addTitleCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? AddTitleTableViewCell else {
fatalError("Was expecting cell of type AddTitleTableViewCell.")
}
setUpAddTitleTableViewCell(for: addTitleCell)
return addTitleCell
case "exercise":
guard let exerciseCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? ExerciseTableViewCell else {
fatalError("Was expecting cell of type ExerciseTableViewCell.")
}
let exercise = workoutRoutine.exercises[indexPath.row]
setUpExerciseTableViewCell(for: exerciseCell, with: exercise)
return exerciseCell
case "addExercise":
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
return cell
default:
fatalError("Couldn't find section: \(section), in WorkoutRoutineTableView" )
}
}
private func setUpExerciseTableViewCell(for cell: ExerciseTableViewCell, with exercise: Exercise) {
let titleText = exercise.name
let detailsText = "\(exercise.sets)x\(exercise.reps) - \(exercise.weight)lbs"
cell.titleLabel.text = titleText
cell.detailsLabel.text = detailsText
}
private func setUpAddTitleTableViewCell(for cell: AddTitleTableViewCell) {
cell.titleTextField.delegate = self
if (workoutRoutine.title != nil) {
cell.titleTextField.text = workoutRoutine.title
}
// Set the WorkoutRoutineTableViewController property 'titleTextField' to the 'titleTextField' found in the addTitleTableViewCell
self.titleTextField = cell.titleTextField
}
这不是我的所有代码,但我相信所有可能与此问题相关的代码。如果不是,请让我知道缺少什么,我会更新它。
感谢所有花时间回答我的人。
答案 0 :(得分:0)
您的动画问题是由于reloadData
的使用造成的。您需要将reloadData
的用法替换为仅插入或删除一个部分的调用。
func switchToEditMode(){
tableSectionsKey.insert("addTitle", at:0)
let section = IndexSet(integer: 0)
self.tableView.insertSections(section, with: .left) // use whatever animation you want
}
func switchToReadMode(){
tableSectionsKey.remove(at: 0)
let section = IndexSet(integer: 0)
self.tableView.deleteSections(section, with: .left) // use whatever animation you want
}