我目前有一个iPad应用程序,它的ui工具栏包含两个uibarbuttonitem,每个都连接到一个弹出窗口segue
当用户触摸UIBarButtonItems中的任何一个时,弹出窗口被创建而不是切换。这将创建多个重叠的弹出窗口。我已经能够关闭以前创建的弹出窗口使用以下代码
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// First close the preferences popover if it's open per Apple guidelines
if ([self.popoverA.popoverController isPopoverVisible]) {
[self.popoverA.popoverController dismissPopoverAnimated:YES];
}
if ([self.popoverB.popoverController isPopoverVisible]) {
[self.popoverB.popoverController dismissPopoverAnimated:YES];
}
... code to manage segues ...
}
我也有UIButtons创建行为正常的弹出窗口segue。由于与UIBarButtonItems关联的弹出窗口的这种行为,我的应用程序被拒绝了。有人有任何建议或任何代码样本与多个UIBarButtonItems正确工作的工具栏?当用户触摸窗外时弹出窗口会自动消失
这是你需要做的事情的正确方法:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if ([identifier isEqualToString:@"SurveyListPopover"]) {
if (self.surveyListPopover == nil) {
return YES;
}
return NO;
}
return YES;
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"SurveyListPopover"]) {
// Assign popover instance so we can dismiss it later
self.surveyListPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
}
}
这确保了当弹出窗口的一个实例已经显示时segue将被取消。你只需要确保你的弹出窗口对象在故事板中有一个标识符。
当你在-prepareForSegue:sender:
中收到消息时,取消segue已经太晚了。
为了有效地做到这一点,你应该从视图控制器本身创建segue到你的弹出窗口,而不是从栏按钮,这样它们仍然可以被编程执行。现在将UIBarButtonItem
连接到一些方法,这些方法将有条件地显示或取消弹出窗口。
- (IBAction)showPopoverA
{
if (self.popoverA.popoverController.popoverVisible)
[self.popoverA.popoverController dismissPopoverAnimated:YES];
[self performSegueWithIdentifier:@"ShowPopoverA"];
}
两者的结合使它适合我
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showPopover"]) {
self.tableOfContentsPopoverController = [(UIStoryboardPopoverSegue*)segue popoverController];
}
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if ([identifier isEqualToString:@"showPopover"]) {
if (!self.tableOfContentsPopoverController.popoverVisible) {
return YES;
}
return NO;
}
return YES;
}