Раскадровка: Увольнение Popover с использованием метода делегирования/протокола

Я прочитал массу вещей по этому поводу, и, хотя большинство из них, похоже, касается подхода, отличного от раскадровки, я подумал, что я собрал кусочки вместе и понял это. Однако следующий код не приводит к увольнению моего popover. Кнопка throwPopoverButtonPressed в Popover выполняется, но точка останова в методе rejectPopover в делегате никогда не попадает. Очень хотел бы, чтобы кто-то бросил взгляд на код, чтобы обнаружить ошибки.

Спасибо

В следующем случае NewGameViewController содержит UIButton. При нажатии этой кнопки появляется Popover Segue и последующее отображение popover, содержащего UIView PopViewController.

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];
}

Ответ 1

При привязке к контроллеру popover из segue раскадровки, свойство popoverController для segue относится к стандарту UIPopoverController. Сам этот контроллер имеет свойство contentViewController, которое будет представлять собой контроллер представления, который фактически отображается в popover, в вашем случае PopViewController.

Итак, ваш текущий код устанавливает себя как делегат контроллера popover, когда он действительно должен быть настроен как делегат контроллера просмотра содержимого popover.

Вам все равно нужно сохранить ссылку на контроллер popover, чтобы убрать его, поэтому сохраните существующий код, но сделайте следующее изменение:

-(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 delegate
        popVC.delegate = self;
    }
}