Ошибка @interface в классе AppDelegate.m

должно быть простое решение, которое мне не хватает. У меня есть приложение, управляемое Tab View Controller, которое я хотел бы защитить паролем всякий раз, когда приложение запускается или открывается пользователем. Я создал класс пароля и контроллер представления в IB.

Я пытаюсь использовать метод applicationDidLoadInForeground класса AppDelegate.m со следующим кодом:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSUserDefaults *submissionDefaults = [NSUserDefaults standardUserDefaults];
    if ([submissionDefaults boolForKey:@"passcodeActive"] == true)
    {   
        PINAuthViewController *pinController = [[PINAuthViewController alloc] init];
        [self presentViewController:pinController animated:YES completion:nil];
    }
}

Я импортировал свой класс PINAuthViewController в заголовок

#import "PINAuthViewController.h"

но я получаю сообщение об ошибке при компиляции «Нет видимого @interface для« AppDelegate »объявляет селектор« PresentViewController: анимированный: завершение ».

Может ли кто-нибудь посоветовать, что я делаю неправильно? Намерение состоит в том, чтобы закрыть контроллер представления пароля, если пароль введен правильно.

Большое спасибо, Джеймс


person JamesLCQ    schedule 15.12.2012    source источник


Ответы (2)


Делегат приложения не может представлять контроллер представления, поскольку он не является подклассом самого UIViewController.

Вам нужно изменить код на:

[self.window.rootViewController presentViewController:pinController animated:YES completion:nil];
person Hesham    schedule 15.12.2012
comment
В этом вызове метода отсутствует критический текст. - person rmaddy; 15.12.2012
comment
Упс, исправлено! Спасибо за внимание. - person Hesham; 15.12.2012
comment
Спасибо обоим! Теперь мой код компилируется, но когда я его запускаю, при выполнении строки вид становится черным. В xcode выдается следующее предупреждение: Предупреждение: попытка представить ‹PINAuthViewController: 0x1206b610› на ‹TBMasterViewController: 0x967a890›, чье представление не находится в иерархии окон! Есть еще советы, как обойти это? Спасибо! - person JamesLCQ; 15.12.2012
comment
Я предлагаю вам переместить логику для проверки того, активен ли код доступа, в ваш контроллер основного представления (тот, который отображается после запуска приложения), а не в делегат приложения. Это должно решить вашу проблему. - person Hesham; 15.12.2012
comment
Привет, Хешам, я бы предпочел, чтобы он был в контроллере основного вида. Не могли бы вы посоветовать, куда мне его поместить, чтобы он срабатывал только при первом открытии и при повторном запуске приложения после того, как оно было в фоновом режиме? Имейте в виду, что я использую контроллер TabBar, поэтому у меня есть несколько контроллеров представления, которые можно перезапустить в... Спасибо, Джеймс. - person JamesLCQ; 15.12.2012
comment
@JamesLCQ: в методе, который вы вызываете либо из делегата вашего приложения applicationWillEnterForeground:, либо в ответ на UIApplicationWillEnterForegroundNotification. - person Peter Hosey; 16.12.2012
comment
Предупреждение, которое вы получаете о том, что представление не находится в иерархии окон, связано с тем, что вы выполняете код из applicationDidLoadInForeground, поэтому он пытается представить контроллер представления до того, как приложение запустится и добавит основной контроллер представления в окно приложения. Если вы переместите свой код в didFinishLaunchingWithOptions, он также должен работать нормально. - person Hesham; 16.12.2012
comment
Спасибо за помощь :х - person Johnny Nguyen; 28.06.2014

вы также можете попробовать этот код...

self.viewController = [[FirstViewController  alloc] initWithNibName:@"FirstViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
person Ankit Sharma    schedule 20.10.2015