UIWebView и определить словарь
У меня была опция copy и define, встроенная в UIWebView. Он отлично работал на iPad, но на iPhone, он работает только один раз, когда я выделяю текст и использую словарь, а во второй раз, когда я его пробовал, он не отображает popover. Любая идея?
UPDATE:
Я также получаю следующую ошибку при отмене словаря на iPhone:
Небалансные вызовы для перехода на начало/конец для UIFallbackPresentationViewController
UPDATE:
Когда я представляю UIAlertView и отменяю его, словарь снова работает. Интересно, почему?
Ответы
Ответ 1
На данный момент есть 52 других вопроса о том, что stackoverflow упоминает об этой ошибке.
Из нескольких прочитанных я думаю, что используемое яблоко кода вызывает presentModalViewController:
, прежде чем фактический словарь будет полностью загружен.
Я думаю, что это просто ошибка, которую яблоко должно решить, образец Рудольфа Адамковича дал понять:
Я подал ошибку: https://bugreport.apple.com
Пример кода: https://github.com/tiemevanveen/DefineBugDemoProject
Ответ 2
Без просмотра вашего кода будет очень сложно дать ответ на этот вопрос. Было бы намного проще, если бы вы показали свою логику.
Это, как говорится, вот несколько советов, которые могут помочь:
- Убедитесь, что вы вызываете все подходящие супер методы в своем классе. Например, если вы переопределите
viewDidAppear:animated
или viewDidLoad
, убедитесь, что вы вызываете супер методы.
- Оформить заказ этот поток... возможно, вы делаете какую-то анимацию в неприемлемом месте?
Ответ 3
Я могу воспроизвести ошибку (появляется в консоли), но для меня popover работает каждый раз. Поэтому я не стал бы беспокоиться об этом, так как он не вызывает каких-либо сбоев.
Единственная "работа вокруг" - отключить/заменить пункт меню "Определить". Но единственный способ сделать это - написать категорию для частного класса (что запрещено):
@interface UIWebBrowserView : UIView
@end
@interface UIWebBrowserView (Add)
@end
@implementation UIWebBrowserView (Add)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action == @selector(_define:))
return NO;
return [super canPerformAction:action withSender:sender];
}
@end
Есть более "умные" способы сделать это без написания категории (метод swizzling), но они более опасны.
Если он работает, я просто оставлю это в покое. У меня включен ARC, поэтому я не уверен, что это имеет значение.
Ответ 4
Все кредиты для этого решения идут на @acue. См. здесь.
Теперь, вот как я это решил.
Отпечатано [UIApplication sharedApplication].keyWindow после того, как словарь был представлен, чтобы узнать, какой под просмотр был задан.
В этом подвью, зарегистрированном для UIWindowDidBecomeKeyNotification
А. когда уведомление отправлено, называется следующим способом: -
- (void) makeKeyWindow {
AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.window makeKeyAndVisible];
}
Несмотря на то, что я все еще вижу ошибку, UIMenu и словарь продолжают работать, как ожидалось.