UIWebView и определить словарь - PullRequest
13 голосов
/ 06 января 2012

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

ОБНОВЛЕНИЕ: Я также получаю следующую ошибку при закрытии словаря на iPhone: Несбалансированные вызовы для начала / конца переходов появления для UIFallbackPresentationViewController

ОБНОВЛЕНИЕ: Когда я представляю UIAlertView и отменяю его, словарь снова работает.Интересно, почему?

Ответы [ 4 ]

11 голосов
/ 24 октября 2012

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

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

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

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

  • Отладкаконсоль сообщает вам что-то вроде этого:

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

Я подал ошибку на: https://bugreport.apple.com

Пример кода: https://github.com/tiemevanveen/DefineBugDemoProject

2 голосов
/ 22 октября 2012

Не видя вашего кода, будет очень сложно дать ответ на этот вопрос. Было бы намного проще, если бы вы показали свою логику.

Как говорится, вот несколько советов, которые могут помочь:

  1. Убедитесь, что вы вызываете все соответствующие супер-методы в вашем классе. Например, если вы переопределяете viewDidAppear:animated или viewDidLoad, убедитесь, что вы вызываете супер методы.
  2. Оформить заказ в этой теме ... может быть, вы делаете какую-то анимацию в неподходящем месте?
0 голосов
/ 21 декабря 2012

Все кредиты для этого решения идут на @ acue .Пожалуйста, посмотрите здесь .

Теперь вот как я это решил.Напечатано [UIApplication sharedApplication] .keyWindow после того, как словарь был представлен, чтобы выяснить, какому подпредставлению был придан фокус.когда уведомление было опубликовано, вызывается следующий метод: -

- (void) makeKeyWindow {
  AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  [appDelegate.window makeKeyAndVisible];
}

Несмотря на то, что я все еще вижу ошибку, UIMenu и словарь продолжают работать, как и ожидалось.

0 голосов
/ 20 ноября 2012

Я могу воспроизвести ошибку (отображается в консоли), но для меня каждый раз работает поповер. Так что я не стал бы беспокоиться об этом, поскольку, похоже, он не вызывает сбоев.

Единственное «обходное решение» - отключить / заменить пункт меню «Определить». Но единственный способ сделать это - написать категорию для частного класса (что запрещено):

@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, поэтому я не уверен, что это изменит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...