テーブルビューのデータがほとんどリフレッシュされるため、非常に奇妙に見えますが、実際には非常に重要なケースではリフレッシュされません。UITableViewのデータが特定のケースでリフレッシュされない
struct ItemsStructure {
var itemId: Int
var code: String
var externalId: Int
var manufactureName: String
var price: Double
var weight: Int
}
と含まれている構造が、最初のものです::
struct ListStructure {
var listId: Int
var createdDate: Date
var wasSent: Bool
var items: [ItemsStructure]
}
はまた、私は2
UITableViewController
秒を持っている
だから、私は2つの構造を持っています。最初のリストはListStructureの配列を示し、2番目のリストは特定の選択リストの内容を示しています。また、第2のコントローラは、リスト内の項目を削除することを可能にする。そして、問題は私が例えば3つのアイテムを持つリストを持っていることです。リストから最初と2番目のアイテムを削除して最初のコントローラに戻っている間、結果が表示されることがあります。しかし、最後のアイテムの削除は異なって見えます。最初のテーブルビューに戻ると、Listは空であるのに対し、Listにはアイテムが1つ含まれています。アプリケーションの終了と再開だけで空のリスト(項目なし)が表示されます。
はい、私はDispatchQueue.main.async
にtableView.reloadData()
を入れることについて読んだことがありますが、結果はDispatchQueueなしでtableView.reloadData()
と同じ結果になります。
リスト内のアイテムを持つすべての手動操作は、代理人を介して実行されます。リストの印刷は、リストが空であることを示します。
ベローはListViewController
class ListsViewController: UIViewController {
var dataSource: ListViewDataSource!
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = tableView.rowHeight
tableView.rowHeight = UITableViewAutomaticDimension
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.dataSource = dataSource
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowParticularItem" {
if let listVC = segue.destination as? ParticularListViewController {
let listNumberToPass = tableView.indexPathForSelectedRow!.row
let listToPass = dataSource.stateController.lists[listNumberToPass]
listVC.listNumber = listNumberToPass
listVC.list = listToPass
listVC.delegate = dataSource.self
}
}
}
}
protocol ParticularListViewControllerDelegate: class {
func delete(listNumber: Int, itemNumber: Int)
}
class ParticularListViewController: UITableViewController {
var listNumber: Int!
var list: ListStructure!
weak var delegate: ParticularListViewControllerDelegate?
@IBOutlet weak var creationTimeLabel: UILabel!
@IBOutlet weak var sentStatusLabel: UILabel!
@IBOutlet weak var weightLabel: UILabel!
@IBOutlet weak var totalCostLabel: UILabel!
@IBOutlet weak var sentListButtonOutlet: UIButton!
@IBAction func sentListButton(_ sender: UIButton) {
sentList()
markListAsSent()
refreshData()
}
func refreshData(){
self.creationTimeLabel.text = "The list was created at \(list.createdDate)"
if list.wasSent {
self.sentStatusLabel.text = "The list has been already sent"
self.sentListButtonOutlet.isEnabled = false
} else {
self.sentStatusLabel.text = "The list hasn't been sent yet"
self.sentListButtonOutlet.isEnabled = true
}
let totalWeight: Int = list.items.reduce(0, {$0 + $1.weight})
self.weightLabel.text = "The list contains \(list.items.count) items with total weight \(totalWeight) gramms"
self.totalCostLabel.text = "The total cost is: \(list.totalCost) ₽"
tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
refreshData()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
refreshData()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return list.items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ParticularListTableViewCell
let index = indexPath.row
cell.item = list.items[index]
return cell
}
func delete(itemNumber: Int){
delegate?.delete(listNumber: listNumber, itemNumber: itemNumber)
self.refreshData()
}
}
extension ListViewDataSource: ParticularListViewControllerDelegate {
func delete(listNumber: Int, itemNumber: Int) {
stateController.delete(fromList: listNumber, itemNumber: itemNumber)
}
}
class ListViewDataSource: NSObject{
var stateController: StateController
init(stateController: StateController) {
self.stateController = stateController
}
のコードであります
}
extension ListViewDataSource: UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return stateController.lists.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ListsCell", for: indexPath) as! ListsTableViewCell
let index = indexPath.row
let listToPass = stateController.lists[index]
cell.listToShow = ListsTableViewCell.ListModel(model: listToPass)
return cell
}
}
class StateController{
fileprivate let storageController: StorageController
fileprivate(set) var lists: [ListStructure]
fileprivate let context: NSManagedObjectContext
init(storageController: StorageController, context: NSManagedObjectContext) {
self.storageController = storageController
self.context = context
self.lists = storageController.fetchAllLists(inContext: context)
}
}
及びIはListViewController.ViewWillAppear内部に印刷する前に言ったようstateController.lists.Itemsが空
削除するコードを表示します。構造体と配列はSwiftの値型であることを覚えておいてください – Paulw11
質問を編集して追加のコードを追加してください。コメントで読むことは非常に難しいです – Paulw11