2013-02-21 65 views
0

我是iOS开发新手,当我尝试点击barButtomItem时显示弹出窗口。到目前为止,我有这样的:当popover被解雇时禁用UIBarButtonItem

-(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加载时禁用按钮,但是一旦popover被解除,我不知道如何再次激活。

我对不对? PopOver被解雇时,我怎样才能启用按钮?

回答

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]; 

} 
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或构造函数中预先创建实例,然后根据需要进行显示和解除,检查可见属性。

0

看这个 “事件 - >负责” 的文章:

1)按下按钮 - > MainViewController - IBAction为

2)酥料饼中所示 - > MainViewController - IBAction为

3)按钮禁用 - > MainViewController - IBAction为

4)酥料饼dissmis - > popoverDelegate - popoverControllerDidDismissPopover

5)启用按钮 - > popoverDelegate - popoverControllerDidDismissPopover

因此,如果您的弹出窗口的代理是MainViewController,您将有权访问该按钮,如果它是不同的类,则可能必须设置一个协议,以便启用按钮。

告诉我,如果你需要任何进一步的解释...

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)在你的类

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]; 
    } 
相关问题