如何解决保存数据数据并调用tableview.reloadData函数后,为什么不重载Tabe视图
我对为什么在调用tableView.reloadData()函数后不重新加载表视图感到困惑。这是您应该了解的我的项目。初始视图控制器是tableViewController,当您单击导航栏中的添加按钮时,它会拉起,显示“ addItemViewController”。它在overCurrentContext中显示。到目前为止,一切正常,但是不起作用的部分是当您在我创建的弹出窗口中填写信息并按下按钮进行保存时,它保存到核心数据填充中,但是当我重新加载它时,它什至没有叫那个。当我关闭应用程序并重新加载时,数据会显示出来,但是当我添加它并调用相同的函数时,它不会显示出来。
import UIKit
import CoreData
protocol reloadTableView: class {
func reloadTableView()
}
class TableViewController: UITableViewController {
//Global Variables
let addItemVC = AddItemController()
var itemArray = [Item]()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
override func viewDidLoad() {
super.viewDidLoad()
addItemVC.delegate = self
loadItems()
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return itemArray.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: Constants.cellIdentifier,for: indexPath) as! Cell
let array = itemArray[indexPath.row]
cell.dateCreated.text = array.dateCreated
cell.workoutLabel.text = array.workoutName
cell.weightLifted.text = array.weight
return cell
}
//MARK: - Add Button Pressed
@IBAction func addItemPressed(_ sender: UIBarButtonItem) {
let storyboard = UIStoryboard(name: "AddItem",bundle: nil)
let addItemVC = storyboard.instantiateViewController(identifier: "AddItemController")
addItemVC.isModalInPresentation = true
addItemVC.modalPresentationStyle = .overCurrentContext
addItemVC.modalTransitionStyle = .crossDissolve
addItemVC.navigationController?.isNavigationBarHidden = true
present(addItemVC,animated: true,completion: nil)
}
//MARK: - Create and Load Functions
func saveData() {
do {
try context.save()
} catch {
print("Error Saving Data \(error)")
}
tableView.reloadData()
}
func loadItems() {
let request: NSFetchRequest<Item> = Item.fetchRequest()
do {
itemArray = try context.fetch(request)
} catch {
print("error")
}
tableView.reloadData()
}
}
//MARK:// - Add Item Vc Delegate
extension TableViewController: reloadTableView {
func reloadTableView() {
do {
try context.save()
} catch {
print("Error Saving Data \(error)")
}
let request: NSFetchRequest<Item> = Item.fetchRequest()
do {
itemArray = try context.fetch(request)
} catch {
print("error")
}
tableView.reloadData()
print("There are",itemArray.count,"in the item array")
print(itemArray.last?.workoutName)
//the print statement are not showing up in console
}
}
和第二个文件
import UIKit
import CoreData
class AddItemController: UIViewController {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var delegate: reloadTableView?
@IBOutlet weak var viewContainer: UIView!
@IBOutlet weak var exercise: UITextField!
@IBOutlet weak var weight: UITextField!
@IBOutlet weak var reps: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addMaxPressed(_ sender: UIButton) {
if exercise.text != "" && weight.text != "" && reps.text != "" {
let newItem = Item(context: context)
let formatter = DateFormatter()
newItem.dateCreated = formatter.formattedDate()
newItem.weight = weight.text
newItem.reps = reps.text
newItem.workoutName = exercise.text
dismiss(animated: true) {
self.delegate?.reloadTableView()
}
}
}
@IBAction func exitPressed(_ sender: UIButton) {
dismiss(animated: true,completion: nil)
}
}
//MARK: - UITextField func
extension AddItemController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
}
解决方法
您将委托设置在添加项视图控制器的错误实例上。 您使用...创建一个实例。
let addItemVC = AddItemController()
...还有另一个...
let addItemVC = storyboard.instantiateViewController(identifier: "AddItemController")
您将委托设置为第一个,但要显示第二个。那意味着当你到达...
self.delegate?.reloadTableView()
...出现的控制器,什么也没发生。
如果您不使用第一个实例,则将其删除并在设置演示文稿样式的同一部分中设置委托。
将?
放在可选字符之后,表示您不想知道它是否满足您的要求。显然,您知道,所以您应该测试该值,如果该值不是您期望的值,则打印一条消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。