2017-01-15 1 views
0

У меня есть пользовательский UITableViewCell с 2 ярлыками и кнопкой. Клетка имеет собственный класс:Извлечь информацию из 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

Не относится: Слишком много вопросов и восклицательных знаков для птиц. Серьезно: никогда не получать информацию из ячейки представления таблицы (вид), получить ее из массива данных (модели) – vadian

+0

@vadian уточнить, пожалуйста? – MarksCode

+0

'dequeueReusableCell (withIdentifier: indexPath)' возвращает необязательную ячейку. Это довольно глупо, чтобы опционально сбрасывать его. Ячейка, очевидно, создана в Interface Builder, поэтому вы знаете, что она существует. – vadian

ответ

1

Я считаю, что использование делегата является одним из решений.

В TableViewCell классе

@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) 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^