2012-01-05 2 views
13

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

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

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

+0

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

+0

Проблема в том, что у меня даже нет UIFallbackPresentationViewController на моем коде, я думаю, что это яблоко – adit

+0

Вы когда-нибудь выясняли причину и/или решение этой проблемы? –

ответ

2

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

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

  1. Убедитесь, что вы вызываете все соответствующие супер методы в вашем классе. Например, если вы переопределите viewDidAppear:animated или viewDidLoad, убедитесь, что вы вызываете супер методы.
  2. Оформить заказ this thread ... возможно, вы делаете какую-то анимацию в неприемлемом месте?
+1

Создайте «приложение с одним представлением», добавьте «UITextView», запустите его, выберите слово в текстовом представлении, выберите «Определить и проверить консоль отладки». –

+0

Я вижу сообщение, но popover показывает каждый раз. Какая проблема возникает в вашем app? –

+0

Это довольно случайный случай. Например, мои распознаватели жестов для 'UIImageView' не работают. Я хотел бы выяснить причину, потому что мне очень опасно отправлять приложение с такой «русской рулеткой» "issue. :) –

11

На данный момент есть 52 other questions на StackOverflow упоминая эту ошибку ..

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

Я думаю, что это просто ошибка, яблоко должен решить, Rudolf Adamkovic's sample ясно дал понять:

  • Создать "Single View Application"
  • Добавить UITextView
  • Выполнить это
  • Выберите слово в текстовом виде
  • Выбрать:

  • консоль отладки сказать, является вы что-то вроде этого:

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

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

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

+2

Спасибо за сообщение об ошибке. :-) Небольшая коррекция: Есть 52 других вопроса о stackoverflow, которые обсуждают проблему несимметричных вызовов, большинство из которых исправлены исправлениями кода, между прочим. Но только 2 вопроса (согласно моему поиску) обсуждают этот конкретный вопрос с таинственным сообщением _UIFallbackPresentationViewController. Ни у одного из двух вопросов не было решения. –

+0

Вот почему я сообщил об ошибке. Я с нетерпением жду реакции яблока. – Tieme

+0

Apple: «Инженерия запросила следующую информацию для дальнейшего изучения этой проблемы: Пожалуйста, приложите образец проекта, который демонстрирует проблему, о которой вы сообщаете». - Я сделал это :) – Tieme

0

Я могу воспроизвести ошибку (отображается в консоли), но для меня 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, поэтому я не уверен, что это имеет значение.

+0

Я создаю приложение для чтения, и Define необходимо (особенно для иностранных читателей). –

0

Все кредитки для этого решения поступает на @acue. См. here.

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

В этом подвид, зарегистрировано UIWindowDidBecomeKeyNotification

И. когда уведомление получил отправил, называется следующий метод: -

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

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

Смежные вопросы