2013-05-29 2 views
3

У меня есть кнопка, которая приводит к popOver, созданному в Interface Builder. PopOver закрывается, когда я нажимаю где-то за его пределами, но я также хотел бы реализовать кнопку внутри popOver, которая делает это.iOS: увольнение popOver, сгенерированное с помощью интерфейса Builder с кнопкой внутри popOver

Я нашел решение от Giorgio Barchiesi, относящееся к 2011 году, однако я не смог его реализовать. Вот его решение:

В файле реализации контроллера представления источника:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]]) { 
     MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController]; 
     UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue; 
     [viewController setPopoverController:[popoverSegue popoverController]]; 
    } 
} 

В заголовочном файле контроллера представления назначения:

@property (weak, nonatomic) UIPopoverController* popoverController; 

В файле реализации в целях назначения контроллер:

@synthesize popoverController; 

Тот же файл, когда захотите уволить пользователя:

[popoverController dismissPopoverAnimated:YES]; 

Я мог бы вызвать последнюю функцию при нажатии кнопки. Моя проблема заключается в том, что XCode дает мне ошибку на [viewController setPopoverController:[popoverSegue popoverController]] линии: ARC Семантический Выпуск: Нет известный метод класса для выбора «setPopOverController»

Что я пропускаю реализовать?

ответ

1

Вы можете добавить делегат < UIPopoverControllerDelegate> в класс и переопределить метод делегата:

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController 
{ 
    return NO; 
} 

Это предотвратит поповер быть уволенным, когда пользователь нажимает в любом месте на экране. Теперь вы можете отпустить поповер внутри метода селектор данной кнопки с помощью:

[popoverController dismissPopoverAnimated:YES]; 
+0

спасибо, но я не спросил, как прекратить отклонять popOver, когда пользователь выталкивает его за пределы. вместо этого я спросил, как уволить его с помощью кнопки внутри popOver? – user2014551

+0

Вы вызываете метод наподобие: [popoverController rejectPopoverAnimated: YES]; в методе выбора кнопки, например - (IBAction) buttonPressed {[popoverController rejectPopoverAnimated: YES]; } Неужели это не работает? – Amit

+0

Да, я. Проблема в том, что popoverController не может уволить только самого себя. Ему нужна ссылка из его корневого представления, и это был пользователь chandan, который пытался решить, но я, должно быть, что-то забыл, потому что он не работает ... – user2014551

0

Попробуйте этот код

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]]) 
    { 
     MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController]; 

     UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue; 

     popoverSegue.popoverController=[[UIPopoverController alloc] initWithContentViewController:viewController]; 

     [popoverSegue.popoverController setPopoverContentSize:CGSizeMake(viewController.view.frame.size.width, viewController.view.frame.size.height)]; 

     popoverSegue.popoverController.delegate=self; 

     [viewController setPopoverController:popoverSegue.popoverController]; 
    } 
} 

Я надеюсь, что это помогает.

+0

спасибо за быстрый ответ, но это не работает в моем случае. , когда я пытаюсь установить 'popoverSegue.popoverController = [[UIPopoverController alloc] initWithContentViewController: viewController];' метод я не могу установить свой корневой ViewController там _ (Неожиданное имя интерфейса 'ViewController') _ и i он все равно возвращает то же самое ошибка в функции setPopOverController. Должен ли я где-то устанавливать свойство для своих ViewControllers в файле .h? – user2014551

+0

Добро пожаловать user2014551. это работает или нет? – chandan

2

Вот метод я использую:

Откройте файл раскадровки, выберите SEGUE стрелку и откройте Attributes Inspector (Option - Command - 4) и идентификатор заполнения в разумном имя, как «myPopoverSegue».

В вашем Source View Controller определить переменную сразу после @implementation:

@implementation ViewController 
{ 
    __weak UIPopoverController *myPopover; 
} 

Затем снова в Source VC:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([segue.identifier isEqualToString:[dict objectForKey:@"myPopoverSegue"]]) {//@"segue" is your segue name. You can use isKindOfClass as you do currently, I prefer this method. 
     myPopover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
    } 
} 

-(void)closePopover{ 
    [myPopover dismissPopoverAnimated:YES]; 
} 

В конце вашего метода viewDidLoad записи Source ВК:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closePopover) name:@"popoverShouldDismiss" object:nil]; 

И, наконец, всякий раз, когда вы хотите удалить попкорн:

[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil]; 

Надеюсь, это поможет! Таким образом, вы также сможете изменить segue на другой контроллер, не изменяя свой код.

1

В iOS 8 это очень просто. Просто позвоните

[self dismissViewControllerAnimated:YES completion:^{}]; 

Pop-over - обычные контроллеры презентации, поэтому это более или менее то же самое, что и контроллер модального вида.

+0

Это, безусловно, правильный путь. Я создаю 'IBAction', связанный с кнопкой таким образом:' - (IBAction) нажалCloseButton: (id) отправитель {[self rejectViewControllerAnimated: YES complete: nil]; } ' – matteolel

Смежные вопросы