Подтвердить что ты не робот

UIWebView и определить словарь

У меня была опция copy и define, встроенная в UIWebView. Он отлично работал на iPad, но на iPhone, он работает только один раз, когда я выделяю текст и использую словарь, а во второй раз, когда я его пробовал, он не отображает popover. Любая идея?

UPDATE: Я также получаю следующую ошибку при отмене словаря на iPhone: Небалансные вызовы для перехода на начало/конец для UIFallbackPresentationViewController

UPDATE: Когда я представляю UIAlertView и отменяю его, словарь снова работает. Интересно, почему?

4b9b3361

Ответ 1

На данный момент есть 52 других вопроса о том, что stackoverflow упоминает об этой ошибке.

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

Я думаю, что это просто ошибка, которую яблоко должно решить, образец Рудольфа Адамковича дал понять:

  • Создать "Приложение с одним представлением"
  • Добавить UITextView
  • Запустить его
  • Выберите слово в текстовом представлении
  • Выберите "Определить"

  • Отладочная консоль сообщит вам следующее:

    Unbalanced calls to begin/end appearance transitions for 
    <_UIFallbackPresentationViewController: 0x74c1660>
    

Я подал ошибку: 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 и словарь продолжают работать, как ожидалось.