UIActionSheet
を作成しました
UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@""
delegate:self
cancelButtonTitle: @"cancel"
destructiveButtonTitle: @"OK"
otherButtonTitles: nil];
[action showInView:self.view];
[action release];
UIActionSheet
のキャンセルボタンのイベントで、私のビューにあるUIBarButtonItem
のイベントを発生させたいと思います。
私の質問は、UIActionSheet
デリゲートメソッドで(ボタンに触れずに)ボタンイベントを発生させる方法です。
現在のバーボタンアイテムのアクションがわからない場合は、次の方法で呼び出すことができます。
[barButtonItem.target performSelector:barButtonItem.action]
ただし、これにより「不明なセレクター」コンパイラーの警告が表示されますが、これは 回避策 である可能性があります。
これを行い、警告を回避する別の方法は次のとおりです。
[[UIApplication sharedApplication] sendAction:barButtonItem.action
to:barButtonItem.target
from:nil
forEvent:nil];
@ ton1n8oのソリューションは私のために働いた。 Swiftでの実装は次のとおりです。
UIApplication.sharedApplication().sendAction(barButtonItem.action, to: barButtonItem.target, from: nil, forEvent: nil)
私は受け入れられた答えを読みました、そしてそれはひどく危険です。目的の結果へのパスを短縮するために、このような警告を抑制しないでください。
これを行う最も安全な方法:
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は、セレクターが不明であるため、リークを引き起こす可能性があります
RxCocoaの場合、実行アクションにnil - object
を指定する必要がありました。そうしないと、EXC_BAD_ACCESS
でクラッシュします。
let button = sut.navigationItem.leftBarButtonItem!
_ = button.target?.perform(button.action, with: nil)
このメソッドを使用して、特定のボタンに対してプログラムでタップイベントを発生させることができます。
[self performSelector:@selector(buttonClicked:) withObject:self.myButton afterDelay:0.0];
デリゲートメソッドを実装する
_- (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このメソッドは、アニメーションが開始されてビューが非表示になる前に呼び出されます。
さて、これは私が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];
}
したがって、アクションシートを閉じる内部で、バーボタンアイテム内で起こっていることを書き直すことができます...これが役立つことを願っています。