2017-01-15 13 views
0

私は2つのラベルとボタンを持つカスタムUITableViewCellを持っています。セルは、それ自身のクラスがあります。テーブルビューを含むビューコントローラ内部Table Cellから情報を取得しますか?

class personTableCell: UITableViewCell { 
    @IBOutlet weak var nameLabel: UILabel! 
    @IBOutlet weak var emailLabel: UILabel! 

    @IBAction func inviteButtonPressed(_ sender: Any) { 
     self.accessoryType = .checkmark 
    } 
} 

を、私はこの方法で表にセルを追加:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "person", for: indexPath) as? personTableCell 
     cell?.nameLabel.text = results[indexPath.row].name 
     cell?.emailLabel.text = results[indexPath.row].email 
     return cell! 
} 

は、ユーザーが内部のボタンを押すとセルを@IBAction func inviteButtonPressedと呼びます。セルのラベルのテキストを、テーブルと同じビューコントローラで初期化された配列に追加します。

@IBAction func inviteButtonPressedがテーブルのビューコントローラとして別のファイルにある場合、どうすればこのようなことができますか?

+0

ない関連TableViewCellクラスで:鳥のためにあまりにも多くの質問と感嘆符。真剣に:決してテーブルビューのセル(ビュー)から情報を取得し、データソース配列(モデル)から取得してください – vadian

+0

@vadianはしっかりしてください? – MarksCode

+0

'dequeueReusableCell(withIdentifier:indexPath)'は非オプションのセルを返します。それはオプションのダウンキャストにはかなり馬鹿です。セルは明らかにInterface Builderで作成されているため、存在していることがわかります。 – vadian

答えて

1

デリゲートの使用は解決策の1つだと思います。

@objc protocol PersonTableViewCellDelegate { 
    func personTableViewCellInviteButtonPressed(cell: PersonTableViewCell) 
} 

class PersonTableViewCell: UITableViewCell { 

    weak var delegate: PersonTableViewCellDelegate? 

    @IBAction func inviteButtonPressed(_ sender: Any) { 
     delegate?.personTableViewCellInviteButtonPressed(cell: self) 
    } 

} 
のViewControllerクラスで

class TableViewController: UITableViewController, PersonTableViewCellDelegate { 

    var results: [Person] = [] 
    var invited: [Person] = [] 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "person", for: indexPath) as! PersonTableViewCell 
     cell.nameLabel.text = results[indexPath.row].name 
     cell.emailLabel.text = results[indexPath.row].email 
     cell.delegate = self 
     return cell 
    } 

    func personTableViewCellInviteButtonPressed(cell: PersonTableViewCell) { 
     guard let indexPath = tableView.indexPath(for: cell) else { 
      return 
     } 
     let person = results[indexPath.row] 
     invited.append(person) 
    } 

} 
関連する問題