2017-05-11 25 views
1

テーブルビューをセットアップし、データが変更されるとすぐにUIを更新したいと考えています。ディスパッチャでデータの変更をシミュレートします。しかし、問題は、テーブルが更新されないということです。 RxSwiftを使ってテーブルビューをセットアップしてデータ変更時のセルを更新する方法を説明できる人はいますか?RxSwift Observeableはデータ変更時にテーブルビューを更新しません

@IBOutlet private var tableView: UITableView! 
    let europeanChocolates: Variable<[Chocolate]> = Variable([]) 
    let disposeBag = DisposeBag() 

    //MARK: View Lifecycle 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    title = "Chocolate!!!" 
    setupCellConfiguration() 
    europeanChocolates.value = Chocolate.ofEurope 
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 
     var choclate = self.europeanChocolates.value[0] 
     choclate.countryName = "Denmark" 
    } 

    } 

    //MARK: Rx Setup 

    private func setupCellConfiguration() { 
    europeanChocolates.asObservable().bindTo(tableView.rx.items(cellIdentifier: ChocolateCell.Identifier, cellType: ChocolateCell.self)) { 
     row, chocolate, cell in 
     cell.configureWithChocolate(chocolate: chocolate) 
    } 
    .addDisposableTo(disposeBag) 
    } 

答えて

2

あなたはチョコレートの実装を提供didntのが、

DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 
    var choclate = self.europeanChocolates.value[0] 
    choclate.countryName = "Denmark" 
} 

にeuropeanChocolatesからあなたのチョコレートがあるので、私は、それはあなたが何も変更されない場合には、構造だと仮定新しいvar choclateにコピーされますが、決してそれを保存しません。これを試してみると簡単に確認できます

override func viewDidLoad() { 
    super.viewDidLoad() 
    title = "Chocolate!!!" 
    setupCellConfiguration() 
    europeanChocolates.value = Chocolate.ofEurope 
    europeanChocolates.asObservable().subscribe(onNext: { choco in 
     print("choco changed \(choco)") 
    }) 
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 
     var choclate = self.europeanChocolates.value[0] 
     choclate.countryName = "Denmark" 
    } 

    } 

「チョコが変更されました」と表示されないと思います。イム場合は、右これはあなたを助ける必要があります。

override func viewDidLoad() { 
    super.viewDidLoad() 
    title = "Chocolate!!!" 
    setupCellConfiguration() 
    europeanChocolates.value = Chocolate.ofEurope 
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 
     var choclate = self.europeanChocolates.value[0] 
     choclate.countryName = "Denmark" 
     self.europeanChocolates.value[0] = choclate 
    } 

    } 

それが解決しない場合は、この質問はRxCocoaと観測についてだったので、少しオフトピックである、ないどのようにチョコレートの実装を提供してくださいとChocolateCell

-3

データが変更された直後にtableViewをリロードする必要があります。 tableView呼び出しこれをリロードするには、次の

this.tableView.reloadData() 
+0

データをリロードする。 – beretis

関連する問題