2

私はiPadアプリを書いていますが、画面の1つにたくさんの小さなボタンがあり、押すとそのボタンから発生したポップオーバーに1文のテキストが表示されます。現在、すべてのポップオーバーはストーリーボードを使用して作成されており、ポップオーバーコントローラーを次のUIViewControllerように保存しています。

@property (nonatomic, strong) UIPopoverController *myPopoverController;

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) 
    {
        UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue *)segue;
        self.myPopoverController = popoverSegue.popoverController;
    }
}

しかし、私は回転に対処するための良い方法を理解することはできません。私のdidRotate方法は次のようになります。

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if (self.myPopoverController) 
    {
        [self.myPopoverController dismissPopoverAnimated: NO];
        [self.myPopoverController presentPopoverFromRect:??????  inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO];
    }
}

ただし、ポップオーバーは画面上の小さなボタンのいずれかから発生した可能性があるため、どこからポップオーバーを表示するかはわかりません。助言がありますか?これらは非常に単純なポップオーバーであるため、大量の新しいコードは理想的ではないことを忘れないでください。

4

1 に答える 1

1

最善の策は、押されたボタンへの参照を保持する別のプロパティをメインビューコントローラーに作成することです。何かのようなもの:

@property (nonatomic, strong) UIPopoverController *myPopoverController;
@property (nonatomic, weak) UIView *popoverButton;

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) 
    {
        UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue *)segue;
        self.myPopoverController = popoverSegue.popoverController;

        //The sender in prepareForSegue should be the view used to initiate the segue.
        popoverButton = (UIView *)sender;
    }
}

これで、ローテーションコードを次のように変更できます。

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if (self.myPopoverController) 
    {
        [self.myPopoverController dismissPopoverAnimated: NO];
        [self.myPopoverController presentPopoverFromRect:popoverButton.frame  inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO];
    }
}

押されたボタンへの参照を保持することは、ポインターを格納するためのリソースを消費しません。参照を弱く保つことで、保持サイクルを回避できます(結局、ビューコントローラーはボタンを所有せず、ボタンのスーパービューがボタンを所有します)。

于 2012-08-07T15:06:29.887 に答える