重複の可能性:
ストーリーボードのポップオーバーを閉じる方法
私はiPadの絵コンテを持っています。あるビューのバー ボタン アイテムを Control キーを押しながら別のビューにドラッグすると、ポップオーバー スタイルが選択されます。ボタンを押すと、新しいポップオーバー ビューがポップオーバーに表示されますが、2 つの問題があります。
- ボタンをもう一度押すと、ポップオーバー ビューの別のインスタンスが表示されます。黒い境界線がどんどん暗くなっていくのがわかります。ポップオーバー ビューが開いているときにボタンを押すと、ポップオーバー ビューが閉じます。どうやってやるの?
- 現在、新しいポップオーバー ビューは、ビュー内のコンテンツがそれほど高くなくても、画面のボタンにフローティングしています。ポップオーバー ビューのサイズを制御するにはどうすればよいですか?
EDIT1:
コントローラーの下部にある黄色のコントローラー アイコンから、ポップオーバー内にあるはずの他のビューにドラッグして、セグエを作成しました。このポップオーバーの識別子は settingsPopover です。
次に、IBAction 内でこれを行います。
- (IBAction)settingsButtonTapped:(id)sender {
[self performSegueWithIdentifier:@"settingsPopover" sender:self];
}
しかし、これは私にこのエラーを与えます:
キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'UIStoryboardPopoverSegue は、バー ボタン アイテムまたはビューから提示する必要があります。
セグエを悪い方法で、または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];
}
ほとんど動作しますが、1 つの欠点は、ストーリーボードで設計された UIView を使用していないことです。たとえば、私のストーリーボードでは、SettingsViewController クラスを持つビューがグループ化されたテーブル ビューとして設計されています。生の SettingsViewController インスタンスの代わりに、ポップオーバー内のストーリーボードで設計された UIView を表示する方法はありますか?
解決:
「settingsPopover」という識別子を使用して、ストーリーボードにグローバル セグエを作成しました。
- (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;
}