Проблема modalViewController с первым ответчиком UITextField

У меня есть UIViewController с именем LoginViewController. UIViewController имеет два UITextField, имя пользователя и пароль. Это отображается как modalViewController при первом запуске приложения и отсутствии учетных данных в цепочке ключей. Когда пользователь нажимает кнопку входа в систему, отображаемая клавиатура закрывается. Код:

- (IBAction) loginClick: (UIButton *) sender
{
    if ([username isFirstResponder]){
        [username resignFirstResponder];
    }

    if ([password isFirstResponder]){
        [password resignFirstResponder];
    }

    [RKObjectManager sharedManager].client.username = username.text;
    [RKObjectManager sharedManager].client.password = password.text;
    [progressLock lock]; 
    [progressLock unlockWithCondition:0];
    [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/account/verify.json" objectClass:[Login class] delegate: self];
}

Теперь внутри приложения есть кнопка настроек. Когда это щелкнет, он представит modalViewController, в котором есть кнопка выхода из системы. Нажатие на эту кнопку выхода снова представит LoginViewController. Код:

- (IBAction) logout:(id)sender
{
    NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
    NSString * username = [standardDefaults stringForKey:@"kApplicationUserNameKey"]; 
    NSError * error = nil;

    [standardDefaults removeObjectForKey:@"kApplicationUserNameKey"];
    [SFHFKeychainUtils deleteItemForUsername:username andServiceName:@"convore" error:&error];
    LoginViewController* lvc = [[LoginViewController alloc] init];
    lvc.delegate = self;
    [self.mgvc.groups removeAllObjects];
    [self.mgvc.table reloadData];

    Topic * topic = [Topic object];
    topic.tid = [NSNumber numberWithInt:-2];
    self.mgvc.detailViewController.topic = topic;
    self.mgvc.detailViewController.detailItem = topic.tid;

    [self presentModalViewController:lvc animated:YES];
    [lvc release];  
}

Странно то, что на этот раз я не могу отключить клавиатуру, когда нажимаю кнопку входа в систему. Почему это? Это потому, что на данный момент я показываю LoginViewController из modalviewcontroller? Как решить эту странную проблему?


person adit    schedule 08.06.2011    source источник


Ответы (1)


Я не знаю, связан ли тот факт, что вы не можете отключить клавиатуру, из-за представления входа в систему в модальном представлении, и я не вижу ничего явно неправильного в вашем коде.

Я бы предложил вам изменить свой поток и сделать:

  1. кнопка выхода закроет ваш первый модальный вид и,

  2. ваш вход в систему будет отображаться как обычный вид, как только модальный вид исчезнет.

Явно, вы можете сделать 2 одним из нескольких способов:

  1. попытка и нажатие контроллера входа в систему на вашем навигационном контроллере (если он у вас есть);

  2. выбор его в контроллере панели вкладок (если вы его используете);

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

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

    2. РЕДАКТИРОВАТЬ: попробуйте что-то вроде этого (для этого требуется, чтобы вы вызывали свой собственный селектор, а не viewWillAppear):

      [baseNonModalViewController performSelector:@selector(yourSelector) withObject:nil afterDelay:0.0];

Выполнение performSelector с задержкой 0,0 влияет только на планирование yourSelector для выполнения в основном цикле. Таким образом, сначала модальное окно будет полностью закрыто, а затем будет отображаться окно входа в систему.

person sergio    schedule 08.06.2011
comment
это хорошая идея, так что вы имеете в виду выполнение [self rejectModalViewControllerAnimated:YES]; [самостоятельный PresentModalViewController: анимированный lvc: ДА]; ?? Пробовал, не помогло.. может не так должно быть - person adit; 08.06.2011
comment
Вы должны попытаться сделать это из-за пределов модального представления, чтобы изменить ситуацию. Смотрите мое редактирование, в частности вариант 3, который я добавил. - person sergio; 08.06.2011
comment
как я могу сделать это извне? делегат вы имеете в виду? - person adit; 08.06.2011
comment
вариант 3: ваш модальный вид отображается над видом; когда модальное окно закрывается, появляется это представление, и поэтому вызывается селектор viewWillAppear контроллера представления; это место, где вы можете проверить, вошли вы или нет, и показать логин, если это необходимо. - person sergio; 08.06.2011
comment
Я думаю, что могу выбрать только вариант 3... поэтому мне нужно поделиться статусом выхода из системы от делегата? - person adit; 08.06.2011
comment
да, делегат - очень чистое решение. или вы можете установить флаг в контроллере представления, когда выход из системы будет выполнен. (менее чистый) - person sergio; 08.06.2011
comment
одна проблема заключается в том, что viewWillAppear не запускается при отклонении modalView, поскольку тип modalView не является полноэкранным, вместо этого это лист формы.. (это приложение для iPad) - person adit; 08.06.2011
comment
вы можете запустить его самостоятельно, это не должно быть проблемой... в любом случае, смотрите мое предложение 4 (напишите его сейчас) - person sergio; 08.06.2011
comment
Я попытался сделать LoginViewController* lvc = [[LoginViewController alloc] init]; lvc.delegate = сам; [самостоятельный PresentModalViewController: анимированный lvc: ДА]; [выпуск lvc]; из представления за modalViewController и по какой-то странной причине он не показывает никакого modalViewController. Я пробовал другое представление, а не только LoginViewController, и оно не появилось. - person adit; 08.06.2011