Вызов метода из подкласса UIButton @implementation - PullRequest
0 голосов
/ 15 августа 2011

Я работаю над проектом для iPhone iOS 4 с Xcode 4.

Я переклассифицировал UIB-кнопку так, чтобы она перехватывала одиночное и двойное касание.

Это последняя часть @implementation подкласса UIButton, двух методов экземпляра, где метки «записываются»;

 - (void) handleTap: (UITapGestureRecognizer *) sender {
     NSLog(@"single tap");
 }

 - (void) handleDoubleTap :(UITapGestureRecognizer *) sender {
     NSLog(@"double tap");
 }

Экземпляр кнопки создается в nib, и все работает нормально: он перехватывает одно нажатие и двойное нажатие и выводит NSLog.

Теперь вопрос: у меня в моем ViewController два метода (resetAllFields и populateAllFields), и мне нужно, чтобы одно нажатие выполняло resetAllFields и двойное нажатие выполняло populateAllFields.

Как я могу это сделать? Куда мне позвонить?

Спасибо.

1 Ответ

2 голосов
/ 15 августа 2011

Если вы хотите обработать поведение в ViewController, типичным решением является добавление @protocol в ваш пользовательский класс кнопок, который определяет методы для обработки одиночных и двойных нажатий.

т.е. в вашем CustomButton.h

@protocol CustomButtonDelegate <NSObject>
    - (void)button:(CustomButton *)button tappedWithCount:(int)count;
@end

Затем у вас есть делегат, который реализует этот протокол в вашем пользовательском классе кнопок и вызывает эти методы для делегата, когда обнаружены ваши касания.

т.е. в вашем CustomButton.h

id <CustomButtonDelegate> _delegate;

в ваших методах в реализации:

- (void) handleTap: (UITapGestureRecognizer *) sender {
   NSLog(@"single tap");
   [self.delegate button:self tappedWithCount:1];
}

- (void) handleDoubleTap :(UITapGestureRecognizer *) sender {
   NSLog(@"double tap");
   [self.delegate button:self tappedWithCount:2];
}

Ваш View Controller реализует методы протокола и устанавливает себя в качестве делегата пользовательской кнопки.

т. в вашей реализации ViewControllers

- (void)button:(CustomButton *)button tappedWithCount:(int)count {
     if (count == 1) {
         [self resetAllFields];
     } else if (count == 2) {
         [self populateAllFields];
     }
}

Поскольку вы используете Interface Builder для установки пользовательской кнопки, вы можете назначить свой контроллер представления в качестве делегата там или в ViewDidLoad.

...