2014-09-16 14 views
18

Ho una sottoclasse personalizzata UITableViewCell e il suo xib associato. Ho un UILabel e un UIButton in questa cella e ho collegato il ritocco all'interno dell'azione del pulsante alla sottoclasse.Ottieni IndexPath dall'interno di una sottoclasse UITableViewCell in Swift

Che cosa ho bisogno è quando quel pulsante nella cella è sfruttato, per ottenere l'indexpath della cellula che ha quel pulsante. E magari rimandalo al controller di visualizzazione tramite un delegato o qualcosa del genere.

Poiché sono all'interno di una sottoclasse UITableViewCell, non riesco a utilizzare una soluzione come this perché non ho un riferimento a tableview dall'interno della sottoclasse della cella. Dopo ulteriori indagini ho trovato la soluzione another e l'ho implementata in Swift in questo modo.

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

} 

Ma quando si tocca il tasto, si blocca con un messaggio di errore che dice Swift fusione dinamica fallito.

Qualche idea di cosa non funziona nel mio codice?

O io sono aperto a qualsiasi altri suggerimenti che mi permettesse di ottenere il risultato desiderato in qualsiasi altro modo.

Grazie.

+0

Suona come avete bisogno di un delegato: http://stackoverflow.com/questions/24099230/delegates-in-swift – ullstrm

+0

Qual è il motivo per cui è necessario conoscere il relativo indexPath? 'println (" indexPath? .row ")' non è ovviamente una vera ragione. Qual è il modello dietro tutto ciò? –

+0

@POB Il motivo è che ho eliminato i metodi dell'origine dati di tableview e li ho inseriti in una classe riutilizzabile separata come descritto in [questo] (http://www.objc.io/issue-1/lighter-view-controllers. html) articolo. La mia cella personalizzata ha un pulsante e ora ho bisogno di ottenere il percorso dell'indice della cella che viene toccato dal pulsante. – Isuru

risposta

19

Suona come avete bisogno di un delegato:

Delegates in swift?

Poi basta passare la cellula stessa come parametro al delegato, e allora si può facilmente fare tableView.indexPathForCell(cellFromDelegateMethod)

+0

Sono riuscito a ottenere questo utilizzando i delegati. Grazie. – Isuru

2

UIButton.Type in realtà non hanno membro superview, ma il mittente ha

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

+0

Questo è un ottimo modo per farlo se si utilizza una vista raccolta incorporata in una vista tabella e si desidera abilitare le interazioni per i pulsanti all'interno della cella della vista di raccolta, ma si può comunque consentire alla cella di raccolta della collezione embed di passare agli elementi della tabella corretta – Tom

2

Ehi puoi anche usare "Tag" del pulsante. All'interno del metodo cellForRowAt del delegato della tabella puoi taggare il pulsante con Indexpath.row. ecco l'esempio che ho cercato di dire.

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 } 

e nel metodo touch "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)}