Domanda Azione UIButton nella cella di visualizzazione tabella


Sto cercando di eseguire un'azione per un pulsante premuto all'interno di una cella di visualizzazione tabella. Il codice seguente è nella mia classe di controller della vista tabella.

Il pulsante è stato descritto come "sì" in una presa della mia classe di UITableViewCell chiamata requestsCell.

Sto usando Parse per salvare i dati e vorrei aggiornare un oggetto quando viene premuto il pulsante. Il mio array objectIds funziona bene, il cell.yes.tag stampa anche il numero corretto nei log, tuttavia, non riesco a ottenere quel numero nella mia funzione "connessa" per poter eseguire correttamente la mia query.

Ho bisogno di un modo per ottenere indexPath.row della cella per trovare il giusto objectId.

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as requestsCell

    // Configure the cell...

    cell.name.text = requested[indexPath.row]

    imageFiles[indexPath.row].getDataInBackgroundWithBlock{
        (imageData: NSData!, error: NSError!) -> Void in

        if error == nil {

            let image = UIImage(data: imageData)

            cell.userImage.image = image
        }else{
            println("not working")
        }    
    }

    cell.yes.tag = indexPath.row
    cell.yes.targetForAction("connected", withSender: self)

    println(cell.yes.tag)

    return cell
}


func connected(sender: UIButton!) {

    var query = PFQuery(className:"Contacts")
    query.getObjectInBackgroundWithId(objectIDs[sender.tag]) {
        (gameScore: PFObject!, error: NSError!) -> Void in
        if error != nil {
            NSLog("%@", error)
        } else {
            gameScore["connected"] = "yes"
            gameScore.save()
        }
    }

}

29
2018-03-06 08:24


origine


risposte:


Devi aggiungere un obiettivo per quel pulsante.

myButton.addTarget(self, action: "connected:", forControlEvents: .TouchUpInside)

E ovviamente devi impostare il tag di quel pulsante da quando lo stai usando.

myButton.tag = indexPath.row

È possibile ottenere questo sottoclasse UITableViewCell. Usalo nel generatore di interfaccia, rilascia un pulsante su quella cella, collegalo via presa e via.

MODIFICARE: Per ottenere il tag nella funzione connessa:

func connected(sender: UIButton){
    let buttonTag = sender.tag
}

EDIT2:

Questa risposta è stata fornita per swift 1.2, come suggerito nei commenti, la sintassi è leggermente diversa per il rapido 2.2.

myButton.addTarget(self, action: #selector(ClassName.FunctionName(_:), forControlEvents: .TouchUpInside)

Edit3:

Aggiornato per Swift 3

myButton.addTarget(self, action: #selector(ClassName.FunctionName.buttonTapped), for: .touchUpInside)

edit4:

Aggiornato per Swift 4

@objc func connected(sender: UIButton){
        let buttonTag = sender.tag
}

72
2018-03-06 09:05



La risposta accettata usando button.tag come portatore di informazioni che è stato effettivamente premuto il pulsante è solido e ampiamente accettato ma piuttosto limitato poiché un tag può solo contenere IntS.

Puoi utilizzare le straordinarie funzionalità di chiusura di Swift per avere maggiore flessibilità e un codice più pulito.

Raccomando questo articolo: Come eseguire correttamente i pulsanti nelle celle di visualizzazione tabella utilizzando le chiusure Swift di Jure Zove.

Applicato al tuo problema:

  1. Dichiara una variabile che può contenere una chiusura nella tua vista tabella cellula piace

    var buttonTappedAction : ((UITableViewCell) -> Void)?
    
  2. Aggiungi un'azione quando viene premuto il pulsante che esegue solo la chiusura. L'hai fatto programmaticamente con cell.yes.targetForAction("connected", withSender: self) ma preferirei un @IBAction outlet :-)

    @IBAction func buttonTap(sender: AnyObject) {
       tapAction?(self)
    }
    
  3. Ora passa il contenuto di func connected(sender: UIButton!) { ... } come chiusura a cell.tapAction = {<closure content here...>}. Si prega di fare riferimento all'articolo per una spiegazione più precisa e, per favore, non dimenticare di interrompere i cicli di riferimento quando si catturano le variabili dall'ambiente.

31
2018-06-23 16:00



Modo semplice e facile per rilevare l'evento del pulsante ed eseguire un'azione

class youCell: UITableViewCell
{
    var yourobj : (() -> Void)? = nil
     override func awakeFromNib()
        {
        super.awakeFromNib()
        }

 @IBAction func btnAction(sender: UIButton)
    {
        if let btnAction = self.yourobj
        {
            btnAction()
        }
    }
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = youtableview.dequeueReusableCellWithIdentifier(identifier) as? youCell
        cell?.selectionStyle = UITableViewCellSelectionStyle.None

cell!. yourobj =
            {
                //Do whatever you want to do when the button is tapped here
                self.view.addSubview(self.someotherView)
        }

return cell

}

21
2017-12-29 06:11



Possiamo creare una chiusura per il pulsante e utilizzarla in cellForRowAtIndexPath

class ClosureSleeve {
  let closure: () -> ()

  init(attachTo: AnyObject, closure: @escaping () -> ()) {
    self.closure = closure
    objc_setAssociatedObject(attachTo, "[\(arc4random())]", self,.OBJC_ASSOCIATION_RETAIN)
}

@objc func invoke() {
   closure()
 }
}

extension UIControl {
func addAction(for controlEvents: UIControlEvents = .primaryActionTriggered, action: @escaping () -> ()) {
  let sleeve = ClosureSleeve(attachTo: self, closure: action)
 addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
 }
}

E poi in cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = youtableview.dequeueReusableCellWithIdentifier(identifier) as? youCell
    cell?.selectionStyle = UITableViewCellSelectionStyle.None

      button.addAction {
       //Do whatever you want to do when the button is tapped here
        print("button pressed")
      }

    return cell
 }

2
2018-06-20 06:14



Come Apple DOC

targetForAction: withSender:
Restituisce l'oggetto target a cui risponde   un'azione.

Non è possibile utilizzare questo metodo per impostare la destinazione UIButton.
Provare addTarget (_: azione: forControlEvents :) metodo


1
2018-03-06 08:39