11

私はこれについてたくさんのことを読みましたがほとんどがストーリーボード以外のアプローチに関するものであるように見えますが、私はビットをつなぎ合わせて理解したと思いました. ただし、次のコードでは、ポップオーバーが閉じられません。Popover の DismissPopoverButtonPressed ボタンは実行されますが、デリゲートの DismissPopover メソッドのブレークポイントはヒットしません。間違いを見つけるためにコードに目を向けている人に感謝します。

ありがとう

以下では、NewGameViewController に UIButton が含まれています。これを押すと、ポップオーバー セグエが発生し、その後に PopViewController UIView を含むポップオーバーが表示されます。

NewGameViewController.h

#import "PopViewController.h"
@interface NewGameViewController: UIViewController <DismissPopoverDelegate>
{
    UIPopoverController *popover;
}

NewGameViewController.m

@implementation NewGameViewController
-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"popoverSegue"])
    {
        popover = [(UIStoryboardPopoverSegue *)segue popoverController];
        // getting warning: Assigning to 'id<UIPopoverControllerDelegate>' from incompatible type 'NewGameViewController *const__strong'
        //popover.delegate = self;
    }
}

-(void)dismissPopover
{
    [popover dismissPopoverAnimated:YES];
}

PopViewController.h

@protocol DismissPopoverDelegate <NSObject>
-(void) dismissPopover;
@end

@interface PopViewController: UIViewController
{
    __unsafe_unretained id<DismissPopoverDelegate> delegate;
}

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate;
-(IBAction)dismissPopoverButtonPressed:(id)sender;
@end

PopViewController.m

#import "NewGameViewController.h"
@implementation PopViewController
@synthesize delegate;
-(IBAction)dismissPopoverButtonPressed:(id)sender
{
    [self.delegate dismissPopover];
}
4

1 に答える 1

13

ストーリーボード セグエからポップオーバー コントローラーにリンクする場合、popoverControllerセグエのプロパティは標準の UIPopoverController を参照します。このコントローラー自体にはcontentViewController、ポップオーバー内に実際に表示されているビューコントローラーを表すプロパティがありますPopViewController

したがって、現在のコードは、ポップオーバーのコンテンツビュー コントローラーのデリゲートとして自分自身を設定する必要があるときに、ポップオーバー コントローラーのデリゲートとして自分自身を設定しています。

閉じるには、ポップオーバー コントローラーへの参照を引き続き保持する必要があるため、既存のコードを保持しますが、次の変更を行います。

-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"popoverSegue"])
    {
        popover = [(UIStoryboardPopoverSegue *)segue popoverController];
        // Get a reference to the content view controller of the popover
        PopViewController *popVC = (PopViewController*)popover.contentViewController;
        // Set ourselves as the content VC's delegate
        popVC.delegate = self;
    }
}
于 2012-06-10T06:41:47.903 に答える