Представен контролер за изглед, скрит под контролера за навигация

Наистина съм нов в разработката на iOS, сега следвам някои курсове, за да навляза в нея. Целта е да се коригира едно наистина старо приложение, създадено от бивш колега в началото на 2011 г. Имам този проблем, който не мога да коригирам.

Искам да представя ViewController, показващ екран за влизане. Но когато ViewController е представен, той се скрива под навигационния контролер и лентата на състоянието. Получавам и тази грешка:

Не се препоръчва представянето на контролери за изглед на отделни контролери за изглед

Ето кода:

    Login *fvController = [[Login alloc] initWithNibName:@"Login" bundle:[NSBundle mainBundle]];
    [fvController setTitle:@"Login"];
    UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:fvController];
    [fvController setKc:self];
    [self presentViewController:navCon animated:YES completion:nil];
    [fvController release];
    [navCon release];
    navCon = nil;
    fvController = nil;

Някой, който може да ми помогне?

Благодаря предварително!


person djsmit    schedule 11.06.2014    source източник


Отговори (2)


UIWindows има поле rootViewController, сочещо към първия контролер за изглед във вашата йерархия. Ако представите контролер за изглед от контролер извън тази йерархия, се случват странни неща.

Проверете дали вашият ключов прозорец ([yourUIApplication keyWindow]) има зададено това поле. Ако е нула, цялата ви йерархия е отделена и се нуждае от преразглеждане. Ако прозорецът има контролер за основен изглед, можете да представите изгледа си оттук, докато преструктурирате йерархията си, така че всички изгледи в крайна сметка да са свързани с корена.

person Javier C    schedule 11.06.2014
comment
Здравейте, благодаря за коментара! Не знам точно къде да направя това. Зададох моя rootViewController в моя AppDelegate така: window.rootViewController = tabBarController; [window makeKeyAndVisible]; Прав си, че трябва да има нещо нередно в йерархията. Това приложение използва между другото Xib. - person djsmit; 12.06.2014

Това се случва, защото освобождавате създадения от вас екземпляр на вашия ViewController, опитайте да промените кода по този начин:

Декларирайте вашите viewControllers под @implementation в горната част на вашия viewController

@implementation yourViewController
{
   Login *fvController;
   UINavigationController *navCon;
}

Сега променете кода си по този начин

fvController = [[Login alloc] initWithNibName:@"Login" bundle:[NSBundle mainBundle]];
[fvController setTitle:@"Login"];
navCon = [[UINavigationController alloc] initWithRootViewController:fvController];
[fvController setKc:self];
[self presentViewController:navCon animated:YES completion:nil];

И добавете вашите освобождаващи обекти към метода dealloc

- (void)dealloc 
{
    [fvController release];
    [navCon release];
    navCon = nil;
    fvController = nil;
}
person E-Riddie    schedule 11.06.2014
comment
Благодаря за коментара. Това всъщност не работи. Получавам грешки Използване на недеклариран идентификатор при метода dealloc. - person djsmit; 12.06.2014
comment
Получавате тези грешки, защото вашите viewControllers не са декларирани като глобални. Ще редактирам отговора си. - person E-Riddie; 12.06.2014
comment
Благодаря отново за коментара. Тези грешки вече наистина ги няма. Но сега получавам предупреждения за Локална декларация на '' скрива променлива на екземпляр. Между другото, получавам много от тези предупреждения в целия си проект. - person djsmit; 12.06.2014
comment
Получавате тези грешки, защото декларирате отново вашите променливи, които сте декларирали при внедряване, или синтезирани свойства. Така че при внедряването вие декларирате Login *fvController. Но също и в друг метод декларирате отново Вход *fvController; докато можете просто да въведете fvController. - person E-Riddie; 12.06.2014
comment
Има смисъл, благодаря! Но това не реши проблема. Представеният viewController все още е скрит под navigationController. Също така все още получавам това предупреждение Представянето на контролери за изглед на отделни контролери за изглед не се препоръчва. Мисля, че има повече общо с настройването на rootController от мястото, където се представя този нов viewController, като @JavierC състоянията. Но не мога да разбера какво точно означава... - person djsmit; 12.06.2014
comment
Вие работите с XIB и аз не съм работил с тези оформления, но тази функция не се изпълнява на вашия представен navigationController, трябва да я зададете, преди да вградите своя vc в nc: [fvController setKc:self]; - person E-Riddie; 12.06.2014