Поведението при работа с докосване на UIView е променено с Xcode 4.2?

Надградих своя iPad до 5.0 преди няколко дни и надстроих Xcode до 4.2 едновременно, за да мога да продължа да тествам приложенията си. Сега имам проблеми с кода за докосване в няколко приложения, които работеха с предишни версии на Xcode.

Подкласирах UIImageView, за да добавя някои функции за плъзгане чрез замяна на -(void)TouchesBegan и -(void)TouchesMoved. Аз не замених -(void)TouchesEnded в подкласа, но го обработих в контролера на изгледа за изгледа, който съдържа изгледа на изображението.

Изтеглих подкласа UIImageView в нов проект за тестване и стесних проблема до факта, че родителският UIView (шаблонът, създаден от Xcode) изглежда не препраща събития за докосване към контролера за изглед (също създаден от Xcode).

Ако добавя това към моя подклас:

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

и това към контролера за изглед на моя родителски изглед:

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

когато пусна изображението, което плъзгам по екрана, получавам "touches ended event in ImageToDrag", но не и дневника от контролера за преглед.

Ако обаче умишлено прескоча изгледа, като направя това в изгледа на подклас:

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

тогава получавам и двата записа в дневника.

Единственото обяснение, което мога да измисля, е, че по някаква причина UIView консумира събитието touchesEnded и не го предава на контролера на изгледа.

Проверих, че exclusiveTouch е настроено на NO, а userInteractionEnabled е настроено на YES в родителския изглед и подкласа UIImageView.

Също така тествах компилиране за iOS 5.0 и iOS 4.2 и внедряване на тестовото приложение както на iPad с iOS 5, така и на iPad с iOS 4.3.1.

Единственият начин, по който успях да получа събитието докосване до viewController, е като прескоча изгледа и използвам двойното nextResponder в подкласа. Въпреки че този метод работи, изглежда ми като хак и съм сигурен, че ще се върне да ме ухапе по-късно.

Някой друг виждал ли е това поведение? Има ли някакъв начин да разбера какво прави UIView с моите събития при докосване?

Благодаря, Дан


person dlenhard    schedule 16.10.2011    source източник


Отговори (2)


Опитвам се да проследя подобен проблем през последните няколко часа. Най-накрая успях да го разреша с помощта на тази публикация

Всъщност изглежда, че току-що успях да го разреша, използвайки подсказката от https://devforums.apple.com/message/519690#519690
По-рано току-що препратих събитието touchesEnded към self.nextResponder. Когато добавих манипулатори touchesBegan, Moved, Canceled с подобни имплементации като touchesEnded, събитието изглежда избухва до основния контролер на изгледа.
Предполагам, че в iOS5 изгледите отхвърлят събития touchesEnded, когато не са видели съответните touchesBegan.

Не трябваше да добавям Moved/и т.н., просто препратих на TouchesBegan и след това TouchesEnded започна да работи отново!

person Danny Tuppeny    schedule 19.10.2011
comment
Това свърши работа. Ключът беше, че трябваше да препратя моите събития към superview след обработката им. Друга бележка е, че трябваше да използвам super вместо self.nextResponder, за да го накарам да работи. - person dlenhard; 20.10.2011
comment
Благодаря ви за този отговор. Скъсах косата си от това. - person Steven Baughman; 17.02.2012

Някои манипулации с докосване имаха шанс в iOS 5.0; особено ако свържете отново приложението си с 5.0 SDK.

Има раздел Методи за обработка на докосване на UIView, който казва следното:

Ако замените този метод, без да извиквате super (често използван модел), трябва също така да замените другите методи за обработка на събития на докосване, макар и само като stub (empy) реализации.

Така че, ако направите едно, трябва да ги направите всички. Знам, че UIKit започна да предприема стъпки, за да се увери, че това е така в 5.0.

Така че бих започнал оттук - заменете всички методи във вашия изглед и вижте какво ще се случи.

person Chris Parker    schedule 17.10.2011
comment
Заменям touchesBegan и touchesMoved в подкласа... но не и touchesCancelled. Ще го пробвам, за да видя дали ще се изясни. - person dlenhard; 17.10.2011
comment
Опитах също да заменя touchesCancelled в изгледа и все още не работи без да използвам двойния nextResponder. - person dlenhard; 17.10.2011