2017-09-10 4 views
0

J'ai un UIControl personnalisé qui a trois sous-vues. Chacun de ces sous-vues, j'ajouter une cible:Comment ajouter un événement tactile pour uicontrol personnalisé et contrôleur?

button.addTarget(self, action: #selector(buttonTapped(clickedBtn:)), for: .touchUpInside) 

Dans cette fonction buttonTapped, il fait des animations spéciales pour faire des transitions (Il imite le contrôle segmentée).

Maintenant, dans le ViewController que cette UIControl personnalisée existe doit savoir quand il est touché. J'ai créé une fonction @IBAction qui interagit avec les événements tactiles pour l'UIControl personnalisé.

Le problème est, ce n'est pas possible (pour autant que je sache). Si j'ajoute un événement tactile cible aux sous-vues, les événements tactiles parents ne seront pas appelés. Pour que la vue parent soit appelée la fonction @IBAction, je dois définir toutes les sous-vues setUserInteractiveEnabled to true`. Lorsque je fais cela, les fonctions d'événement tactile de la sous-vue ne seront pas appelées.

J'ai besoin que les deux fonctions d'événement tactile soient appelées. Comment puis-je faire ceci? Ou quelle est la meilleure façon de contourner cela?

+0

Pourriez-vous la * entière * contrôle personnalisé soit la 'IBAction', puis dans le' .touchUpInside' déterminer * qui * a été exploité sous-vue? – dfd

Répondre

2

Utilisez des délégués, ajoutez un protocole dans votre UIControl qui doit être implémenté dans votre ViewController. De cette façon, vous pouvez détecter si un bouton est cliqué dans votre UIControl et invoquer une fonction spécifique dans votre VC.

Par exemple:

//YourUIControl.Swift 
protocol YourUIControlDelegate { 
    func didTapFirstButton() 
} 

class YourUiControl : UIView { //I'm assuming you create your UIControl from UIView 

    var delegate : YourUIControlDelegate? 
    //other codes here 
    . 
    . 
    . 
    @IBAction func tapFirstButton(_ sender: AnyObject) { 
    if let d = self.delegate { 
     d.didTapFirstButton() 
    } 
    } 
} 

//YourViewController.Swift 
extension YourViewController : UIControlDelegate { 
    func didTapFirstButton() { 
    //handle first button tap here 
    } 
} 
+0

Cela a fonctionné! La seule chose que j'ai dû ajouter est dans 'YourViewController', dans' viewDidLoad', vous devez définir le délégué 'YourUIControl' sur self. –

+0

ouais! Cela fera l'affaire. :) bon travail –