在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图

Posted

技术标签:

【中文标题】在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图【英文标题】:Reload View from Modal View Controller with CoreData in Xcode 【发布时间】:2017-01-05 03:51:55 【问题描述】:

我正在关注有关如何使用 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)

    

有人知道这是怎么回事吗?

【问题讨论】:

这是因为您必须将其存储到持久存储中并再次获取它。之后,您必须重新加载表数据。如果您分享您的代码并将其添加到核心数据中,我可以提供帮助。 很简单,当你将新数据写入Core Data时,你需要编写你在ViewWillApper中编写的逻辑:getData() tableViewTest.reloadData() 谢谢!我确实使用添加按钮将其保存到持久存储中,并在 UIButton 中说 saveContext。这就是您将其保存到持久存储的意思吗?还有什么是强?再次感谢! 我 100% 得到了你的问题。但问题是没有看到你的代码我无法帮助你。 是不是像:(ControllerA 显示任务列表)和(ControllerB 将您的任务添加到 CoreData)。那么我想看到的代码是将任务添加到核心数据中并在将其保存到您正在执行的核心数据中之后的代码? 【参考方案1】:

请将您的 ModalPresantaion 样式更改为 Full Screen

请看下面的屏幕截图:

Select Segue First:

Change Its Presantation Style to Full Screen:

我建议您进行上述更改,因为:

您的ViewController 中的viewWillAppear 没有在您的popVCAdd 控制器的Dismissing 之后调用。

【讨论】:

以上是关于在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Xcode 10 和 Swift 4 中的界面构建器中解除模态序列 [重复]

如何在 xcode 中添加自定义模态序列?

swift 3 Xcode 8 中的 NSManagedObject 和 CoreData

关于 iPhone 应用程序结构的问题 - 核心数据、视图、模态视图等

从模态视图关闭的标签栏项目中删除选择图像

Xcode 显示在 CoreData 类上使用未声明类型