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

Имам контролер за модален изглед, който е представен и 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, да зададете windowLevel на втория UIWindow на нещо високо (като 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