2011-12-28 179 views
3

Possible Duplicate:
How to Dismiss a Storyboard PopoveriOS:如何關閉彈出

我有一個iPad故事板。將一個視圖中的欄按鈕項目拖動到另一個視圖 - 並選擇一個彈出窗口樣式。當我按新酥料餅的觀點是在酥料餅所示的按鈕,但我有兩個問題:

  1. 當我再次按下按鈕,將顯示酥料餅的視圖的另一個實例 - 我可以看到,該黑色邊框越來越黑暗。如果彈出窗口視圖打開並按下按鈕,彈出窗口視圖應該關閉。我怎樣才能做到這一點?
  2. 當前新的彈窗視圖浮動到屏幕的按鈕上,即使視圖中的內容不高。我怎樣才能控制popover視圖的尺寸?

EDIT1:

我已經在控制器的從底部的黃色控制器圖標拖動到另一個視圖,這應該是酥料餅的內部產生一個SEGUE。這個彈出窗口的標識符是settingsPopover。

然後我做到這一點,IBAction爲內部:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:self]; 
} 

但是這給了我這個錯誤:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'

有我創建了SEGUE在一個糟糕的方式或在調用performSegueWithIdentifier錯了嗎?

EDIT2:

我創造了這個IBAction爲:

- (IBAction)settingsButtonTapped:(id)sender { 
    if (_settingsPopover == nil) { 
     SettingsViewController* settingsView = [[SettingsViewController alloc] initWithStyle:UITableViewStylePlain]; 
     self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:settingsView]; 
    } 
    [self.settingsPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

它幾乎工作,但一個缺點是,它是不是用我的故事板設計的UIView。例如,在我的故事板中,該視圖將SettingsViewController類設計爲分組表視圖。有沒有辦法顯示彈出窗口中的故事板而不是原始SettingsViewController實例中設計的UIView?

解決方案:

我創建了與標識 「settingsPopover」 故事板全球SEGUE。

- (IBAction)settingsButtonTapped:(id)sender { 
    if (self.settingsPopover==nil) { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:sender]; 
    } 
} 

#pragma mark - UIView 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
    if ([segue.identifier isEqualToString:@"settingsPopover"]) { 
     self.settingsPopover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     self.settingsPopover.delegate = self; 
    } 
} 

#pragma mark - UIPopoverControllerDelegate 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    self.settingsPopover = nil; 
} 

回答

1

每次執行Segue時,都會創建一個新的viewController,正如您在連接按鈕以執行segue時所看到的那樣。因此,您需要通過從viewController圖標底部拖到目標位置來爲viewController創建一個「通用」segue。然後,LucasTizma建議將按鈕掛到IBAction,該按鈕要麼調用performSegueWithIdentifier:要麼取消彈出,取決於彈出窗口是否在屏幕上。

1

故事板旨在成爲一個通用的應用程序流和界面工具。他們從代碼中抽取了很多常見的樣板文件,以便您可以輕鬆查看高級別的情況。

不幸的是,你不能純粹在故事板中捕捉到你想要的邏輯。就像Storyboards很樂意以模態方式呈現視圖控制器一樣,但不知道如何以模態方式解除視圖控制器,故事板將呈現popover控制器,但它不能讓您解除視圖控制器。

  1. 而不是使用segue爲此,只需爲條形按鈕創建一個自定義IBAction。如果存在彈出窗口,請跟蹤該彈出窗口是否已呈現並將其解除。

  2. UIPopoverController有一個名爲popoverContentSize的屬性,可讓您控制此屬性。

2

I then do this inside the IBAction:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:self]; 
} 

But this gives me this error:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'

Have I created the segue in a bad way or in the call to performSegueWithIdentifier wrong?

你傳遞self代替sender(抽頭按鈕),當你調用-performSegueWithIdentifier:sender:即你給SEGUE一個UIViewController它需要一個UIBarButtonItemUIView

這應該工作:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:sender]; 
} 
+0

我已經改變了發件人,但我仍然得到相同的異常。 – dhrm 2011-12-28 16:42:45

+0

我的錯誤。當他們以這種方式呈現時,popover segues也需要一個定位點。在界面構建器中和屬性檢查器中選擇你的segue,將一個連接從錨字段拖到你的欄按鈕項。看這[截圖](http://cl.ly/Cv2O)。 – 2011-12-28 16:56:06

0

不同的解決方案是here。 segue將按鈕動作更改爲顯示或關閉彈出窗口。