Подтвердить что ты не робот

IOS 7 - Получение предупреждающего сообщения при представлении контроллера модального просмотра

Компиляция и запуск с использованием iOS 7 - Появляется предупреждающее сообщение: "Представление контроллеров представлений на отдельных контроллерах просмотра не рекомендуется" при представлении контроллера модального представления. У меня никогда не было проблем с iOS 6 или более ранней версией. Может ли кто-нибудь показать, если что-то изменилось при представлении модального контроллера?

SearchViewController *controller1;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController-iPad" bundle:nil];
}
else
{
   controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
}
controller1.delegate = self;
[[self navigationController] presentModalViewController:controller1 animated:YES];

* EDIT * Вот код. Может ли кто-нибудь указать, где он вложен. Похоже, что они вложены, пожалуйста, предложите, как установить связь с помощью шаблона child viewcontroller.

(void)applicationDidFinishLaunching:(UIApplication *)application
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController-iPad" bundle:nil];
    }
    else
    {
       self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    }

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.loginRootviewController];


    DDMenuController *rootController = [[DDMenuController alloc] initWithRootViewController:navController];
    _menuController = rootController;



    AppMainMenuViewController *leftController = [[AppMainMenuViewController alloc] init];
    rootController.leftViewController = leftController;
    self.loginRootviewController.delegateLogin = leftController;

    self.window.rootViewController = rootController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

}
4b9b3361

Ответ 1

Контроллер вида отсоединяется, если в доске объявлений не сообщается о каких-либо сегментах, которые подключают этот контроллер просмотра каким-либо образом к контроллеру корневого представления.

Было предложено создать segue через Interface Builder и вызвать его в коде, даже для модального представления, если вы используете раскадровку.

Даже с XCode 4.6.x и iOS 6.x вы получили предупреждения во время сборки о непривязанных контроллерах представлений.

Если у вас есть две раскадровки (одна для iPhone и одна для iPad), вы можете назвать segue одинаковым для каждого. Идентификаторы Segue должны быть уникальными только для раскадровки. Итак, выполнение segue (performSegueWithIdentifier) с тем же идентификатором может привести вас в одно место на iPhone и другое на iPad.

Ответ 2

У меня была такая же проблема, и я тоже не использовал раскадровку (я работаю над трехлетним проектом).

В моем случае причина в том, что я не назначил rootViewController моего приложения в окно, например:

- (BOOL)application:didFinishLaunchingWithOptions:
{
    ...
    self.window.rootViewController = myRootViewController; // I was missing this
    ...
}

Больше никаких предупреждений.

Ответ 3

Это предупреждение обычно возникает, когда мы пытаемся представить контроллер представления по модулю в другом контроллере представлений, который не является частью rootViewController, и мы просто добавляем viewview view view view view.

На этом этапе мы должны вызвать presentViewController в этом контроллере представления, который является частью rootViewController.

Итак, мы можем напрямую представить любой контроллер представления в корневом контроллере

UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:obj animated:YES completion:nil];
[vc dismissViewControllerAnimated:YES completion:nil];

Ответ 4

Для тех, кто использует DDMenuViewController, это простое исправление. Просто добавьте [self addChildViewController:controller]; в initWithRootViewController и в setRightViewController и setLeftViewController.

Ответ 5

Чтобы избежать предупреждения в push-навигации, вы можете напрямую использовать:

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

И затем в вашем модульном контроллере просмотра, когда все будет готово, вы можете просто позвонить:

[self dismissViewControllerAnimated:YES completion:nil];

Ответ 6

Это сообщение может появляться, когда у вас есть вложенные контроллеры view. Если это так, убедитесь, что они связаны с помощью шаблона child viewcontroller.

Ответ 7

Если вы используете раскадровку и получаете эту ошибку, это может произойти при попытке автоматического представления представления из viewDidLoad слишком быстро. Если вы вызываете свой модальный сеанс через небольшое количество времени, он работает без каких-либо дополнительных предупреждений.

Ответ 8

Вызов [self presentViewController: vc animated: НЕТ завершения: ноль]; in viewDidAppear исправил эту проблему для меня.

Ответ 9

У меня была та же проблема. Но вместо того, чтобы я начал просмотр, именно так настроилось представление. Я случайно установил класс в представлении класса контроллера вида, а не владельца файла. Подсказка заключалась в том, что он отобразил представление, но некоторые из стилей отсутствовали. Странно то, что он работал над более старыми версиями iOS.

Ответ 10

Я обнаружил, что если вы используете раскадровку, вам нужно поместить код, представляющий новый контроллер представления в viewDidAppear. Он также избавится от предупреждения "Неравновесные вызовы для начала/окончания появления переходов для...".

Ответ 11

В iOS 7, presentModalViewController устарел.

Я заменил его

[self.navigationController pushViewController: Просмотр                                    анимированный: ДА];

и он исправил ряд ошибок, которые я получал.

Стоит попробовать.