2017-01-29 1 views
0

J'ai une vue A qui gère UITapGestureRecogniser. Quand c'est tout seul, tout fonctionne bien.TapGestureRecogniser ne pas être appelé lors d'une sous-vue

J'ai une autre vue B qui contient six des objets View A. Lorsque j'ajoute View B à mon ViewController, le UITapGestureRecogniser cesse de fonctionner. J'ai isUserInteractionEnabled = true sur toutes les vues.

Quelqu'un peut-il savoir pourquoi cela ne fonctionne pas?

Comment puis-je vérifier si les robinets sont activés au toucher?

Merci

Note: Le ViewController n'a pas encore de UIGestureRecognisers sur elle


SingleView

class QTSingleSelectionView: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

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

    fileprivate func initialize() { 
     let tap = UITapGestureRecognizer(target: self, action: #selector(onTapListener)) 
     addGestureRecognizer(tap) 
    } 

    func onTapListener() { 
     print("tap") 
     _isSelected.toggle() 
     setSelection(isSelected: _isSelected, animated: true) 
    } 

} 

vues multiples

class QTMutipleChoiceQuestionSelector: UIView { 

    var selectors: [QTSingleSelectionView] = [] 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

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

    fileprivate func initialize() { 

     for selector in selectors { 
      selector.removeFromSuperview() 
     } 

     selectors.removeAll() 

     guard let dataSource = dataSource else { return } 

     let count = dataSource.numberOfAnswers(self) 

     for index in 0..<count { 
      let selector = QTSingleSelectionView() 

      selector.frame = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
      selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
      selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
      selector.isUserInteractionEnabled = true 
      addSubview(selector) 
     } 
    } 

} 

ViewContro ller

lazy var multipleChoiceView: QTMutipleChoiceQuestionSelector = { 
    let selector = QTMutipleChoiceQuestionSelector() 
    selector.dataSource = self 
    selector.isUserInteractionEnabled = true 
    return selector 
}() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    view.addSubview(multipleChoiceView) 

} 
+0

pourrait vous montrer un code? –

+0

@ AndréSlotta j'ai ajouté le code, merci – ilan

+0

Donc le problème était de ne pas appeler l'initialiseur init (frame: CGRect) au lieu de init() sur les vues, mais vous avez objecté ma réponse par 'je n'ai pas de problème avec l'emplacement de les vues ', j'ai aussi mentionné dans mes commentaires pour vérifier votre multiView s'il reçoit le gestureRecognizer, mais vous avez voté ma réponse! –

Répondre

1

J'ai testé votre code. Le problème est en ligne:

let selector = QTMutipleChoiceQuestionSelector() //Wrong! 

Cette ligne initialise la vue avec cadre (0,0,0,0), cela signifie qu'il ne peut recevoir aucun événement tactile, même si vous pouvez le voir. La solution est de donner la vue d'une taille pour recevoir des événements:

let selector = QTMutipleChoiceQuestionSelector(frame: CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height)) 
0

Essayez ceci - Au lieu de:

for index in 0..<count { 
     let selector = QTSingleSelectionView() 

     selector.frame = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
     selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
     selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
     selector.isUserInteractionEnabled = true 
     addSubview(selector) 
    } 

Vous devez utiliser:

for index in 0..<count { 
    let aFrame: CGRect = CGRect(x: 0, y: topMargin + heightOfSelector*CGFloat(index), width: frame.width, height: heightOfSelector) 
    let selector = QTSingleSelectionView(frame: aFrame) 

    selector.text = dataSource.mutipleChoiceQuestionSelector(self, textForAnswerAtIndex: index) 
    selector.selected = dataSource.mutipleChoiceQuestionSelector(self, isItemSelectedAtIndex: index) 
    selector.isUserInteractionEnabled = true 
    addSubview(selector) 
} 

Ceci appellera la initialiseur appropriée qui est init(frame: CGRect) qui a initializer() l'intérieur. Mais maintenant, la fonction par défaut init() de votre appel de code est la UIView qui n'a pas d'initialisation personnalisée.

+0

Comment cela répond-il à ma question? Je n'ai pas de problème avec l'emplacement des vues, j'ai un problème avec le tapGesture. – ilan

+0

Je modifie la réponse, a également ajouté la description du bas, voir si cela résout votre problème. –

+0

Pas besoin de changer d'initialiseur, la fonction initialisateur est appelée. – ilan