2011-10-16 8 views
6

Uaktualniłem mój iPad do wersji 5.0 kilka dni temu i zaktualizowałem Xcode do wersji 4.2 w tym samym czasie, więc mogłem kontynuować testowanie moich aplikacji. Teraz mam problemy z kodem dotykowym w kilku aplikacjach, które działały z poprzednimi wersjami Xcode.UIView zachowanie obsługi dotykowej zmieniono za pomocą Xcode 4.2?

Podklasowałem UIImageView, aby dodać niektóre funkcje przeciągania, przesuwając -(void)TouchesBegan i -(void)TouchesMoved. Zrobiłem nie zastąpić -(void)TouchesEnded w podklasie, ale obsługiwane w kontroler widoku dla widoku, który zawiera widok obrazu.

Wyciągnąłem podklasy UIImageView do nowego projektu dla testowania i zawężenia problemu fakt, że rodzic UIView (szablon stworzony przez Xcode) nie wydaje się być spedycji zdarzenia dotykowe do kontrolera widoku (również stworzony przez Xcode).

Jeśli dodać to do mojego podklasy:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 

i to mój rodzic widoku danych widoku kontrolera:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ViewController"); 
} 

kiedy puścić obrazu Jestem przeciągając po ekranie, ja uzyskać "touches ended event in ImageToDrag", ale nie log z kontrolera widoku.

Jednak gdybym celowo pominąć widoku robiąc to w podklasy widzenia:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event]; 
} 

potem dostać oba wpisy dziennika.

Jedynym wyjaśnieniem mogę wymyślić jest to, że z jakiegoś powodu, UIView zużywa zdarzenia touchesEnded i nie przekazując go do kontrolera widoku.

I sprawdzeniu, że exclusiveTouch jest ustawiony na NO i userInteractionEnabled jest ustawiony na YES na widoku macierzystego i podklasy UIImageView.

Testowałem także kompilację dla systemu iOS 5.0 i iOS 4.2 i wdrażanie aplikacji testowej zarówno na iPadzie z iOS 5, jak i iOS 4.3.1.

Jedynym sposobem, w jaki udało mi się uzyskać zdarzenie dotykowe do viewController jest przeskakiwanie nad widokiem i używanie podwójnego nextResponder w podklasie. Chociaż ta metoda działa, wydaje mi się, że jest dla mnie hackerem i jestem pewna, że ​​wróci później, by mnie ugryźć.

Czy ktoś inny widział to zachowanie? Czy jest jakiś sposób, aby dowiedzieć się, co robi UIView z moimi zdarzeniami dotykowymi?

Dzięki Dan

Odpowiedz

5

Próbuję wyśledzić podobny problem przez ostatnie kilka godzin. Wreszcie udało się go rozwiązać za pomocą this post

Faktycznie wygląda na to, że właśnie udało się go rozwiązać, korzystając z podpowiedzi z https://devforums.apple.com/message/519690#519690
Wcześniej, po prostu przekazywane zdarzenie touchesEnded do self.nextResponder. Po dodaniu dotkniebegan, przeniesione, anulowane handlerki z podobnymi implementacjami jako dotknięcia. Wydarzenie wydaje się dymić do kontrolera root widoku root.
Sądzę, że na urządzeniach z systemem iOS5 wyświetli się informacja o odrzuconych dotknięciach Zdarzenia zakończone , gdy nie widziały odpowiednich dotknięć.

Nie musiałem dodawać przeniesionych/etc., Właśnie wysłałem na TouchesBegan, a następnie TouchesEnded zacznę znowu działać!

+0

To załatwiło sprawę. Kluczem było to, że po ich przetworzeniu musiałem przekazać moje zdarzenia do superwizji. Jeszcze jedna uwaga jest taka, że ​​musiałem użyć "super" zamiast "self.nextResponder", aby to zadziałało. – dlenhard

+0

Dziękuję za tę odpowiedź. Rozrywałem moje włosy na ten temat. –

2

Niektóre obsługa dotykowego zrobił szansę w iOS 5.0; zwłaszcza jeśli ponownie podłączysz swoją aplikację do pakietu 5.0 SDK.

Jest metody manipulacyjne dotykowy sekcji UIView, że mówi to:

Jeśli zastąpić tę metodę bez wywoływania super (powszechne stosowanie wzorca), należy również zastąpić inne metody obsługi zdarzeń dotykowych, jeśli tylko jako implementacje stub (empy).

Więc jeśli to zrobisz, musisz je wszystkie wykonać. Wiem, że UIKit zaczął podejmować kroki, aby upewnić się, że tak było w wersji 5.0.

Więc zacznę od tego - zastąp wszystkie metody na widoku i zobacz, co się stanie.

+0

Zastanawiam się nad dotykiemBegan i dotykaMoved w podklasie ... ale nie dotykaCancelled. Spróbuję, żeby sprawdzić, czy to wyczyści. – dlenhard

+0

Próbowałem też nadpisywać dotknięciaKanned w widoku również i nadal nie działa bez użycia double nextResponder. – dlenhard

Powiązane problemy