2017-07-22 7 views
1

テーブルビューのデータがほとんどリフレッシュされるため、非常に奇妙に見えますが、実際には非常に重要なケースではリフレッシュされません。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.asynctableView.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が空

+0

削除するコードを表示します。構造体と配列はSwiftの値型であることを覚えておいてください – Paulw11

+0

質問を編集して追加のコードを追加してください。コメントで読むことは非常に難しいです – Paulw11

答えて

0

であることを示しています配列と構造体は値型なので、コピーに対する変更は反映されません。データソースを更新した後、ソースビューコントローラのデータソースも必ず更新してください。このためにデリゲートを実装する必要があるかもしれません。他の方法は、シングルトンを介して共通のデータソースを持つことですが、私はそれを示唆しません。

+0

こんにちは!ご連絡ありがとうございます。 ListsViewControllerのdataSourseはListsViewDataSource.listsArrayであり、 'extentionListViewDataSource:ParticularListViewControllerDelegate'のデリゲート関数' delete'を介して更新されています。 –

+0

そして、値型の配列に何らかの問題があるかどうかを修正することを理解していますか?内部配列が空にならなくなるまで、 'UITableView'がよくリフレッシュされているためです。内部配列が空になるとすぐに、 'UITableView'がリフレッシュをやめます。 –

+0

すべてが合意しました。あなたのtableView.dataSoure = dataSourceであり、自己ではありません。すなわちListsViewController。データソースのnumberOfRowsにブレークポイントを設定します。あなたが戻ってくる番号がまだ1であることに気がつくかもしれません。それを確認してください。 –

関連する問題