2017-07-15 4 views
0

J'ajoute un bouton à la classe personnalisée d'une vue de collection, mais j'ai du mal à la faire cliquer.En cliquant sur un bouton dans une CollectionViewCell

Voilà comment je déclare le bouton dans la classe personnalisée cellulaire:

let shareBtn: UIButton = { 
    let roundBtn = UIButton() 
    roundBtn.frame = CGRect(x: 0, y: 0, width: 70, height: 70) 
    roundBtn.layer.cornerRadius = 35 
    roundBtn.layer.shadowOpacity = 0.25 
    roundBtn.layer.shadowRadius = 2 
    roundBtn.setImage(UIImage(named: "share"), for: .normal) 
    roundBtn.addTarget(self, action: #selector(shareAction(button:)), for: .touchUpInside) 
    roundBtn.isUserInteractionEnabled = true 
    roundBtn.isEnabled = true 

    return roundBtn 
}() 

Voici la méthode des appels de sélection:

func shareAction(button: UIButton){ 
    print("shareAction") 
} 

Voici comment ajouter le bouton dans init

override init(frame: CGRect) { 
    super.init(frame: frame) 

    contentView.addSubview(shareBtn) 

    shareBtn.translatesAutoresizingMaskIntoConstraints = false 
    shareBtn.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -100).isActive = true 
    shareBtn.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true 
    shareBtn.widthAnchor.constraint(equalToConstant: 70).isActive = true 
    shareBtn.heightAnchor.constraint(equalToConstant: 70).isActive = true 

J'ai essayé d'ajouter le bouton à la fois - contentView et le self mais les deux donnent le même résultat, wh C'est un bouton non cliquable.

Toutes les suggestions sont les bienvenues.

Répondre

1

Avec la façon dont vous créez le bouton à chaque fois que vous accédez à shareBtn, vous créez toujours une nouvelle instance parce qu'elle est une variable calculée . Voilà pourquoi lorsque vous écrivez ceci:

addSubview(shareBtn) 
shareBtn.addTarget(self, action: #selector(shareAction(button:)), for: .touchUpInside) 

le bouton que vous ajoutez un sous-vue et le bouton que vous ajoutez la cible sont différentes instances. Vous devez utiliser un lazy var pour le shareBtn comme ce qui suit:

lazy var shareBtn: UIButton = { 
    let roundBtn = UIButton() 
    roundBtn.frame = CGRect(x: 0, y: 0, width: 70, height: 70) 
    roundBtn.layer.cornerRadius = 35 
    roundBtn.layer.shadowOpacity = 0.25 
    roundBtn.layer.shadowRadius = 2 
    roundBtn.setImage(UIImage(named: "share"), for: .normal) 
    roundBtn.addTarget(self, action: #selector(shareAction(button:)), for: .touchUpInside) 
    roundBtn.isUserInteractionEnabled = true 
    roundBtn.isEnabled = true 

    return roundBtn 
}() 

De cette façon, une seule instance sera créé et attribué à shareBtn lorsque vous accédez à la première fois et tous les accès ultérieurs utiliserez la même instance.

+0

quoi? homme, tu as raison. pourquoi serait rapide faire que c'est la même constante pourquoi créer une nouvelle instance de celui-ci, je ne comprends pas. Je vous remercie – fullMoon

0

Le bouton était sous une vue de contrôle de page qui a été ajoutée dans le contrôleur de vue parent. Aussi je devais appeler la méthode d'action après l'ajout du sous-vue à la cellule:

addSubview(shareBtn) 
shareBtn.addTarget(self, action: #selector(shareAction(button:)), for: .touchUpInside)