iOS - вызывающий селектор на кнопке с параметром - PullRequest
8 голосов
/ 23 марта 2011

Здравствуйте, надеюсь, это простой вопрос для решения.

То, что я пытаюсь сделать, это установить селектор на действие кнопки, который вызывает мой другой метод с fileName фильма для воспроизведения. Если я верну имя файла обратно в метод, он будет работать безупречно.

То, на что я спотыкаюсь, - это правильный способ добавить селектор к кнопке. Любой вклад / совет или рекомендации будут оценены.

Заранее спасибо.

    //The Button
    infobuttonTwo           = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    infobuttonTwo.frame     = CGRectMake(405, 204, 49, 58);
    [infobuttonTwo addTarget:self 
                      action:@selector(buttonInfo:) withObject:@"VTS_02_1" 
            forControlEvents:UIControlEventTouchUpInside];



//The Method It's calling
-(void)buttonInfo:(NSString *) fileName {



//The Error it's showing.
-[UIRoundedRectButton addTarget:action:withObject:forControlEvents:]: unrecognized selector sent to instance 0x660e9e0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIRoundedRectButton addTarget:action:withObject:forControlEvents:]: unrecognized selector sent to instance 0x660e9e0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x011bfbe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x013145c2 objc_exception_throw + 47
    2   CoreFoundation                      0x011c16fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x01131366 ___forwarding___ + 966
    4   CoreFoundation                      0x01130f22 _CF_forwarding_prep_0 + 50
    5   bCIT                                0x000054f3 -[TrailersViewController popButtons] + 647
    6   bCIT                                0x0000444b -[TrailersViewController right] + 437
    7   bCIT                                0x00003b2d -[TrailersViewController handleSwipeFrom:] + 191
    8   UIKit                               0x005559c7 -[UIGestureRecognizer _updateGestureWithEvent:] + 727
    9   UIKit                               0x005519d6 -[UIGestureRecognizer _delayedUpdateGesture] + 47
    10  UIKit                               0x00557fa5 _UIGestureRecognizerUpdateObserver + 584
    11  UIKit                               0x0055818a _UIGestureRecognizerUpdateGesturesFromSendEvent + 51
    12  UIKit                               0x002f36b4 -[UIWindow _sendGesturesForEvent:] + 1292
    13  UIKit                               0x002eef87 -[UIWindow sendEvent:] + 105
    14  UIKit                               0x002d237a -[UIApplication sendEvent:] + 447
    15  UIKit                               0x002d7732 _UIApplicationHandleEvent + 7576
    16  GraphicsServices                    0x01af5a36 PurpleEventCallback + 1550
    17  CoreFoundation                      0x011a1064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    18  CoreFoundation                      0x011016f7 __CFRunLoopDoSource1 + 215
    19  CoreFoundation                      0x010fe983 __CFRunLoopRun + 979
    20  CoreFoundation                      0x010fe240 CFRunLoopRunSpecific + 208
    21  CoreFoundation                      0x010fe161 CFRunLoopRunInMode + 97
    22  GraphicsServices                    0x01af4268 GSEventRunModal + 217
    23  GraphicsServices                    0x01af432d GSEventRun + 115
    24  UIKit                               0x002db42e UIApplicationMain + 1160
    25  bCIT                                0x000029b4 main + 102
    26  bCIT                                0x00002945 start + 53
)
terminate called after throwing an instance of 'NSException

Ответы [ 6 ]

17 голосов
/ 23 марта 2011

действий UIControl (UIButton - один) может иметь три разных сигнатуры метода:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender event:(UIEvent *)event

так что вы пытаетесь сделать это невозможно. Вы не можете отправить пользовательский объект с вашим UIControlEvent.

Может быть, что-то вроде этого - решение вашей проблемы.

-(void)buttonInfo:(id)sender {
    NSString *fileName = nil;
    if (sender == infobuttonTwo) {
        fileName = @"VTS_02_1";
    }
}

и, конечно, вы должны изменить неправильный метод addTarget

[infobuttonTwo addTarget:self action:@selector(buttonInfo:) forControlEvents:UIControlEventTouchUpInside];
5 голосов
/ 19 сентября 2012

Проверьте это ..

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    int y = 100;

    for (int i = 0; i <= 5; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button addTarget:self action:@selector(aMethod:)
                     forControlEvents:UIControlEventTouchDown];
        [button setTitle:@"Show View" forState:UIControlStateNormal];
        button.frame = CGRectMake(80, y, 160, 40);
        [button setTitle:[NSString stringWithFormat:@"Button-%i", i] 
                                           forState:UIControlStateNormal]; 
        [self.view addSubview:button];
        y = y + 60;
    }
}

- (void)aMethod:(id)sender {

    UIButton *button = sender;

    int y = 100;
    int i = 5;

    for (int x = 0; x <= i; x++) {
        NSString *frameString = 
            [NSString stringWithFormat:@"{{80, %i}, {160, 40}}", y];

        if ([NSStringFromCGRect(button.frame) isEqualToString:frameString]) {
            NSLog(@"button %i clicked..", x);
        }
        y = y + 60;
    }
}
4 голосов
/ 23 марта 2011

Вы можете сделать это:

buttonInfo.tag = 1;

и в

-(void)buttonInfo:(id)sender {
       if(sender.tag == 1){
         NSString filename = @"VTS_02_1";
         }
  }

...

4 голосов
/ 23 марта 2011

Что ж, ваша проблема в том, что addTarget:action:withObject:forControlEvents: - это не метод, который существует в UIControl. Вам нужно найти какой-то другой способ отслеживания значения вашего объекта, либо в ivar, некотором промежуточном источнике данных, либо в другом месте.

Был похожий вопрос некоторое время назад, в котором есть некоторые предложения.

0 голосов
/ 06 сентября 2012

Мое решение для этого - создать глобальную переменную, которая будет содержать объект.

0 голосов
/ 25 января 2012
[infobuttonTwo addTarget:self action:@selector(buttonInfo:)forControlEvents:UIControlEventTouchUpInside];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...