在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图
Reload View from Modal View Controller with CoreData in Xcode
我正在关注关于如何使用 CoreData 创建待办事项列表的 YouTube 教程,我的应用程序可以构建并且 运行 但是我没有使用另一个视图控制器来创建任务,而是创建了一个模态视图控制器显示在常规视图控制器上。问题是它将它保存到 CoreData 但仅在应用程序重置时显示,这是用于应显示任务的常规视图控制器的所有代码:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableViewTest: UITableView!
var tasks : [Task] = []
override func viewDidLoad() {
super.viewDidLoad()
tableViewTest.dataSource = self
tableViewTest.delegate = self
self.navigationController?.isNavigationBarHidden = true
}
override func viewWillAppear(_ animated: Bool) {
getData()
tableViewTest.reloadData()
}
func tableView(_ tableViewTest: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}
func tableView(_ tableViewTest: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let task = tasks[indexPath.row]
cell.textLabel?.text = task.name!
return cell
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
tasks = try context.fetch(Task.fetchRequest())
}
catch {
print("Fetch Error")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
这是模态视图控制器的代码,用户输入的信息是要保存到 CoreData 的信息:
class popVCAdd: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var popViewAc: UIView!
override func viewDidLoad() {
super.viewDidLoad()
popViewAc.layer.cornerRadius = 20
popViewAc.layer.masksToBounds = true
let toolbar = UIToolbar()
toolbar.sizeToFit()
textField.inputAccessoryView = toolbar
let keyboardDone = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.disappearKey))
toolbar.setItems([keyboardDone], animated: false)
}
@IBAction func doneBtn(_ sender: Any) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let task = Task(context: context)
task.name = textField.text!
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
@IBAction func dismissPop(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
func disappearKey() {
view.endEditing(true)
}
}
有人知道它有什么问题吗?
请将您的 ModalPresantaion
样式更改为 Full Screen
请参阅下面的屏幕截图:
Select Segue First:
Change Its Presantation Style to Full Screen:
我建议您进行上述更改,因为:
ViewController
的 viewWillAppear
没有在 popVCAdd
控制器的 Dismissing
之后调用。
我正在关注关于如何使用 CoreData 创建待办事项列表的 YouTube 教程,我的应用程序可以构建并且 运行 但是我没有使用另一个视图控制器来创建任务,而是创建了一个模态视图控制器显示在常规视图控制器上。问题是它将它保存到 CoreData 但仅在应用程序重置时显示,这是用于应显示任务的常规视图控制器的所有代码:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableViewTest: UITableView!
var tasks : [Task] = []
override func viewDidLoad() {
super.viewDidLoad()
tableViewTest.dataSource = self
tableViewTest.delegate = self
self.navigationController?.isNavigationBarHidden = true
}
override func viewWillAppear(_ animated: Bool) {
getData()
tableViewTest.reloadData()
}
func tableView(_ tableViewTest: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}
func tableView(_ tableViewTest: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let task = tasks[indexPath.row]
cell.textLabel?.text = task.name!
return cell
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
tasks = try context.fetch(Task.fetchRequest())
}
catch {
print("Fetch Error")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
这是模态视图控制器的代码,用户输入的信息是要保存到 CoreData 的信息:
class popVCAdd: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var popViewAc: UIView!
override func viewDidLoad() {
super.viewDidLoad()
popViewAc.layer.cornerRadius = 20
popViewAc.layer.masksToBounds = true
let toolbar = UIToolbar()
toolbar.sizeToFit()
textField.inputAccessoryView = toolbar
let keyboardDone = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.disappearKey))
toolbar.setItems([keyboardDone], animated: false)
}
@IBAction func doneBtn(_ sender: Any) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let task = Task(context: context)
task.name = textField.text!
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
@IBAction func dismissPop(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
func disappearKey() {
view.endEditing(true)
}
}
有人知道它有什么问题吗?
请将您的 ModalPresantaion
样式更改为 Full Screen
请参阅下面的屏幕截图:
Select Segue First:
Change Its Presantation Style to Full Screen:
我建议您进行上述更改,因为:
ViewController
的 viewWillAppear
没有在 popVCAdd
控制器的 Dismissing
之后调用。