11

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

これは、ボタンが押されたときにポップオーバーを表示するのに適しています。ただし、適切なガイドラインに従うために、ボタンが既に開いているときにボタンが押された場合は、ポップオーバーを閉じたいと思います。どうすればこれを行うことができますか?(つまり、ユーザーがこのボタンを繰り返しクリックすると、ポップオーバーが表示され、1 つおきのヒットが非表示になります。)

4

7 に答える 7

16

splitViewController がポップオーバーを表示すると、以下のメソッドが呼び出されます。nilでないかどうかを確認してから、それを却下してください:)

- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
  if ([pc isPopoverVisible]) {
     [pc dismissPopoverAnimated:YES];
  }
}
于 2010-06-08T17:02:36.867 に答える
7

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 から始めて、最初のビューコントローラーに移動し、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!

お役に立てれば

于 2010-04-22T02:03:17.777 に答える
3

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

私は実際に、スプリットビューのindex:0にviewControllerを表示するためのDelegateメソッド内のコードを参照していることに気付きました。この回答は必ずしもそれに当てはまるわけではありませんが、iPad で popoverControllers にアクセスして作成する場合には常に当てはまります。最初にポップオーバーが表示されているかどうかを確認しないと、クラッシュするか、いくつかのポップオーバーが開かれます。

御時間ありがとうございます。

于 2010-04-21T03:55:19.660 に答える
1

あなたは以下を試すことができます

if(![popoverController isPopoverVisible]){
   // Show popover
}
else{
   // close popover
   [popoverController dismissPopoverAnimated:YES];
}
于 2010-04-17T20:54:26.690 に答える
0

デフォルトの設定を使用している場合UISplitViewController、作成されたナビゲーション バー ボタンにRootViewController.

一度に複数のポップアップが表示されないようにしたい場合は、表示されるたびにポップアップを閉じることができますRootViewController。この問題を解決するために使用したコードは次のとおりです。

- (void) viewWillAppear:(BOOL)animated {
  if ([self.popover isPopOverVisible]) {
    [self.popover dismissPopoverAnimated:YES];
  }
  [super viewWillAppear:YES];
}
于 2010-05-28T05:17:39.173 に答える
0

modalPresentationStyleはい、次のように設定できます。

controller.modalPresentationStyle = UIModalPresentationFormSheet;
于 2010-12-28T03:09:12.430 に答える
0

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];
  }
}
于 2010-04-21T11:11:26.937 に答える