2013-02-21 63 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]; 
    } 
相關問題