当弹出窗口被关闭时禁用UIBarButtonItem

时间:2013-02-21 11:21:25

标签: ios objective-c ipad

我是iOS开发的新手,我试图在点击barButtomItem时显示一个弹出窗口。到目前为止,我有这个:

-(IBAction)shareButtonPressed :(id)sender{    
    UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
    popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
    [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}

此代码有效,当我点击正确的按钮时,会显示弹出窗口。问题是当popOver显示时,如果我再次点击按钮,应用程序崩溃。我知道是因为它试图分配已经创建的变量。我认为解决方案应该是在弹出窗口加载时禁用按钮但我不知道如何在弹出窗口被解除时再次激活。

我是对的吗?如何解除popOver时启用按钮?

5 个答案:

答案 0 :(得分:1)

首先,您应该禁用shareButtonPressed方法中的按钮。

-(IBAction)shareButtonPressed :(id)sender{    
UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
[self.myButton setEnabled:NO];
[self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}

然后使视图控制器符合UIPopoverControllerDelegate协议。之后,实现popoverControllerDidDismissPopover方法。

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
if (!self.myButton.enabled) // Just to make sure the button is disabled.
    [self.myButton setEnabled:YES];

}

答案 1 :(得分:0)

只需检查实例是否已创建。

-(IBAction)shareButtonPressed:(id)sender
{
    if (self.popoverController == nil) {
        self.popoverController = alloc/init...;
        [_popoverController present...];
    } else {
        if (self.popoverController.popoverVisible)
            [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    }
}

有可能,它会在动画完成之前进行垃圾收集,从而产生无效的用户体验。然后,如果可能的话,我会在viewDidLoad或contructor中预先创建实例,然后根据需要显示和解除,检查可见属性。

答案 2 :(得分:0)

请看这个“事件 - >负责”列表:

1)按下按钮 - > MainViewController - IBAction

2)显示的弹出 - > MainViewController - IBAction

3)禁用按钮 - > MainViewController - IBAction

4)Popover dissmis - > popoverDelegate - popoverControllerDidDismissPopover

5)启用按钮 - > popoverDelegate - popoverControllerDidDismissPopover

因此,如果您的popover的委托是MainViewController,您可以访问该按钮,如果它是一个不同的类,您可能需要设置一个协议才能启用该按钮。

告诉我您是否需要进一步解释......

答案 3 :(得分:0)

您可以检测是否显示和解除了弹出窗口:

- (IBAction)shareButtonPressed :(id)sender{
    if (self.popoverController) {
        [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    } else {
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }
}

或者如果您只想禁用按钮:

- (IBAction)shareButtonPressed :(id)sender{
    ...
    UIButton *button = (UIButton *)sender;
    button.enabled = NO;
}

但在这种情况下,您必须检测用户何时关闭popOver以再次启用该按钮。您可以在班级

中采用UIPopoverController代理人(see documentation

答案 4 :(得分:0)

只需像这样修改你的代码......

-(IBAction)shareButtonPressed :(id)sender{    
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

         if(self.popoverController)
          {
            [self.popovercontroller dismissPopoverAnimated:YES];
            self.popovercontroller = nil;
           }   
        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }
相关问题