我有一个tableView,用户可以输入和删除其中的单元格。单击这些单元格之一,即可将用户带到与该单元格关联的视图。但是,当删除单元格并且所有行向上移动一位时,视图控制器不会移动。因此,假设您删除了第2行,那么第3行将移至第2行的位置,并且具有与第2行相同的视图控制器,而不是原始的3视图。
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
var selectedRow : Int = 0
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
selectedRow = indexPath.row
performSegue(withIdentifier: "ShowDetail", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? FavouritesViewController {
destination.row = selectedRow
}
}
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//MARK:- remove cell core data
let appDelegate = UIApplication.shared.delegate as! AppDelegate // force unwrapping is perfectly fine
// 1
let managedContext = appDelegate.persistentContainer.viewContext
managedContext.delete(self.favourites[indexPath.row])
self.favourites.remove(at: indexPath.row)
self.tableView.reloadData()
let impactFeedbackgenerator = UIImpactFeedbackGenerator(style: .heavy)
impactFeedbackgenerator.prepare()
impactFeedbackgenerator.impactOccurred()
}
}
func insertNewCell() {
guard save(name: addNewMemory.text!) else { return }
let indexPath = IndexPath(row: favourites.count - 1, section: 0)
tableView.insertRows(at: [indexPath], with: .automatic)
addNewMemory.text = ""
view.endEditing(true)
}
import UIKit
import CoreData
class FavouritesViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UITextViewDelegate {
var titleName: [NSManagedObject] = []
var titleString: String = ""
var row: Int!
@IBAction func doneButton(_ sender: UIButton) {
titleString = textField.text!
UserDefaults.standard.set(titleString, forKey: String(row))
print("Saved")
}
override func viewDidLoad() {
if UserDefaults.standard.object(forKey: String(row)) != nil {
textField.text = UserDefaults.standard.object(forKey: String(row)) as? String
}
}
我希望即使添加或删除了另一个单元格,每个单元格的视图也将保持不变。
答案 0 :(得分:0)
如果删除第2行的单元格,则第3行的单元格现在是第2行的单元格,因此当您选择它时,即为该行。
您不会在删除单元格的位置显示代码-在此,您还应该从模型中删除相应的项。在您的情况下,这很复杂,因为您要将字符串保存在以索引号为键的用户默认值中,因此要反映删除,您需要将其他所有项都移动到默认值以反映新索引。
如果ViewController
拥有用作数据模型的字符串数组,则维护起来会更容易。删除单元格时,将从阵列中删除相关项。执行segue时,会将适当的元素从数组传递到FavouritesViewController
。
我很想看看其余的代码-您如何填充单元格?删除行时单元格值会怎样?