2014-09-16 6 views
18

У меня есть подкатегория UITableViewCell и связанный с ним xib. У меня есть UILabel и UIButton в этой ячейке, и я подключил сенсорный экран к подклассу внутри кнопки.Получите IndexPath из подкласса UITableViewCell в Swift

Что мне нужно, когда эта кнопка в ячейке используется, чтобы получить индексный путь ячейки, у которой есть эта кнопка. И, возможно, отправьте его обратно в контроллер просмотра через делегат или что-то в этом роде.

Поскольку я внутри подкласса UITableViewCell, я не могу использовать такое решение, как this, потому что у меня нет ссылки на представление таблицы внутри подкласса ячейки. После дальнейшего исследования я нашел решение another, и я реализовал его в Swift следующим образом.

import UIKit 

class ContactCell: UITableViewCell { 

    @IBOutlet weak var nameLabel: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     selectionStyle = .None 
    } 

    @IBAction func callButtonPressed(sender: UIButton) { 
     let indexPath = (self.superview as UITableView).indexPathForCell(self) 
     println("indexPath?.row") 
    } 

} 

Но когда я нажимаю на кнопку, она падает с сообщением об ошибке говоря Swift динамическое приведение не удалось.

Любая идея, что не так с моим кодом?

Или я открыт для любых других предложений, которые позволили бы мне достичь желаемого результата любым другим способом.

спасибо.

+0

Похоже, вам нужен делегат: http://stackoverflow.com/questions/24099230/delegates-in-swift – ullstrm

+0

В чем причина того, что вы знаете связанный indexPath? 'println (" indexPath? .row ")', очевидно, не является реальной причиной. Какова модель за всем этим? –

+0

@POB Причина в том, что я извлек методы источника данных tableview и поместил их в отдельный многоразовый класс, как описано в [this] (http://www.objc.io/issue-1/lighter-view-controllers. html). У моей пользовательской ячейки есть кнопка, и теперь мне нужно получить индексный путь ячейки, в которую нажата кнопка. – Isuru

ответ

19

Похоже, вам нужен делегат:

Delegates in swift?

Тогда просто передать саму клетку в качестве параметра делегата, а затем вы можете легко сделать tableView.indexPathForCell(cellFromDelegateMethod)

+0

Мне удалось добиться этого, используя делегатов. Спасибо. – Isuru

2

UIButton.Type действительно не есть член SuperView, но отправитель имеет

var cell: UITableViewCell = sender.superview.superview as UITableViewCell

+0

Это отличный способ сделать это, если вы используете просмотр коллекции, встроенный в табличное представление, и хотите включить взаимодействие для кнопок в ячейке просмотра коллекции, но все же разрешите вставлять ячейку cellview в соответствующие позиции таблицы – Tom

2

Эй вы также можете использовать «тег» кнопки. Внутри метода cellForRowAt делегата таблицы вы можете пометить кнопку с помощью Indexpath.row. вот пример, который я пытался сказать.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
// get ur cell nib .As it has a button 
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row } 

и в методе касания "sumbitOrContinue" -

func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag 
// do what you want to do like this example 

let detail = self.detailList[tag] 
let vc = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc 
vc.detailId = detail.id 
self.navigationController?.pushViewController(vc, animated: true)} 
Смежные вопросы