2012-02-23 15 views
5

La mia applicazione tende a perdere la traccia di ciò che il risponditore dovrebbe gestire un evento touch.L'evento UIButton non è stato gestito per l'1% del tempo: chi dovrei incolpare nella mia catena di risposta?

La mia situazione:

  • un file XIB che definisce 3 guardati:
    • un punto di vista come vista del proprietario del file Visto
    • 2 extra che vengono aggiunti alla gerarchia di visualizzazione a livello di codice
  • Una delle sottoview (SubviewA) ha un UIButton, configurato per inviare il selettore myAction: allo FirstResponder quando un viene rilevato "Touch Up Inside" evento
  • SubviewA sa come gestire myAction:

99% del tempo, tutto va bene. Quando l'utente tocca il pulsante, SubviewA si prende cura del messaggio myAction: e tutto va bene. Ma di tanto in tanto, gli utenti si lamentano che il pulsante "si blocca" e in realtà l'ho riprodotto io stesso un paio di volte senza essere in grado di trovare uno scenario chiaro per farlo accadere su richiesta.

La mia indagine finora è:

  • quando non succede nulla quando si tocca il tasto:
    • mio pulsante rileva il rubinetto causa che viene evidenziato quando viene premuto
    • myAction: non è invitato SubviewA
    • il resto dell'interfaccia utente rimane reattivo

Il codice di cui sto parlando è un codice legacy che sto cercando di risolvere. Avere una vista che risponde a un evento per una delle sue sottoview suona come un'architettura bizzarra per me. Finora, ho sempre utilizzato il proprietario del file per occuparmi degli eventi touch, quindi ho sottolineato che la catena di risponditori è l'ideale responsabile del bug. Ma non riesco a trovare il perché! Da quanto ho capito, poiché il pulsante non sa come gestire il messaggio e non ha alcun controller di visualizzazione collegato, dovrebbe inoltrarlo alla sua superview (ButtonA, che sa come gestirlo)!

Le mie domande sono:

  • alcuna idea di dove il bug potrebbe venire da? (catena di risposta?)
  • qualsiasi commento sul fatto che una vista debba gestire i propri comportamenti dei pulsanti stessi o se un controller di visualizzazione debba eseguirlo?

Edit: Ho un'idea su come risolvere il bug: filo il pulsante di azione dritto al SubviewA invece di usare firstResponder all'interno di Interface Builder. Il motivo per cui ho postato questa domanda è cercare di capire perché la catena di risposta non funziona di tanto in tanto.

+0

Sii bello vedere il codice ... – tarmes

+0

Non è coinvolto il codice .m: solo file XIB, che non sono veramente facili da condividere. –

risposta

1

Puoi semplicemente rendere SubviewA diventato FirstResponder e quindi abbandonarlo quando hai finito?

+0

Il mio piano per correggere il mio bug è collegare l'azione del pulsante direttamente a SubviewA piuttosto che a FirstResponder all'interno di Interface Builder. Quello che voglio sapere è perché non funziona con FirstResponder. –

1

Quando i tocchi vengono gestiti in una sottoview, in genere non vengono passati alla catena. Quindi, ad esempio, se stai catturando dei tocchi nel controller della vista del contenuto, riceverai dei tocchi su UILabel perché non li cattura. Questi eventi vengono passati alla visualizzazione del contenuto e quindi al controller. Ma non vedrai alcun tocco su UIButton dal momento che quella classe li sta catturando (ricorda che UIButton interpreta un certo numero di sequenze tattili, non solo ritocchi-all'interno).

Per questo motivo è necessario sottoclasse UIButton per vedere i tocchi. Quando lo fai, assicurati di passare sempre gli eventi alla super classe quando hai finito con loro, altrimenti UIButton non funzionerà correttamente. Vedere Note sulle sottoclassi nello UIControl Class Reference. Dai un'occhiata anche allo Control Events in that reference e ad alcuni dei metodi di istanza per assicurarti di aver davvero bisogno di prendere i tocchi nel tuo codice. Si noti ad esempio che UIButton eredita la capacità di tenere traccia dei tocchi di UIControl.

+0

la tua risposta ha senso ma manca il punto della mia domanda: il mio file xib stava dicendo esplicitamente al mio pulsante di chiamare myAction sul primo risponditore per un evento touch-up-inside. Quindi perché a volte manca? –