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
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
Dziękuję za tę odpowiedź. Rozrywałem moje włosy na ten temat. –