2017-02-06 16 views
0

UITabelViewCellが押されたときに別のラベルテキストを取得しようとしていますが、動作させることができません。 completedのデフォルト値はfalseです。タッチするとtrueになり、ラベルを変更する必要があります。 didSelectRowAtの中ではcompletedの値が違うので良いですが、cellForRowAtに渡すことはできません。didSelectRowAtはcellForRowAtには影響しません

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    var listItems : [ListItem] = [] 

    @IBOutlet weak var plusButton: UIButton! 
    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
    //... 
    } 


    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return listItems.count 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     var item = listItems[indexPath.row] 

     item.completed = !item.completed // changing from true to false and rom false to true 
     tableView.reloadData() 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CellData{ 
      let item = listItems[indexPath.row] 
      cell.nameLabel.text = item.name 
      cell.userLabel.text = item.addedBy 

      if(item.completed == true){ //didSelectRowAt doesn't affect this item.completed 
       cell.doneLabel.text = "done" 
      } else { 
       cell.doneLabel.text = "not" 
      } 
      return cell 
     } else{ 
      return CellData() 
     } 
    } 
} 

ListItem.swift:

struct ListItem{ 
    var name : String! 
    var addedBy : String! 
    var completed : Bool! 

    init(name: String, addedBy: String, completed: Bool){ 
     self.name = name 
     self.addedBy = addedBy 
     self.completed = completed 
    } 

} 
+1

を、構造体がコピーされます。リスト自体のListItemインスタンスではなく、ListItemのコピーの状態を変更しています。 ListItemの状態を変更したら、listIems [indexPath.row]を新しい「スナップショット」に設定する必要があります。 – gschandler

答えて

3

あなたのListItemは、あなたがそれを更新する際、構造体は常にコピーされたとして、それがリストに更新されていない構造体です。 私はあなたが何かやるべきだと思う:スウィフトで

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    var item = listItems[indexPath.row] 
    item.completed = !item.completed // 
    listItems[indexPath.row] = item 
    tableView.reloadData() 
} 
+0

を使用するか、または突然変異関数 –

+0

を使用できます。実際には機能します。したがって、 'listItems [indexPath.row] = item'は、現在のインデックスのlistItemsの値を取得し、変更されたitem.completedのみを更新しますか?さらに、クラスに実装する方が簡単かもしれません。 – codddeer123

関連する問題