Использование applicationwillenterforeground для экрана с паролем - PullRequest
6 голосов
/ 08 августа 2010

До iOS4 контроллер начального вида моего приложения проверял переменную настроек включения / выключения пароля в viewWillAppear и, если он включен, отображал экран модального пароля, который оставался там до тех пор, пока не был введен правильный пароль или не была нажата кнопка «Домой».

В iOS4, если мое приложение работает в фоновом режиме, я бы хотел, чтобы пользователь чувствовал себя комфортно, так как данные, содержащиеся в приложении, не были легко доступны, если бы он передал свой телефон кому-то, кто будет его использовать.

Так как приложение могло вернуться к любому экрану (экран, на котором приложение было последним), я решил, что повсеместно буду использовать UIApplicationWillEnterForegroundNotification с локальными селекторами (дублирующимися методами enterPasscode), каждый из которых имеет правильный контроллер представления длянажмите на основе локального экрана, но должен быть лучший способ.

У меня может быть небольшое концептуальное недоразумение здесь.Может кто-нибудь предложить другой подход или подтолкнуть меня к следующему шагу.Могу ли я иметь это как общий метод, но все еще знать правильный локальный контроллер представления, чтобы выдвинуть?

Спасибо

РЕДАКТИРОВАТЬ / ОБНОВИТЬ:

Короткая версия: Это работает, но, возможно, все еще может быть лучший способ (любая помощь приветствуется) ...

Я создал стандартный синглтон с контроллером представления.

PasscodeView.h, содержащий:

UIViewController *viewController;
@property (nonatomic, retain) UIViewController *viewController;

PasscodeView.m, содержащий:

@synthesize viewController;

Я поместил это вAppDelegate:

-(void)applicationWillEnterForeground:(UIApplication*)application {

    PasscodeView *passcodeView = [PasscodeView sharedDataManager];
    UIViewController *currentController =  [passcodeView viewController];
    NSLog(@"%@", currentController);  //testing
    EnterPasscode *passcodeInput = [[EnterPasscode alloc] initWithNibName:@"Passcode" bundle:nil];
    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

и следующее во всех моих viewDidLoad, обновляя текущий контроллер представления, когда я заходил на каждый экран (только 2 строки, но все еще кажется, что есть лучший способ):

PasscodeView *passcodeView = [PasscodeView sharedSingleton];
passcodeView.viewController = [[self navigationController] visibleViewController];

Хотелось бы, чтобы был способ получить текущий контроллер вида из applicationWillEnterForeground, но я не смог его найти - любая помощь здесь по-прежнему ценится.

Для согласованности я изменил строку и добавил строку, чтобы получить панель навигации, соответствующую остальному приложению и включающую заголовок.

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeInput];
[currentController presentModalViewController: passcodeNavigationController animated:NO];

Ответы [ 2 ]

3 голосов
/ 08 августа 2010

Вы можете централизовать это поведение в делегате приложения, внедрив

-(void)applicationWillEnterForeground:(UIApplication*)application;

Вы можете реализовать синглтон, в котором хранится текущий соответствующий модальный контроллер вида, обновляя его в viewWillAppear на каждом из ваших контроллеров представления.

Редактировать : Я предполагал, что у вас уже есть серия контроллеров представления, которые вы хотели показать. Я сомневаюсь, что тебе это действительно нужно. Если у вас есть один вызываемый, скажем, PasscodeInputController, то ваш applicationWillEnterForeground будет выглядеть примерно так:

-(void)applicationWillEnterForeground:(UIApplication*)application {
    UIViewController *currentController =  [window rootViewController];
    PasscodeInputController *passcodeInput = [[PasscodeInputController alloc] init];

    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

Я надеюсь, что это ответит на ваш вопрос более прямо.

1 голос
/ 08 августа 2010

Поведение вашего приложения при повторном входе на передний план должно быть максимально схожим с тем, когда оно запускается в первый раз.Имея это в виду, вы можете объединить свои applicationDidFinishLaunching: с applicationWillEnterForeground:, но, учитывая, что некоторые представления могут быть уже загружены.Код выглядит примерно так:

id myState = (isReentering) ? [self validateState] : [self loadStateFromSave];
NSArray * keyForObjectToLoad = [self objectsToLoadForState:myState];
for(NSString * key in keyForObjectToLoad)
    if(![self objectForKey:key]) [self loadObjectForKey:key];

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

  • Это обеспечит запуск и повторный запуск аналогичноследовательно, взаимодействие с пользователем не является «случайным».
  • Вы можете легче освободить много нежелательной памяти, находясь в фоновом режиме.
  • Управлять состоянием вашего приложения из центрального места проще.
...