使用在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];
  }
}

其他提示

苹果HIG说,不应该有一个明确的解雇酥料饼里面按钮,而是做你问什么,你有两个选择。

1)张贴NSNotification

OR

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!

希望这有助于

这是一个容易得多,因为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];
}

其实,我只是意识到你指的委托方法在指数显示的viewController中的代码:你的SPLITVIEW 0。这个答案并不一定适用于,但适用于你访问和创建在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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top