Как сохранить присутствующую клавиатуру даже при представлении контроллера модального вида? - PullRequest
1 голос
/ 17 ноября 2011

У меня есть контроллер модального представления, и UITextView становится первым респондентом, и отображается клавиатура.

Как только этот экран загружен, пользователь может классифицировать свой ввод перед его отправкой.Это происходит посредством другого модального контроллера представления, который представлен сверху.

Когда этот второй представлен, клавиатура отклоняется, пользователь выбирает и затем появляется снова, когда начальный UITextView снова становится первым респондентом.

Как я могу представить второй контроллер модального вида, не отрывая клавиатуры?

РЕДАКТИРОВАТЬ: Я реализовал часть UITextViewDelegate, и я до сих пор не получаю желаемого результата.

- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
    return NO;
}

1 Ответ

6 голосов
/ 17 ноября 2011

Вы не можете сделать это, используя presentModalViewController:animated:.Вы должны будете поместить свое модальное представление в отдельное окно UIWindow, установить для второго уровня окна UIWindow windowLevel что-то высокое (например, UIWindowLevelStatusBar) и анимировать его на экране и за его пределами.Вам вообще не понадобится второй контроллер представления.

В вашей XIB создайте новый объект UIWindow верхнего уровня.Поместите свой второй вид в это окно.Подключите окно к розетке на вашем контроллере вида.(Я назвал розетку otherWindow в моем тестовом коде, но overlayWindow было бы лучшим именем. Розетка должна быть объявлена ​​strong или retain.)

В вашем контроллере представления реализуйте этиметоды:

- (IBAction)presentOverlay:(id)sender
{
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    frame.origin.y += frame.size.height;
    self.otherWindow.frame = frame;
    self.otherWindow.windowLevel = UIWindowLevelStatusBar;
    self.otherWindow.hidden = NO;
    [UIView animateWithDuration:.25 animations:^{
        self.otherWindow.frame = [UIScreen mainScreen].applicationFrame;
    }];
}

- (IBAction)dismissOverlay:(id)sender
{
    [UIView animateWithDuration:.25 animations:^{
        CGRect frame = [UIScreen mainScreen].applicationFrame;
        frame.origin.y += frame.size.height;
        self.otherWindow.frame = frame;
    } completion:^(BOOL completed){
        self.otherWindow.hidden = YES;
    }];
}

Используйте их для представления и закрытия наложения.

...