2017-02-03 16 views
0

ユーザーがtableViewセル内のボタンを押すと、そのセルのデータをtableViewが配置された配列から取得する必要があります。そのデータを使用した後、そのセルはtableViewから削除されます。タグを使用してTableView内のデータを取得する際の問題

ボタンを押したセルのインデックスを知るためにタグを使用しています。しかし、一度テーブルビューの中央にあるセルが配列からそのデータとともに削除されると、tableView内のさらに下にあるセルには、配列の境界から外れたタグを持つボタンが表示されます。

array.length = 3 
  • セル0(buttonタグ:0)
  • セル1(buttonタグ:1)
  • セル2(buttonタグ:2)例えば

ユーザー次いでセル1内のボタンを押してアレイとテーブルから削除します。

  • セル0(ボタンタグ:0)
  • セル2(buttonタグ:私はアプリがクラッシュするタグを使用してアレイからそのセルのデータを取得しようとすると、2)

問題は今、ユーザーがセル2を押した場合ということです私は範囲外のインデックスにアクセスしているからです。したがって、私はタグを使用することは良い選択肢ではないと思うようになってきています。私は、より良い方法が何か不思議です。ここに私のコードです:

var invitesArray = [userInfo]() 

func declineInvite(sender: UIButton!) { 
    let info = invitesArray[sender.tag] 
    // I use info to process data 

    // Remove cell's data from array and remove cell from table 
    inviteTable.beginUpdates() 
    inviteTable.deleteRows(at: [IndexPath(row: sender.tag, section: 0)], with: UITableViewRowAnimation.automatic) 
    invitesArray.remove(at: sender.tag) 
    inviteTable.endUpdates() 
} 

// Populating the tableView 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = inviteTable.dequeueReusableCell(withIdentifier: "inviteCell", for: indexPath) as! joinCell 
    cell.declineButton.tag = indexPath.row 
    cell.declineButton.addTarget(self, action: #selector(self.declineInvite), for: UIControlEvents.touchUpInside)  
    return cell 
} 

誰でも私の素朴な方法を是正するのに役立つことができますか?

+0

行番号に基づくタグの使用は、行を挿入、削除、または移動できない場合にのみ機能します。 – rmaddy

+0

はい、私はそれを理解していますので、この質問 – MarksCode

+0

[スイフトの可能な重複:セル内のボタンがタップされたときにindexpath.rowを取得する方法?](http://stackoverflow.com/questions/28659845/swift-how- index-get-the-get-the-get-the-cell-as-a-button-as-a-cell-as-tapped) – Shades

答えて

1

タグを使用しないでください。 UITableViewには、indexPathを与える関数indexPathForCellがあります。アイテムを追加または削除するときは、モデルがテーブルビューと同期する必要があるため、このindexPathを使用して配列にインデックスを付ける必要があります。タグはめったに必要ではなく、通常は悪い習慣です。

関連する問題