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

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

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

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

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

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

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

person barfoon    schedule 17.11.2011    source источник
comment
Вы реализовали UITextViewDelegate? Во многих случаях об этом делегате забывали.   -  person Raptor    schedule 17.11.2011
comment
@ShivanRaptor Смотрите мои обновления - я реализовал один метод.   -  person barfoon    schedule 17.11.2011


Ответы (1)


Вы не можете сделать это с помощью 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;
    }];
}

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

person rob mayoff    schedule 17.11.2011
comment
Второй контроллер представления не требует использования клавиатуры. Я хочу, чтобы клавиатура из первого представления оставалась всплывающей, даже когда другой контроллер представления присутствует модально поверх нее. - person barfoon; 17.11.2011
comment
Я не понимаю, о чем вы просите, что мой ответ не дает (хотя я не упомянул, что вам нужен второй контроллер представления, чтобы определить метод canBecomeFirstResponder, чтобы вернуть YES). В моем тестовом примере клавиатура остается открытой, когда я модально представляю контроллер представления. - person rob mayoff; 17.11.2011
comment
Пожалуйста, прочтите мой комментарий еще раз - второй контроллер не требует использования клавиатуры (это таблица из примерно 10 элементов). Табличное представление занимает весь экран и закрывается при выборе строки. После того, как этот контроллер исчезнет, ​​он должен упасть, чтобы открыть клавиатуру в первом представлении, которое никогда не было закрыто. - person barfoon; 17.11.2011
comment
Как только я добавляю UIWindow в свой XIB и реализую этот метод - отображается второе окно, даже на первом экране - person barfoon; 17.11.2011
comment
Установите self.otherWindow.hidden=YES в viewDidLoad. - person rob mayoff; 17.11.2011
comment
Ах да - я установил его как Скрытый в IB, но это тоже подойдет. Это делает то, что я хочу - спасибо за вашу помощь. - person barfoon; 17.11.2011
comment
Это все еще самое современное решение для iOS 7? Похоже, что что-то в SDK, будь то контроллеры дочерних представлений или что-то еще, должно позволять делать это без искажения с UIWindow уровнями. - person cbowns; 02.11.2013