Как программно определить, был ли вызван IBAction кодом или действием пользователя - PullRequest
2 голосов
/ 23 августа 2011

Как программно определить, был ли вызван IBAction кодом или действием пользователя.

Например, у меня есть метод -(IBAction)someMethodWithIts:(id)sender, который я связал со значением ValueChanged на UISegmentedControl.

Он может быть вызван,

  1. Сегмент, изменяющий пользователя
  2. , устанавливающий выбранный индекс в коде
  3. , вызывающий [self someMethodWithIts:foo];

Есть ли способ отличить, поступил ли звонок с первого пути?

Приветствия

Сэм

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Если вы можете передать nil в качестве отправителя (что является традиционным) и использовать это, чтобы указать, что оно было отправлено программно, это нормально. Но все остальное, что я считаю слишком хрупким, и вы должны разбить код следующим образом:

- (void)someMethod {
  // stuff shared by everyone
}

- (IBAction)someMethodWithIts:(id)sender {
  // stuff specific to IBAction
  [self someMethod];
}

Если вы действительно хотите отправителя, то вы можете сделать это следующим образом:

- (void)someMethodWithIts:(id)sender triggeredByUser:(BOOL)isUser {
}

- (IBAction)someMethodWithIts:(id)sender {
  [self someMethodWithIts:sender triggeredByUser:YES];
}

Но в целом, если вы хотите, чтобы IBAction отличался от программных изменений, не связывайте программные изменения с IBAction.

0 голосов
/ 23 августа 2011

Вы действительно хотите использовать такой метод

-(IBAction)actionWithSender:(id)sender event:(UIEvent*)event
{
    if (event) {

    } else {

    }
}

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

0 голосов
/ 23 августа 2011
if ([sender isKindOfClass:[UIControl class]]) {
    UIControl *controlSender = (UIControl *)sender;
    if (sender.selected) {
        // then it's #1
    } else {
        // then it's #2
    }
} else if ([sender isKindOfClass:[Foo class]]) {
    // then it's #3
}

Могу работать. Или изучите другие свойства отправителя, определенные в UIControl или UISegmentedControl. Может быть state. Я предполагаю, что вы можете найти что-то другое, когда пользователь взаимодействует с тем, когда он не взаимодействует.

...