3

重複の可能性:
ストーリーボードのポップオーバーを閉じる方法

私はiPadの絵コンテを持っています。あるビューのバー ボタン アイテムを Control キーを押しながら別のビューにドラッグすると、ポップオーバー スタイルが選択されます。ボタンを押すと、新しいポップオーバー ビューがポップオーバーに表示されますが、2 つの問題があります。

  1. ボタンをもう一度押すと、ポップオーバー ビューの別のインスタンスが表示されます。黒い境界線がどんどん暗くなっていくのがわかります。ポップオーバー ビューが開いているときにボタンを押すと、ポップオーバー ビューが閉じます。どうやってやるの?
  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;
}
4

4 に答える 4

2

次に、IBAction 内でこれを行います。

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

しかし、これは私にこのエラーを与えます:

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'UIStoryboardPopoverSegue は、バー ボタン アイテムまたはビューから提示する必要があります。

悪い方法でセグエを作成しましたか、それとも performSegueWithIdentifier の呼び出しで間違っていましたか?

つまり、呼び出すときに (タップされたボタン) のself代わりに渡しています。sender-performSegueWithIdentifier:sender:UIViewControllerUIBarButtonItemUIView

これはうまくいくはずです:

 - (IBAction)settingsButtonTapped:(id)sender {
         [self performSegueWithIdentifier:@"settingsPopover" sender:sender];
 }
于 2011-12-28T16:33:07.263 に答える
1

セグエが実行されるたびに、セグエを実行するためにボタンを配線したときに見られるように、新しいviewControllerが作成されます。したがって、代わりに、下部のviewControllerアイコンから宛先にドラッグして、viewControllerの「汎用」セグエを作成する必要があります。次に、LucasTizma が提案したように、ポップオーバーが画面上にあるかどうかを条件として、ポップオーバーをIBAction呼び出すか閉じるボタンにボタンを接続します。performSegueWithIdentifier:

于 2011-12-28T13:44:00.160 に答える
1

ストーリーボードは、一般的なアプリ フローおよびインターフェイス ツールとなることを目的としています。コードから多くの一般的なボイラープレートを抽象化するため、ハイレベルで何が起こっているかを簡単に確認できます。

残念ながら、必要なロジックをストーリーボードだけでキャプチャすることはできません。ストーリーボードがビュー コントローラーをセグエとして喜んでモーダルに提示するが、ビュー コントローラーをモーダルに閉じることを認識しないのと同じように、ストーリーボードはポップオーバー コントローラーを提示しますが、それらを閉じる機能は提供しません。

  1. これにセグエを使用する代わりにIBAction、バー ボタンのカスタムを作成します。ポップオーバーが表示されているかどうかを追跡し、表示されている場合はこのメソッドで閉じます。

  2. UIPopoverControllerpopoverContentSizeには、これを制御できるというプロパティがあります。

于 2011-12-28T13:28:07.207 に答える
0

別の解決策はこちらです。セグエは、ボタンのアクションを変更して、ポップアップを表示または閉じるようにします。

于 2012-01-15T06:17:13.100 に答える