UIWebView с contentEditable (редактирование html), обработка первого респондента? - PullRequest
11 голосов
/ 12 декабря 2011

Я делаю компонент редактора html для приложения (используя UIWebView с contentEditable в iOS 5.0) и застрял в том, как обрабатывать статус первого респондента UIWebView

[webView isFirstResponder], [webView становитьсяFirstResponder]и [webView resignFirstResponder], похоже, не работает, и я не знаю, как заставить webView стать или отказаться от него с помощью кода

Если кто-нибудь знает, как это решить, я был бы очень признателен, спасибозаранее!

Ответы [ 5 ]

13 голосов
/ 01 февраля 2013

Вот как я перезаписываю эти методы в подклассе UIWebView (content - это идентификатор редактируемого элемента):

-(BOOL)resignFirstResponder {
    [self setUserInteractionEnabled:NO];[self setUserInteractionEnabled:YES];
    return [super resignFirstResponder];
}

// only works on iOS 6+
-(void)becomeFirstResponder {
    self.keyboardDisplayRequiresUserAction = NO; // set here or during initialization  
    // important note: in some situations (newer iOS versions), it is also required to first call `blur()` on the 'content' element, otherwise the keyboard won't show up as expected
    [self stringByEvaluatingJavaScriptFromString:@"document.getElementById('content').focus()"];
}

-(BOOL)isFirstResponder{
    if ([[self stringByEvaluatingJavaScriptFromString:@"document.activeElement.id=='content'"] isEqualToString:@"true"]) {
        return YES;
    }
    else {
        return NO;
    }
}

isFirstResponder вернет true только после отображения клавиатуры (например, вернет false в UIKeyboardWillShowNotification)

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

+(BOOL)isFirstResponder:(UIView *)v{
    for (UIView *vs in v.subviews) {
        if ([vs isFirstResponder] || [self isFirstResponder:vs]) {
            return YES;
        }
    }
    return NO;
}
-(BOOL)isFirstResponder{
    return [[self class] isFirstResponder:self];
}

Таким образом, возвращаемое значение будет YES даже до / после завершения анимации клавиатуры (показ или скрытие).

2 голосов
/ 14 декабря 2011

Недавно я столкнулся с той же проблемой, но решил ее, используя чистый JavaScript.На самом деле это не требует никаких методов, связанных с Objective-C First Responder.Я просто использовал JavaScript, чтобы изменить содержимое UIWebView - значение атрибута contentEditable элемента HTML в соответствии с требованием.

Например, используя следующий код, чтобы скрыть клавиатуру, которая вызывается редактируемым содержимым UIWebView:

[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('target').setAttribute('contentEditable','false')"];

Надеюсь, это полезно.:)

0 голосов
/ 29 января 2014

Вот как я перезаписываю эти методы в подклассе UIWebView (содержимое - это идентификатор редактируемого элемента):

[_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('content').focus()"];

Но Фокус переходит к 1-й точке, а не к последней точке

0 голосов
/ 18 июня 2012

[webView loadHTMLString: [NSString stringWithFormat: @ "% @", htmlString] baseURL: nil]; Это работает в iOS> 4

0 голосов
/ 13 июня 2012

Назовите следующие строки кода, если вы хотите скрыть клавиатуру.

//wView is your UIWebView

NSString *webText = [wView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
 [wView loadHTMLString:webText baseURL:nil];
...