2012-01-18 7 views
1

В моем модальный контроллер представления У меня есть метод управления кнопка, которая включает в себямодальный контроллер представления не вызывая представление контроллера представления dismissModalViewControllerAnimated: метод

[self dismissModalViewControllerAnimated: YES]; 

В контроллере представления Предъявление я переопределить dismissModalViewControllerAnimated: следующим образом:

-(void) dismissModalViewControllerAnimated: (BOOL)animated 
{ 
    NSLog(@"dismiss"); 
    [super dismissModalViewControllerAnimated: animated]; 
} 

При нажатии кнопки происходит обращение к методу обработки кнопки, но отклонение функции cancelModalViewControllerAnimated: override не вызывает вызова: NSLog (@ "увольнять"); оператор не вызывается, а точка останова внутри метода не попадает.

Я попытался

[[self presentingViewController] dismissModalViewControllerAnimated: YES]; 

, но это не сработало. Тем не менее, диспетчер модального просмотра отклоняется.

Любая идея, что может произойти неправильно?

ответ

0

Код, представленный модульным контроллером просмотра, содержался в UIViewController, который, в свою очередь, содержался в UINavigationController. Когда я назвал

[[self presentingViewController] dismissModalViewControllerAnimated: YES]; 

или

[self dismissModalViewControllerAnimated: YES]; 

сообщение увольнение направляется на объект UINavigationController.

2

Обычно это обрабатывается путем объявления вашего контроллера представления в качестве делегата для вашего контроллера модального представления. Модальный VC затем вызвал метод делегата в представленном VC, чтобы отклонить созданный им модальный переход.

Пример:

режимное VC.h:

@protocol ModalViewControllerDelegate 
-(void)dismissMyModalViewController; 
@end 

режимное VC.m:

// When you want to dismiss the Modal VC 
[delegate dismissMyModalViewController]; 

Представляя VC.h:

// Make sure to #import ModalVC.h 
@property (nonatomic, retain) id <ModalViewControllerDelegate> delegate; 

Представляя VC.m :

-(void)dismissMyModalViewController { 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

Где находится этот делегат собственность, и какой протокол это реализовать? Я не могу найти свойство делегирования в UIViewController, UIResponder или NSObject. –

+0

Вы добавляете свой собственный делегат METHOD, а не свойство делегата. Я приведу пример в ответе. Подождите пожалуйста. –

+0

Я ценю ваше время, чтобы ответить. Я понимаю, что вы сейчас говорите, но я не вижу смысла. Представляется сложным способом передать Modal VC указатель на Представляющий VC. В любом случае из моего ответа вы увидите, что проблема заключалась в том, что сообщение об увольнении отправлялось на контроллер навигации, а не в содержащийся в нем UIViewController. –

2

из Programming iOS 6, by Matt Neuburg:

На IPad, когда modalPresentationStyle Представленного контроллер представления является UIModalPresentationCurrentContext, решение должно быть принято относительно того, что вид контроллера должна быть presentingViewController Представленного контроллера представления. Это определит, какой вид будет заменен представленным представлением контроллера представления. Это решение включает другое свойство UIViewController, определяетPresentationContext (BOOL). Начиная с контроллера представления, которому был отправлен presentViewController: анимированный: завершение: мы подходим к цепочке контроллеров родительских представлений, ищем тот, чье свойство definePresentationContext равно YES. Если мы найдем один, это тот; это будет presentingViewController, и его представление будет заменено представлением контроллера представления.Если мы его не найдем, все будет работать так, как если бы представленный диспетчер представления представления modalPresentationStyle был UIModalPresentationFullScreen.

TL; DR
1. установить definesPresentationContext истину на желаемом presentingViewController
2. Установите modalPresentationStyle в UIModalPresentationCurrentContext на желаемом presentedViewController

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