UIPopoverController不再通过在ios 8.3上点击外部来解除

时间:2015-04-10 17:57:17

标签: ios objective-c iphone

我刚刚使用ios sdk 8.3更新到新的XCode 6.3,而我的项目(在8.1和8.2上完美运行)似乎与PopoverController存在一些问题。

通常当弹出窗口出现时应该通过触摸弹出窗口的边界来解除(默认情况下);但在我的情况下,iOS 8.2和8.1中的相同的代码完美地工作,同时它不适用于8.3。

这是我使用的代码:

-(void)showFilter:(id)sender{
if (!filterController)
    filterController = [NodeFilterTableViewController nodeFilterController];
[filterController setModalPresentationStyle:UIModalPresentationPopover];
[filterController.popoverPresentationController setBarButtonItem:self.navigationItem.rightBarButtonItem];
[self presentViewController:filterController animated:YES completion:nil];
}

回顾一下这个问题:通过点击按钮可以正确显示弹出框,同时通过触摸边界不会被解除(仅当程序在iOS 8.3上运行时)。

iOS 8.3中有关popovercontrollers的内容是否有所改变?我已经查了in Apple iOS diffs但我找不到任何东西。

更新:

这里我添加了filterPopover的实现(只有对问题有用的方法):

  -(void)viewDidLoad {
  [super viewDidLoad];

  self.clearsSelectionOnViewWillAppear = NO;
  if (!_filterSetting) _filterSetting = [NSMutableDictionary new];
  [self setModalInPopover:NO];

  }

由于popover的内容有一个单独的故事板,我使用此方法创建它的实例

  +(instancetype)nodeFilterController{
     return [[UIStoryboard storyboardWithName:@"NodeFilterStoryboard" bundle:[NSBundle mainBundle]]instantiateViewControllerWithIdentifier:@"NodeFilterController"];
  }

其他委托方法:

 -(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
     [self.delegate nodeFilterController:self didDismissWithFilters:_filterSetting];
 }

 -(void)viewDidDisappear:(BOOL)animated{
     [super viewDidDisappear:animated];
     [self.delegate nodeFilterController:self didDismissWithFilters:_filterSetting];
 }

正如我所说,请记住,一切都在iOS 8 / 8.1 / 8.2上完美运行 8.3

1 个答案:

答案 0 :(得分:0)

最后我发现了问题。

我仍然不知道为什么(因为在iOS< 8.3完美无缺)但问题是我试图在popover中显示的视图没有嵌入到导航控制器中。

如果您将所有内容都放在导航控制器中,它就能完美运行!

这是现在的代码:

    if (!filterController){
    filterController = [NodeFilterTableViewController nodeFilterController];
    [filterController setDelegate:self];
}
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:filterController];
[navController setModalPresentationStyle:UIModalPresentationPopover];
[navController.popoverPresentationController setBarButtonItem:self.navigationItem.rightBarButtonItem];

[filterController setColorManager:_colorManager];
[filterController setFilterSetting:_filterSetting]; // Setup the precedent active filter if any
[self presentViewController:navController animated:YES completion:nil];