Come accedere al contenuto di una cella personalizzata in modo rapido usando il tag button?

Ho un’app con un pulsante personalizzato in una cella personalizzata. Se si seleziona la cella che segue per una vista di dettaglio, che è perfetta. Se seleziono un pulsante in una cella, il codice sottostante stampa l’indice della cella nella console.

Devo accedere al contenuto della cella selezionata (utilizzando il pulsante) e aggiungerli a un array o dizionario. Sono nuovo di così difficile da capire come accedere ai contenuti della cella. Ho provato a usare didselectrowatindexpath, ma non so come forzare l’indice ad essere quello del tag …

Quindi, in sostanza, se ci sono 3 celle con “Dog”, “Cat”, “Bird” come cell.repeatLabel.text in ogni cella e seleziono i pulsanti nelle righe 1 e 3 (Indice 0 e 2), dovrebbe aggiungi “Cane” e “Uccello” all’array / dizionario.

// MARK: - Table View override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postsCollection.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell // Configure the cell... var currentRepeat = postsCollection[indexPath.row] cell.repeatLabel?.text = currentRepeat.product cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat) cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton cell.checkButton.tag = indexPath.row; cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside) return cell } func selectItem(sender:UIButton){ println("Selected item in row \(sender.tag)") } 

OPZIONE 1. Gestirlo con delega

Il modo corretto di gestire gli eventi generati dalle visualizzazioni secondarie della tua cella consiste nell’utilizzare la delega .

Quindi puoi seguire i passaggi:

1. Sopra la tua definizione di class scrivi un protocollo con un singolo metodo di istanza all’interno della tua cella personalizzata:

 protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) } 

2. All’interno della definizione della class dichiarare una variabile delegata e chiamare il metodo protocollo sul delegato:

 var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) } 

3. Conformi a CustomCellDelegate nella class in cui la vista tabella è:

  class ViewController: CustomCellDelegate 

4. Imposta il delegato della tua cella

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell cell.delegate = self return cell } 

5. Implementare il metodo richiesto nella class del controller di visualizzazione.

EDIT: prima definire un array vuoto e quindi modificarlo in questo modo:

 private var selectedItems = [String]() func cellButtonTapped(cell: CustomCell) { let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)! let selectedItem = items[indexPath.row] if let selectedItemIndex = find(selectedItems, selectedItem) { selectedItems.removeAtIndex(selectedItemIndex) } else { selectedItems.append(selectedItem) } } 

dove items è un array definito nel mio controller di visualizzazione:

 private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 

OPZIONE 2. Gestione tramite chiusure

Ho deciso di tornare e mostrarti un altro modo di gestire questo tipo di situazioni. Usando una chiusura in questo caso si otterrà meno codice e raggiungerai il tuo objective.

1. Dichiara una variabile di chiusura all’interno della class della tua cella:

 var tapped: ((CustomCell) -> Void)? 

2. Richiama la chiusura all’interno del gestore di pulsanti.

 @IBAction func buttonTapped(sender: AnyObject) { tapped?(self) } 

3. In tableView(_:cellForRowAtIndexPath:) nella class del controller della vista contenente:

 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.tapped = { [unowned self] (selectedCell) -> Void in let path = tableView.indexPathForRowAtPoint(selectedCell.center)! let selectedItem = self.items[path.row] println("the selected item is \(selectedItem)") } 

Dato che hai 1 sezione nella vista tabella puoi ottenere l’object cella come sotto.

 let indexPath = NSIndexPath(forRow: tag, inSection: 0) let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell! 

dove tag otterrai dal tag button.

Swift 3 Ho appena ottenuto la soluzione per la cella di accesso nella funzione @IBAction usando la superview del tag button.

 let cell = sender.superview?.superview as! ProductCell var intQty = Int(cell.txtQty.text!); intQty = intQty! + 1 let strQty = String(describing: intQty!); cell.txtQty.text = strQty 
 @IBAction func buttonTap(sender: UIButton) { let button = sender as UIButton let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)! } 

Ho aggiornato l’opzione 1 della risposta di Vasil Garov per Swift 3

1. Crea un protocollo per CustomCell :

 protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) } 

2. Per TableViewCell dichiarare una variabile delegate e richiamare il metodo del protocollo su di essa:

 var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) } 

3. Conformi a CustomCellDelegate nella class in cui il tuo tableView è:

  class ViewController: CustomCellDelegate 

4. Imposta il delegate della tua cella

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as CustomCell cell.delegate = self return cell } 

5. Implementare il metodo richiesto nel ViewController .

Sulla base della risposta di Cao, ecco una soluzione per gestire i pulsanti in una cella di visualizzazione della raccolta.

  @IBAction func actionButton(sender: UIButton) { let point = collectionView.convertPoint(sender.center, fromView: sender.superview) let indexPath = collectionView.indexPathForItemAtPoint(point) } 

Si tenga presente che la chiamata alla funzione convertPoint () tradurrà le coordinate del punto del pulsante nello spazio della vista dell’insieme. Senza , indexPath farà sempre riferimento allo stesso numero di cella 0

XCODE 8: Nota importante

Non dimenticare di impostare i tag su un valore diverso da 0.

Se provi a lanciare un object con tag = 0, potrebbe funzionare ma in alcuni casi strani non è così.

La soluzione è impostare i tag su valori diversi. Spero che aiuti qualcuno.