2

У меня есть пара модальных представлений, которые работают «отлично» и теперь перестали возвращаться к контроллеру родительского представления, и «код не изменился». - классическое описание проблемы.iPad: представление модального вида, а мой parentViewController теперь равен нулю?

Я отлаживал отклонение модального вида и контроллер родительского представления равен нулю, что объясняет проблему, но не причину. Я обновил свой SDK с 4.1.2 до 4.2, поэтому я могу начать работать с iOS 5. Я подозреваю, что ARC нового управления памятью и мой стиль autorelease по сравнению с сохранением/выпуском.

Ниже приводится код из моего rootview контроллера в AboutViewController:

- (IBAction)doInfo:(id)sender { 
    NSLog(@"%s", __FUNCTION__); 
    AboutViewController *aboutViewController = [[[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:[NSBundle mainBundle]] autorelease]; 
    if (aboutViewController) { 
     aboutViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     aboutViewController.hidesBottomBarWhenPushed = YES; 
     self.navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     self.navigationController.navigationBarHidden = YES; 
     [self presentModalViewController:aboutViewController animated:YES]; 
    } 
} 

Ниже приводится смещать в AboutViewController обратно к родителю после нажатия на кнопку «Готово».

- (IBAction)doDone:(id)sender { 
    NSLog(@"%s", __FUNCTION__); 
    [[self parentViewController] dismissModalViewControllerAnimated:YES]; 
} 

ОК ... исправлено, изменив следующее. Теперь вопрос в том, почему это раньше?

- (IBAction)doDone:(id)sender { 
    NSLog(@"%s", __FUNCTION__); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

ответ

6

Цитирование из [1] о недвижимости parentViewController:

Перед прошивкой 5.0, если вид не имеет родительский контроллер вид и будет представлен модально, контроллер представления, которое было представить его будет возвращено. Это уже не так. Вы можете получить контроллер представления представления, используя свойство presentingViewController.

Таким образом, это устраняет проблему, почему это действительно работало раньше и больше не работает. Если вы создаете для iOS 5, я бы использовал свойство presentingViewController, так как по документам рекомендуется, чтобы родительский контроллер представления (или в этом случае) отклонил модальное представление. Однако, если вы построите iOS 4 и 5, я бы включил ваш код, поскольку он все равно переадресует вызов на соответствующий контроллер.

Если в любом случае приложение работает безупречно на iOS 5 перед повторной компиляцией, я бы предположил, что Apple поставила некоторые хитрости во время выполнения, которые имитируют старое поведение приложений, скомпилированных до iOS5.

[1] http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

+0

FYI - Я проверил перестановки целей 4.1, 4.2., 4.3 и 5.0 с моим кодом на iPad с iOS4 (кроме целевого 5.0), iPad с iOS5 и Simulator 5.0. Он подтверждает то, что вы нашли в документах. Код iOS 4 падает с представлениемViewController как «не найден». – mobibob

1

Я построил категорию, добавить presentingViewController на прошивке 4.

Он выключает себя на прошивке 5.

Вы можете использовать его легко. См. backward-modal.

Я надеюсь, что это принесет вам пользу, как и для меня; Это делает ваш код более чистым!

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