Enviar fila y sección mediante label en el button Swift

Tengo este dentro cellForRowAtIndexPath

cell.plusBut.tag = indexPath.row cell.plusBut.addTarget(self, action: "plusHit:", forControlEvents: UIControlEvents.TouchUpInside) 

y esta function fuera:

 func plusHit(sender: UIButton!){ buildings[sender.tag].something = somethingElse } 

¿Es posible enviar indexPath.row y indexPath.section , o alguna alternativa?

¡Gracias!

EDITAR

Me acerqué así:

Mi button personalizado

 class MyButton: UIButton{ var myRow: Int = 0 var mySection: Int = 0 } 

Mi celda personalizada

 class NewsCell: UITableViewCell{ @IBOutlet weak var greenLike: MyButton! 

En CellForRowAtIndexPath

  cell.greenLike.myRow = indexPath.row 

Recibo un error en esta línea.

Puede crear una subclass de UIButton y crear una sección de propiedad adicional en ella. Y luego puedes utilizar esa class para el button de celda. Puedes hacer lo mismo para la fila.

Aquí hay algunas forms posibles después de subclasificar el UIButton

 cell.plusBut.tag = indexPath.row cell.plusBut.section = indexPath.section 

O

 cell.plusBut.row = indexPath.row cell.plusBut.section = indexPath.section 

O

 cell.plusBut.indexPath = indexPath 

Elige lo que más te convenga.

¿Es posible enviar indexPath.row y indexPath.section, o alguna alternativa?

Si impone un límite en el número de filas posibles en una sección, puede combinarlas en un solo número. Por ejemplo, si está dispuesto a decir que siempre habrá less de 1000 filas en una sección determinada, puede usar:

 cell.plusBut.tag = (indexPath.section * 1000) + indexPath.row 

y luego use los operadores de mod y split para recuperar:

 row = sender % 1000 section = sender / 1000 

Otra posibilidad es verificar la vista de supervisión del button (y su supervisión, etc.) hasta que encuentre la celda. Una vez que tenga la celda, puede get la ruta del índice para esa celda de la tabla.

Una tercera opción, quizás la mejor, es hacer que el button se dirija a la celda en lugar de a algún otro object. La celda puede activar una acción en el controller de vista u otro object que se utilice como remitente.

Swift 2.x: extensión con objects asociados

 private struct AssociatedKeys { static var section = "section" static var row = "row" } extension UIButton { var section : Int { get { guard let number = objc_getAssociatedObject(self, &AssociatedKeys.section) as? Int else { return -1 } return number } set(value) { objc_setAssociatedObject(self,&AssociatedKeys.section,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } var row : Int { get { guard let number = objc_getAssociatedObject(self, &AssociatedKeys.row) as? Int else { return -1 } return number } set(value) { objc_setAssociatedObject(self,&AssociatedKeys.row,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } } 

uso:

 //set cell.contextMenuBtn.section = indexPath.section cell.contextMenuBtn.row = indexPath.row //read func showContextMenu (sender:UIButton) { let track = dictionarySongs[sender.section][sender.row] ... } 

Sugiero otro enfoque. No me gusta la solución de subclass, no creo que el button deba saber su position. ¿Por qué no usar un dictionary para traducir el button a IndexPath?

 // First initialize the lookup table var buttonPositions = [UIButton: NSIndexPath]() // add each button to the lookup table let b = UIButton() let path = NSIndexPath(forItem: 1, inSection: 1) buttonPositions[b] = path // Looking it up works like this buttonPostions[activeButton]?.row 

Puede asignar una label personalizada para un button UIB por extensión, eche un vistazo:

 extension UIButton { private struct ButtonTag { static var tagKey = "key" } var myTag : (Int , Int)? { set { if let value = newValue { objc_setAssociatedObject(self, &ButtonTag.tagKey, value as! AnyObject, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } get { return objc_getAssociatedObject(self, &ButtonTag.tagKey) as? (Int , Int) } } }