我目前有一个带有UIToolbar的iPad应用程序,其中包含两个UIBarButtonItems,每个UIBarButtonItem都连接到一个popover segue。
当用户触摸任一UIBarButtonItem时,将创建弹出窗口而不是切换弹出窗口。这会创建多个重叠的弹出式窗口。我已经能够使用以下代码关闭以前创建的popover
- (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,可以创建正常行为的popover segues。由于与UIBarButtonItems关联的弹出窗口的这种行为,我的应用程序被拒绝。有人有任何UIToolbar的建议或任何代码示例,其中多个UIBarButtonItem正常工作吗?当用户触摸窗外时,弹出窗口会消失,
答案 0 :(得分:16)
这是做你需要做的事情的正确方法:
- (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。您只需要确保您的popover对象在故事板中有一个标识符。
答案 1 :(得分:8)
当您在-prepareForSegue:sender:
收到消息时,取消segue为时已晚。
为了有效地执行此操作,您应该从视图控制器本身而不是条形按钮为您的弹出窗口创建segue,以便它们仍然可以以编程方式执行。现在将UIBarButtonItem
连接到一些有条件地呈现或解除弹出窗口的方法。
- (IBAction)showPopoverA
{
if (self.popoverA.popoverController.popoverVisible)
[self.popoverA.popoverController dismissPopoverAnimated:YES];
[self performSegueWithIdentifier:@"ShowPopoverA"];
}
答案 2 :(得分:1)
两者结合使我
-(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;
}