我刚刚使用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
答案 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];