it-swarm.com.ru

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

* РЕДАКТИРОВАТЬ * Вот код Может кто-то указать, где он вложен . Похоже, они вложены, Пожалуйста, предложите, как связать, используя дочерний шаблон 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];

}
23
Ram G.

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

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

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

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

18
Marcus Adams

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

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

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

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

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

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

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

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

18
Riccardo Tesio

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

7
bmueller

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

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

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

[self dismissViewControllerAnimated:YES completion:nil];

4
cdescours

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

2
AndyDunn

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

2
berbie

Вызов [self presentViewController: vc animated: NO complete: nil]; во viewDidAppear исправил проблему для меня.

1
oyvindhauge

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

0
Dan Levy

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

0
Clive Jefferies