метод вызова из подкласса UIImageView

#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