#iphone #class #methods #touch #subclass
#iPhone #класс #методы #коснитесь #подкласс
Вопрос:
У меня есть два файла .m. Первый — это основной код, второй — подкласс UIImageView, чтобы я мог обнаруживать касания.
В файл main .m я добавил индикатор выполнения и customimageview, оба подвида scrollview.
Что мне нужно, так это то, что когда пользователь прикасается к customimageview, индикатор выполнения перемещается вверх, а двойное нажатие уменьшает [Примечание: касания customimageview должны распознаваться во втором .m из-за того, что они находятся в подвиде scrollview, и необходимо обрабатывать другие элементы управления]
В файле main .m у меня есть два метода:
- (void)pumpsingletap {
progbm.progress =0.1;
}
- (void)pumpdoubletap {
progbm.progress -=0.1;
}
затем в подклассе uiimageview у меня есть:
//inside touches method
if ([touch view].tag == 555) {
NSLog(@"pump touched");
switch ([allTouches count]) {
case 1: {
switch ([touch tapCount]) {
//---single tap---
case 1: {
NSLog(@"single pump touch");
[self performSelector:@selector(pumpsingletap) withObject:nil afterDelay:.4];
} break;
//---double tap---
case 2: {
NSLog(@"double pump touch");
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pumpsingletap) object:nil];
[self performSelector:@selector(pumpdoubletap) withObject:nil afterDelay:.4];
} break;
}
}
}
}
Итак, NSLog отображается, поэтому распознавание прикосновений не является проблемой. Но performSelector завершает работу. Поскольку customimageview pumpsingletap не работает.
Итак, как мне вызвать метод в подклассе.
//обновить//
итак, я добавил в следующий код, в свой подкласс
mainMethod* callingMethod = [[mainMethod alloc] init];
[callingMethod performSelector:@selector(pumpsingletap) withObject:nil afterDelay:.4];
затем в моем основном методе для pumpsingletap я изменил его на:
- (void)pumpsingletap {
NSLog(@"single pump method called");
progbm.progress =0.1;
}
Появился вызов NSLog для метода single pump, но индикатор выполнения progbm — не перемещался. итак, я решил свою проблему с вызовом — теперь просто нужно выяснить, почему индикатор выполнения не перемещается!!
Комментарии:
1. убедитесь, что индикатор выполнения подключен в interface builder
Ответ №1:
Если я правильно следую коду, вы выполняете селектор в self , но self является вашим производным классом UIImageView (так что, вероятно, в этот момент происходит сбой?). Вам нужно выполнить селектор для класса в вашем основном файле. Передайте ссылку на это вашему производному классу. В качестве альтернативы вы могли бы создать делегат, реализовать его в своем основном классе, передать свой основной класс в UIImageView, а затем вызвать через делегат (есть даже другие способы сделать это (наблюдение за значением ключа), но один из них должен сработать).
Комментарии:
1. какой была бы строка кода для вызова селектора с классом основного файла.
Ответ №2:
Я не уверен, что это проблема, но вам не нужны скобки вокруг операторов case. Также я не понимаю, зачем вам делать переключение внутри коммутатора. Просто сделайте оператор if-elseif-else, это, вероятно, будет легче понять.
Кроме этого, насколько я понимаю, у вас есть контроллер представления с индикатором выполнения и customimageview в качестве свойств, и у вас есть методы, которые должны вызываться в ответ на определенные действия (нажатие или двойное нажатие на customimageview), но они находятся в контроллере представления. Обычный способ решить эту проблему — использовать механизм целевого действия. UIControls реализует механизм целевого действия, инкапсулируя пары цель-действие и сохраняя их в словаре, определяемом типом события (UIControlEvent). Вот немного более простая версия.
В файле .h для вашего подкласса UIImageView перед @interface
запишите это:
typedef enum {
ControlEventTap = 0,
ControlEventDoubleTap
} ControlEvent;
Затем в файле .m добавьте это перед @implementation:
@interface TargetActionPair : NSObject {
id target;
SEL action;
}
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action;
@end
@implementation TargetActionPair
@synthesize target, action;
@end
Затем добавьте переменную экземпляра NSMutableArray (но не свойство) и - (void)setTarget:(id)t action:(SEL)a forEvent:(ControlEvent)e
метод к вашей реализации customimageview.
Метод должен выглядеть следующим образом:
- (void)setTarget:(id)t action:(SEL)a forEvent:(ControlEvent)e {
TargetActionPair *tar_act = [[TargetActionPair alloc] init];
tar_act.target = t;
tar_act.action = a;
// actionsArray is the mutable array instance variable and must be allocated and set in the init method for customimageview.
[actionsArray replaceObjectAtIndex:(NSUInteger)e withObject:tar_act];
[tar_act release];
}
Затем вы можете заменить свой код обработки касания на:
if ([touch view].tag == 555) {
NSUInteger tapcount = [touch tapCount];
if (([alltouches count] == 1) amp;amp; (tapcount <= [actionsArray count])) {
TargetActionPair *tar_act = [actionsArray objectAtIndex:tapcount-1];
[tar_act.target performSelector:tar_act.action withObject:nil afterDelay:.4];
if (tapcount == 2) {
TargetActionPair *tar_act2 = [actionsArray objectAtIndex:tapcount-2];
[NSObject cancelPreviousPerformRequestsWithTarget:tar_act2.target selector:tar_act2.action object:nil];
}
}
}
С помощью этого кода вы просто устанавливаете цель и действие для каждого управляющего события в методе viewDidLoad контроллера представления, который содержит customimageview. Таким образом, вызовы будут выглядеть следующим образом:
[self.customimageview setTarget:self action:@selector(pumpsingletap) forEvent:ControlEventTap];
[self.customimageview setTarget:self action:@selector(pumpdoubletap) forEvent:ControlEventDoubleTap];
НЕ ЗАБУДЬТЕ освободить actionsArray в вашем методе dealloc и будьте очень осторожны при освобождении контроллера представления, поскольку customimageview его не сохраняет.
Я надеюсь, что это поможет, желаю удачи вашему приложению.
Ответ №3:
В итоге я решил проблему с помощью NSNotificationCenter