вызов метода из подкласса UIImageview - PullRequest
1 голос
/ 23 апреля 2011

У меня есть два файла .m. Первый - это основной код, второй - подкласс UIImageView, так что я могу обнаруживать прикосновения.
В основной файл .m я добавил индикатор выполнения и настраиваемое изображение обоих подпредставлений прокрутки.

Что мне нужно, так это то, что когда пользователь прикасается к представлению настраиваемого изображения, индикатор выполнения перемещается вверх, а двойное касание уменьшает [Примечание. необходимо выполнить прокрутку и другие элементы управления]

В основном файле .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 появляется так, что распознавание касания не является проблемой. Но PerforSelector падает. Как настраиваемый вид насосов не работает.

Итак, как мне вызвать метод в подклассе.

// обновление //

поэтому я добавил следующий код в свой подкласс

mainMethod* callingMethod = [[mainMethod alloc] init];  
[callingMethod performSelector:@selector(pumpsingletap) withObject:nil afterDelay:.4];  

затем в моем основном методе для pumpingletap я изменил его на:

- (void)pumpsingletap { 
   NSLog(@"single pump method called");
   progbm.progress +=0.1;  
} 

Появился NSLog для метода с одним насосом, но индикатор выполнения - не двигался. так что я решил проблему с вызовами - теперь нужно выяснить, почему индикатор выполнения не движется !!

Ответы [ 3 ]

0 голосов
/ 23 апреля 2011

Я не уверен, что это проблема, но вам не нужно заключать в скобки операторы case.Кроме того, я не понимаю, почему вы сделали переключатель внутри переключателя.Просто сделайте оператор if-elseif-else, это, вероятно, будет легче понять.

Кроме этого, насколько я понимаю, у вас есть контроллер представления с индикатором выполнения и настраиваемым изображением в качестве свойств,и у вас есть методы, которые должны вызываться в ответ на определенные действия (касание или двойное касание 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) && (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 не сохраняет его.

Надеюсь, это поможет, удачи в вашем приложении.

0 голосов
/ 27 апреля 2011

В конце концов я решил проблему с помощью NSNotificationCenter

0 голосов
/ 23 апреля 2011

Если я правильно следую коду, вы выполняете селектор на себя, но self - это ваш производный класс UIImageView (так что вы, вероятно, в этот момент зависаете?).Вам необходимо выполнить селектор для класса в вашем основном файле.Передайте ссылку на это вашему производному классу.Кроме того, вы можете создать делегат, реализовать его в своем основном классе, передать свой основной класс в UIImageView и затем вызвать его через делегат (есть даже другие способы сделать это (наблюдение значения ключа), но один из них должен работать).

...