それは開いている間BarButtonItemが押されたときにiPadのUIPopoverControllerを却下
-
27-09-2019 - |
質問
iPadの分割ビューを使用して、私は次のコードを持っています
- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
barButtonItem.title = @"Categories";
NSMutableArray *items = [[toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[toolbar setItems:items animated:YES];
[items release];
self.popoverController = pc;
}
これは、ボタンが押されたときにポップオーバーを表示するために適しています。しかし、私はすでに良いガイドラインに従うことが開いている間にボタンが押された場合にポップオーバーを却下持っているようにも思います。どのように私はこれを行うに行きますか? (ユーザーが繰り返しこのボタンをクリックした場合、すなわち、ポップオーバーが来て、他のすべてのヒットを隠す必要があります。)
解決
方法以下の場合はsplitViewController表示ポップオーバーは、呼び出されます。 nilでない場合は、単にそれを却下し、確認してください。)
- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
if ([pc isPopoverVisible]) {
[pc dismissPopoverAnimated:YES];
}
}
他のヒント
AppleのHIGが明示的にはポップオーバー内のボタンを却下すべきではない、しかし、あなたが求めているものを行うために言って、次の2つのオプションがあります。
1)
NSNotificationを投稿または
2)あなたはポップオーバーインスタンス
を持ってまで、あなたのビュー階層にドリルダウン1)あなたはviewDidLoadメソッドで、中にポップオーバーを提示している見る方に
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];
"dismissThePopover" と呼ばれるメソッドを作成し、deallocメソッドでは、removeObserver
-(void)dismissThePopover {
[self.popoverController dismissPopoverAnimated:YES];
}
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
あなたのpopoverControllerボタンを "却下" で、次の行を入力します:
[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];
その実行すると、アプリに通知を送り、あなたが他のビューコントローラを登録したので、この場合には、それはあなたが指定したセレクタを呼び出し、その通知を見たときに、それを聞くために、dismissThePopoverます。
2)self.popoverControllerを見つけるためにあなたのビュー階層にドリルダウン
このアウトをチェックし、あなたはきっと、異なるものになりますが、全体的な考え方は同じです。あなたのAppDelegateでスタート、最初のViewControllerに移動、サブビューへの動きは、あなたのself.popoverControllerオブジェクトを取得するまでます。
MyAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
//appDelegate instance, in this case it's the .m file for your ApplicationDelegate
UISplitViewController *svc = appDelegate.splitViewController;
//In this case the first view inside the appDelegate is a SplitView, svc
UINavigationController *navc = [[svc viewControllers]objectAtIndex:0];
//a navigationController is at index:0 in the SplitView hierarchy. DetailView is at index:1
NSArray *vcs = [navc viewControllers];
//vcs is the array of different viewcontrollers inside the Navigation stack for nvc
iPadRootViewController *rootView = [vcs objectAtIndex:0];
//declare the rootView, which is the .m file that is at index:0 of the view array
UIPopoverController *pc = [rootView popoverController];
//HERE WE GO!!! popoverController is a property of iPadRootViewController's instance rootView, hereby referred to as pc.
[pc dismissPopoverAnimated:YES];
//bye bye, popoverController!
ホープ、このことができます。
このはpopoverControllerは財産であるため、多くの方が簡単です。参照することが容易になります。
if ([self.popoverController isPopoverVisible]) {
//using the setters and getters "goes thru the proper channels" when accessing objects
[self.popoverController dismissPopoverAnimated:YES];
} else {
UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:YOUR_VIEW_CONTROLLER];
self.popoverController = pc;
[pc release];
//get the button instance you set on the toolbar
UIBarButtonItem *categoryButton = [[toolbar items] objectAtIndex:0];
[self.popoverController presentPopoverFromBarButtonItem:categoryButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
あなたのsplitViewの0:私は実際にちょうどあなたがインデックスでのViewControllerを表示するためのデリゲートメソッド内のコードを参照していることに気づきました。この答えは、必ずしもそれには適用されませんが、あなたがアクセスし、iPad上popoverControllersを作成している他の時間にも適用ありません。ポップオーバーが最初に表示されているかどうかをチェックしないと、あなたはどちらか開いて、いくつかのpopoversがクラッシュ、またはされます。
あなたの時間をありがとうます。
あなたは以下の試みることができる。
if(![popoverController isPopoverVisible]){
// Show popover
}
else{
// close popover
[popoverController dismissPopoverAnimated:YES];
}
デフォルトのUISplitViewController
の設定、ディスプレイにあなたRootViewController
のポップオーバーを作成された後、ナビゲーションバーのボタンを使用している場合。
あなたはあなたが一度に複数のポップアップを持っていないようにしたい場合は、あなたのRootViewController
が表示されたときに、あなたは、単にポップアップを消すことができます。ここで私は、この問題を解決するために使用されるコードがあります:
- (void) viewWillAppear:(BOOL)animated {
if ([self.popover isPopOverVisible]) {
[self.popover dismissPopoverAnimated:YES];
}
[super viewWillAppear:YES];
}
私はRootViewController.mでポップオーバーを表示するために使用されるコード:
- (IBAction) addCategory:(id)sender {
AddCategoryViewController *content = [[AddCategoryViewController alloc] init];
UIPopoverController *aPopover = [[UIPopoverController alloc]
initWithContentViewController:content];
aPopover.delegate = self;
// Store the popover in a custom property for later use.
self.addCategoryPopover = aPopover;
addCategoryPopover.delegate = self;
[aPopover release];
[content release];
[addCategoryPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
この私がしようとすると別のクラスからそれを消すために使用される:
-(IBAction)saveAddCategory:(id)sender {
rootViewController = [[RootViewController alloc] init];
[rootViewController dismissPopover];
}
のようなマイdismissPopover
機能ルックスます:
- (void) dismissPopover {
if ([self.addCategoryPopover isPopoverVisible]) {
[self.addCategoryPopover dismissPopoverAnimated:YES];
}
if (addCategoryPopover.popoverVisible == YES) {
[addCategoryPopover dismissPopoverAnimated:YES];
}
}
はい、あなたは以下のようmodalPresentationStyle
を設定することができます:
controller.modalPresentationStyle = UIModalPresentationFormSheet;