web-dev-qa-db-ja.com

プログラムでuibarbuttonitemクリックイベントを発生させる方法

UIActionSheetを作成しました

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

UIActionSheetのキャンセルボタンのイベントで、私のビューにあるUIBarButtonItemのイベントを発生させたいと思います。

私の質問は、UIActionSheetデリゲートメソッドで(ボタンに触れずに)ボタンイベントを発生させる方法です。

18
Jean Paul Scott

現在のバーボタンアイテムのアクションがわからない場合は、次の方法で呼び出すことができます。

[barButtonItem.target performSelector:barButtonItem.action]

ただし、これにより「不明なセレクター」コンパイラーの警告が表示されますが、これは 回避策 である可能性があります。

17
ayoy

これを行い、警告を回避する別の方法は次のとおりです。

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

@ ton1n8oのソリューションは私のために働いた。 Swiftでの実装は次のとおりです。

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

私は受け入れられた答えを読みました、そしてそれはひどく危険です。目的の結果へのパスを短縮するために、このような警告を抑制しないでください。

これを行う最も安全な方法:

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は、セレクターが不明であるため、リークを引き起こす可能性があります

2
M. Porooshani

RxCocoaの場合、実行アクションにnil - objectを指定する必要がありました。そうしないと、EXC_BAD_ACCESSでクラッシュします。

let button = sut.navigationItem.leftBarButtonItem!
_ = button.target?.perform(button.action, with: nil)
1
zero3nna

このメソッドを使用して、特定のボタンに対してプログラムでタップイベントを発生させることができます。

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

デリゲートメソッドを実装する

_- (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の場合、キャンセルボタンのインデックスは設定されません。

Discussion:このメソッドは、アニメーションが終了してビューが非表示になった後に呼び出されます。

actionSheet:willDismissWithButtonIndex:

アクションシートが却下される前に代理人に送信されます。

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

actionSheet却下されようとしているアクションシート。 buttonIndexクリックされたボタンのインデックス。これがキャンセルボタンインデックスの場合、アクションシートはキャンセルされています。 -1の場合、キャンセルボタンのインデックスは設定されません。

Discussionこのメソッドは、アニメーションが開始されてビューが非表示になる前に呼び出されます。

0
Krrish

さて、これは私が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]; 
}

したがって、アクションシートを閉じる内部で、バーボタンアイテム内で起こっていることを書き直すことができます...これが役立つことを願っています。

0