【发布时间】:2021-05-20 04:49:50
【问题描述】:
我对使用 swift 进行编程比较陌生,并且有一个问题一直困扰着我。
我有一个 TableView 控制器,您可以在其中输入电影的名称。 如果按下“完成”按钮,新输入的名称应出现在 TableView 中并与 CoreData 一起保存。 保存也很好用,但问题是新创建的名称只有在应用重启时才会出现在列表中。
现在我认为视图会用“tableView.reloadData()”重新加载。 不幸的是,他不会。
这就是我创建它的方式:
我的视图控制器:
import UIKit
class ViewController: UITableViewController {
static let filmCellIndentifier = "filmCell"
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.tableView.reloadData() // TODO: -> don´t reload Cell Data if "DoneButton" in "CreateFilmTableViewController" isn't pressed ???
}
override func viewDidLoad() {
super.viewDidLoad()
title = "Filmbook"
}
private func film(atIndexPath indexPath: IndexPath) -> Film {
return CoreDataManager.shared.availableFilms()[indexPath.row]
}
}
extension ViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return CoreDataManager.shared.numberOfFilms
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let filmCell = tableView.dequeueReusableCell(withIdentifier: ViewController.filmCellIndentifier, for: indexPath)
let film = self.film(atIndexPath: indexPath)
filmCell.textLabel?.text = film.title
return filmCell
}
}
我在这里创作一部新电影:
import UIKit
import CoreData
class CreateFilmTableViewController: UITableViewController {
@IBOutlet weak var datePicker: UIDatePicker!
@IBOutlet weak var titleTextField: UITextField!
@IBAction func dismissButton(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
@IBAction func createFilmButton(_ sender: Any) {
let title = titleTextField.text != nil ? titleTextField.text! : ""
let date = datePicker.date
CoreDataManager.shared.createFilmbook(withTitle: title, date: date)
dismiss(animated: true, completion: nil)
}
}
还有我的 CoreData 管理器:
import Foundation
import CoreData
class CoreDataManager {
static let shared = CoreDataManager()
var numberOfFilms: Int {
return availableFilms().count
}
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "FilmbookT")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
func createFilmbook(withTitle title: String, date: Date) {
let film = Film(context: persistentContainer.viewContext)
film.title = title
film.date = date
try! persistentContainer.viewContext.save() // TODO -> Error Handling -> ("try!")
}
func availableFilms() -> [Film] {
let filmFetchRequest = NSFetchRequest<Film>(entityName: "Film")
filmFetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
let availableFilms = try! persistentContainer.viewContext.fetch(filmFetchRequest) // TODO -> //Error Handling -> ("try!")
return availableFilms
}
}
你能帮我找出错误吗? 非常感谢! :)
【问题讨论】:
-
按下
done按钮时,您是否尝试过reloadData? -
是的,我试过了,但是没有效果...
标签: swift uitableview reloaddata