Customiser AccessoryView

Bonjour,


 


Je chercher à  personnaliser le button accessory d'une tableView qui est par défaut un i dans un cercle. J'ai ajouter le code suivant :



  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// ...
 cell.accessoryView = UIImageView(image: UIImage(named: "ARI")!)
//....
return cell
}

Cela change bien l'image mais 



func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath)

 n'est jamais appelé :-(


Réponses

  • CéroceCéroce Membre, Modérateur

    Essaye imageView.userInteractionEnabled = true.


  • iLandesiLandes Membre
    octobre 2016 modifié #3

    Merci de ton conseil, mais si ce que tu voulais dire c'est :



    let accessoryView = UIImageView(image: UIImage(named: "ARI")!)
    accessoryView.userInteractionEnabled = true
    cell.accessoryView = accessoryView

    Le bouton reste sans effet


  • C'est parce que userInteractionEnabled est par défaut à  false sur les UIImageView. C'est une question que je vois régulièrement sur StackOverFlow.


     


    Après, si tu utilises Swift 3.0, voici la signature de la méthode de UITableViewDelegate :



    optional func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath)

    Note qu'elle n'est pas identique à  la tienne (y'a un under_score, et c'est accessoryButtonTappedForRowWith, pas accessoryButtonTappedForRowWithIndexPath), ce qui pourrait être lié à  ce genre de questions. Je ne parle toujours pas Swift, mais j'ai vu pas mal de questions sur SO traitant de ce problème.




  • Après, si tu utilises Swift 3.0




     


    Non je suis sur Swift 2.2 :o

  • Voilà  ou j'en suis :


     


     



        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            
           //....
                
                let ariButton: UIButton = UIButton(type: .Custom)
                ariButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
                ariButton.addTarget(self, action: #selector(CalendarViewController.testAri) , forControlEvents: .TouchUpInside)
                ariButton.setImage(UIImage(named: "ARI"), forState: .Normal)
                cell.accessoryView = ariButton as UIView

               //?? 
                return cell     
            
        }
     
        func testAri() {
            print ("ari")
        }
        
        func testAriIndex (i: NSIndexPath) {
            print ("Ari : \(i)")
            
        }

    Cela fonctionne si je veux appeler testAri quand le bouton est pressé mais si je veux récupérer un paramètre par exemple avec testAirIndex(i: NSIndexPath) ça ne fonctionne pas.


     


    Au mieux j'arrive à  récupéré le sender (ariButton)


     


    Y a-t-il un moyen de faire un selector avec des paramètres ? 


     

  • LarmeLarme Membre
    octobre 2016 modifié #7

    Petite explication il me semble (j'viens de lire la doc de la méthode) :


    The delegate usually responds to the tap on the disclosure button (the accessory view) by displaying a new view related to the selected row. This method is not called when an accessory view is set for the row at indexPath.

     



    Si j'ai bien tout compris, c'est donc normal que cela ne soit pas appelé.


    Quelques idées, déclare ta méthode de cette manière (après traduction, obv) : -(IBAction)testAri:(UIButton *)sender


    Et utilises le sender pour retrouver le NSIndexPath :



    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:taTableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];

    ou 



    ​UITableViewCell* cell = (UITableViewCell*)button.superview.superview;
    UITableView* view = (UITableView*) cell.superview;
    NSIndexPath* indexPath = [view indexPathForCell:cell];

    Mais je ne suis pas fan de la deuxième méthode si y'avait il y a des changement de hiérarchie dans ce bazar...

    Source http://stackoverflow.com/questions/16229488/how-to-get-the-indexpath-of-a-uibutton-in-a-uitableviewcell/32792880


    Maintenant, si tu n'as qu'une seule section ou qu'une seule row par section, tu peux toujours utiliser button.tag = indexPath.row ou button.tag = indexPath.section dans l'autre cas (puisque l'intérêt est sûrement d'effectuer une action sur/depuis ton dataSource.


  • Si ton but est d'exécuter des instructions dans ton contrôller lorsqu'on appuie sur ton accessoryView alors la solution la plus efficace pour moi reste les blocks ou closures en swift.


     


    Personnellement quand je configure une cellule j'évite de faire ça dans le cellForRowAtIndexPath mais plutôt dans la cellule personnalisée elle-même surtout si tu comptes la réutiliser. Dans cette cellule personnalisée tu ajoutes une propriété qui est une closure avec les paramètres souhaités.  Tu appelles cette closures dans la méthode d'action liée à  ton accessoryView qui doit se situer dans ta classe personnalisée. 


     


    Reste plus qu'à  l'écouter dans ton cellForRowAtIndexPath


Connectez-vous ou Inscrivez-vous pour répondre.