UIStoryboardPopoverSegue在按钮触摸时打开多个窗口

Cor*_*eke 15 iphone ios5

我正在使用a UIStoryboardPopoverSegue来为iOS 5 iPad应用程序提供popover.Segue工作得很好,但似乎包含按钮的工具栏是popover控制器的直通视图,所以如果你继续按下按钮,会出现更多的弹出窗口.由于我没有创建和跟踪UIPopoverController自己(正如故事板正在做的那样),当再次触摸按钮时我无法忽略它.有没有其他人遇到这个?我有一个与Apple打开的错误,但他们没有回应.

编辑:我已经使用下面的答案解决了这个问题.这是我最终使用的代码.在我的视图控制器类中currentPopover是一个__weakivar,所以当控制器完成后,它将自动降为零.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue isKindOfClass:[UIStoryboardPopoverSegue class]]){
        // Dismiss current popover, set new popover
        [currentPopover dismissPopoverAnimated:YES];
        currentPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

您的解决方案Cory存在一些视觉问题.

可以考虑两个选项 - 只需删除或更改显示弹出窗口的按钮的操作.

选项1,按住指针按钮的动作,并在弹出窗口后,将动作设置为零.一旦解除弹出重置为原始动作.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    action = [sender action];
    [sender setAction:nil];

    self.currentPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    self.currentPopover.delegate = self;
}

-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
    [self.navigationItem.rightBarButtonItem setAction:action];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

这样,popover只能出现一次,并将按预期被解雇.

第二个选项是更改按钮的功能,以便当弹出窗口可见时,点击按钮将导致弹出窗口被解除.

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {

        action = [sender action];
        target = [sender target];

        [sender setTarget:self];
        [sender setAction:@selector(dismiss:)];

        self.currentPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
        self.currentPopover.delegate = self;
    }

-(void)dismiss:(id)sender
{
    [self.navigationItem.rightBarButtonItem setAction:action];
    [self.navigationItem.rightBarButtonItem setTarget:target];
    ////or
//  [sender setAction:action];
//  [sender setTarget:target];
    [self.currentPopover dismissPopoverAnimated:YES];
}


    -(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
    {
        [self.navigationItem.rightBarButtonItem setAction:action];
        [self.navigationItem.rightBarButtonItem setTarget:target];

        return YES;
    }
Run Code Online (Sandbox Code Playgroud)


lna*_*ger 2

您必须在类方法中存储对popoverController作为类的一部分传递的属性的引用。 UIStoryboardPopoverSegueprepareForSegue

要访问它,请重写调用视图控制器中的方法,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // The Storyboard Segue is named popover in this case:
    if ([segue.identifier compare:@"popover"] == NSOrderedSame) {
        // segue.popoverController is only present in popover segue's
        // self.seguePopoverController is a UIPopoverController * property.
        self.seguePopoverController = segue.popoverController;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以按照通常的方式将其关闭。