2011-12-28 4 views
3

Possible Duplicate:
How to Dismiss a Storyboard PopoveriOS:ポップオーバーを解散する方法

私はiPadのストーリーボードを持っています。あるビューのBar Button Itemは別のビューにControlドラッグされ、Popoverスタイルが選択されます。私は、新しいポップオーバービューがポップオーバーに示されているボタンを押すと、私は二つの問題がある場合:私は、もう一度ボタンを押すと

  1. 、ポップオーバービューの別のインスタンスが表示されます - 私が見ることができる、ということ黒い境界が暗くなり、暗くなります。ポップオーバービューが開いていて、ボタンを押すと、ポップオーバービューは消えるはずです。どうやってやるの?
  2. 現在、新しいポップオーバービューは、ビュー内のコンテンツがその高さではなくても、画面のボタンにフローティングしています。ポップオーバービューのサイズを制御するにはどうすればよいですか?

EDIT1:

Iは、ポップオーバーの内部でなければならない他のビュー、コントローラの底部の黄色コントローラアイコンからドラッグしてセグエを作成しました。このポップオーバーの識別子は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.'

は、私は悪い方法でまたは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をPopover内に表示する方法はありますか?

ソリューション:

私は、識別子 "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; 
} 

答えて

1

Segueが実行されるたびに、Segueを実行するためにボタンを配線したときに表示されるように、新しいViewControllerが作成されます。代わりに、viewControllerの下位にあるviewControllerアイコンから目的地までドラッグすることによって、 "一般的な" segueを作成する必要があります。その後、LucasTizmaはIBActionにボタンをフックし、performSegueWithIdentifier:を呼び出すか、またはポップオーバーが画面上にあるかどうかを条件にしてポップオーバーを解除することを提案しました。あなたが代わりにsenderself(タップボタン)あなたは、すなわち-performSegueWithIdentifier:sender:を呼び出すとき、あなたはセグエそれがUIBarButtonItemまたはUIView期待しUIViewControllerを与えているを渡している

1

ストーリーボードは、一般的なアプリケーションフローとインターフェイスツールを意図しています。彼らはあなたのコードから多くの一般的な定型文を抽象化するので、何が高レベルで起こっているのかを簡単に見ることができます。

残念ながら、純粋にストーリーボードで必要なロジックをキャプチャすることはできません。 Storyboardsは、View Controllerをモダンな方法でSegueとして表示しますが、View Controllerをモーダルに解除する意識はないように、StoryboardsはPopover Controllerを表示しますが、それらを閉じる機能はありません。

  1. の代わりに、このためにセグエを使用して、ちょうどバーボタンのカスタム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?

これは動作するはずです:

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

送信者を変更しましたが、同じ例外が発生します。 – dhrm

+0

私の間違い。 Popover seguesは、このように提示されるときにアンカーポイントも必要とします。インターフェイスビルダと属性インスペクタでセグを選択し、アンカーフィールドからバーボタンアイテムに接続をドラッグします。この[screenshot](http://cl.ly/Cv2O)を参照してください。 –

0

異なるソリューションをhereです。 segueはボタンアクションをポップアップの表示または非表示に変更します。

関連する問題