Как запустить событие клика uibarbuttonitem программно - PullRequest
17 голосов
/ 29 февраля 2012

Я создал UIActionSheet

UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@""
                                                              delegate:self
                                                     cancelButtonTitle: @"cancel"
                                                destructiveButtonTitle: @"OK"
                                                     otherButtonTitles: nil];
          [action showInView:self.view];
          [action release];

По событию кнопки отмены в UIActionSheet Я хочу вызвать событие UIBarButtonItem, которое на мой взгляд.

У меня вопрос, как я могу запустить событие кнопки (не касаясь кнопки) в методе делегата UIActionSheet

Ответы [ 8 ]

26 голосов
/ 20 августа 2014

Другой способ сделать это и избежать предупреждений заключается в следующем:

[[UIApplication sharedApplication] sendAction:barButtonItem.action
                                           to:barButtonItem.target
                                         from:nil
                                     forEvent:nil];
17 голосов
/ 29 февраля 2012

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

[barButtonItem.target performSelector:barButtonItem.action]

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

13 голосов
/ 13 ноября 2015
Решение

@ ton1n8o работало на меня.Вот реализация в swift:

UIApplication.sharedApplication().sendAction(barButtonItem.action, to: barButtonItem.target, from: nil, forEvent: nil)
2 голосов
/ 20 июня 2015

Я прочитал принятый ответ, и это ужасно ОПАСНО.Вы никогда не должны подавлять такие предупреждения, чтобы сократить путь к желаемому результату!

самый безопасный способ сделать это:

SEL selector=barButton.action;
id target=barButton.target;
  if(selector && target){
     IMP imp = [target methodForSelector:selector];
     void (*func)(id, SEL) = (void *)imp;
     func(target, selector);
  }

Пожалуйста, прочитайте оригинальный пост здесь: executeSelectorможет вызвать утечку, потому что его селектор неизвестен

1 голос
/ 29 марта 2019

Для моего случая с RxCocoa Мне нужно было предоставить nil - object для действия выполнения, иначе оно завершится с EXC_BAD_ACCESS:

let button = sut.navigationItem.leftBarButtonItem!
_ = button.target?.perform(button.action, with: nil)
1 голос
/ 10 декабря 2013

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

[self performSelector:@selector(buttonClicked:) withObject:self.myButton afterDelay:0.0]; 
0 голосов
/ 29 февраля 2012

Реализация метода делегата

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex

OR

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == actionSheet.destructiveButtonIndex)
    {

    }
    else if(buttonIndex == (actionSheet.cancelButtonIndex))
    {
        // Call your event here
        // Fire the event of UIBarButtonItem.
    }

}

actionSheet: didDismissWithButtonIndex:

Отправляется делегату после удаления листа действий с экрана.

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex Parameters

actionSheet Лист действий, который был отклонен. buttonIndex Индекс кнопки, которая была нажата. Индексы кнопок начинаются с 0. Если это индекс кнопки отмены, лист действий отменяется. Если -1, то Индекс кнопки отмены не установлен.

Обсуждение: Этот метод вызывается после завершения анимации, когда представление скрыто.

actionSheet: willDismissWithButtonIndex:

Отправляется делегату до отклонения листа действий.

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex Parameters

actionSheet Лист действий, который должен быть отклонен. buttonIndex Индекс кнопки, которая была нажата. Если это Индекс кнопки отмены, лист действий отменяется. Если -1, отмена Индекс кнопки не установлен.

Обсуждение Этот метод вызывается до анимация начинается и вид скрыт.

0 голосов
/ 29 февраля 2012

Ну вот как я использую actionSheet ..

actionSheet  = [[UIActionSheet alloc] initWithTitle:nil 
                                                             delegate:nil
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

CGRect pickerFrame = CGRectMake(0, 40, 0, 0);

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;

[actionSheet addSubview:pickerView];
[pickerView release];

UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Done"]];
closeButton.momentary = YES; 
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
closeButton.tintColor = [UIColor blackColor];
[closeButton addTarget:self action:@selector(dismissActionSheet) forControlEvents:UIControlEventValueChanged];
[actionSheet addSubview:closeButton];
[closeButton release];

[actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];

[actionSheet setBounds:CGRectMake(0, 0, 320, 485)];

Как только вы закончите с этим, просто определите селектор в вашем .m как ..

-(void)dismissActionSheet{
    [actionSheet dismissWithClickedButtonIndex:0 animated:YES]; 
}

, так что внутри dismissлист действий вы можете переписать, что происходит внутри элемента кнопки панели ... надеюсь, это поможет.

...