Подтвердить что ты не робот

Программным способом запускать uibarbuttonitem click event

Я создал UIActionSheet

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

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

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

4b9b3361

Ответ 1

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

[barButtonItem.target performSelector:barButtonItem.action]

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

Ответ 2

Другой способ сделать это и избежать предупреждений:

[[UIApplication sharedApplication] sendAction:barButtonItem.action
                                           to:barButtonItem.target
                                         from:nil
                                     forEvent:nil];

Ответ 3

@ton1n8o решение работало для меня. Вот реализация в быстрой:

UIApplication.sharedApplication().sendAction(barButtonItem.action, to: barButtonItem.target, from: nil, forEvent: nil)

Ответ 4

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

[self performSelector:@selector(buttonClicked:) withObject:self.myButton afterDelay:0.0]; 

Ответ 5

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

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

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);
  }

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

Ответ 6

Ну вот как я использую 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]; 
}

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

Ответ 7

Внедрить метод делегата

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

ИЛИ

- (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, отмена индекс кнопки не установлен.

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