2012-01-05 10 views
13

Tenía la opción copiar y definir incorporada con UIWebView. Funcionó muy bien en el iPad pero en el iPhone, solo funciona una vez cuando destaco el texto y uso el diccionario y la segunda vez que lo intenté, no aparece el popover. ¿Alguna idea?UIWebView y define el diccionario

ACTUALIZACIÓN: estoy recibiendo el siguiente error así al despedir el diccionario en el iPhone: llamadas desequilibradas Introducción/transiciones de apariencia final para UIFallbackPresentationViewController

ACTUALIZACIÓN: Cuando presentan un UIAlertView y cancelarlo, el diccionario funciona nuevamente. ¿Preguntarse por qué?

+0

Creo que el mensaje de advertencia indica que UIFallbackPresentationViewController no está siendo instanciado por completo antes de ser descartado por algún otro controlador de vista. –

+0

El problema es que ni siquiera tengo UIFallbackPresentationViewController en mi código, creo que esto es – adit

+0

de Apple ¿Alguna vez descubrió la causa y/o una solución a este problema? –

Respuesta

2

Sin ver su código, va a ser muy difícil dar una respuesta a esta pregunta. Sería mucho más fácil si mostraras tu lógica.

Dicho esto, aquí hay un par de consejos que pueden ayudar:

  1. Asegúrese de que está llamando a todos los métodos súper apropiados en su clase. Por ejemplo, si sobrescribe viewDidAppear:animated o viewDidLoad, asegúrese de llamar a los métodos súper.
  2. Pedido this thread ... ¿tal vez estás haciendo algún tipo de animación en un lugar inapropiado?
+1

Cree "Aplicación de vista única", agregue 'UITextView', ejecútelo, seleccione una palabra en la vista de texto, elija Definir y marque la consola de depuración –

+0

Veo el mensaje pero el popover se muestra todo el tiempo. ¿Qué problema está causando en su aplicación? –

+0

Es bastante aleatorio. Por ejemplo, mis reconocedores de gestos para 'UIImageView's no funcionan. Me gustaría descubrir la causa raíz, porque me parece muy peligroso enviar una aplicación con una de esas" ruletas rusas ". "problema. :) –

11

Por el momento no son 52 other questions en StackOverflow mencionar este error ..

De la lectura de unos cuantos, creo que el código de la manzana está utilizando está llamando presentModalViewController: antes de que el punto de vista real diccionario es completamente cargado.

Creo que esto es sólo un error que Apple tiene que resolver, Rudolf Adamkovic's sample dejó claro:

  • Crear "una sola vista de la aplicación"
  • Añadir UITextView
  • Run que
  • seleccionar una palabra en la vista de texto
  • Elegir Definir

  • Consola de depuración de te contamos algo como esto:

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

que presentó el error en: https://bugreport.apple.com

Código de ejemplo: https://github.com/tiemevanveen/DefineBugDemoProject

+2

Gracias del informe de error. :-) Corrección leve: hay otras 52 preguntas en stackoverflow que discuten el problema de llamadas no balanceadas, la mayoría de ellas corregidas por correcciones al código, entre otras cosas. Pero, solo 2 preguntas (de acuerdo con mi búsqueda) sobre este tema en particular con el misterioso mensaje _UIFallbackPresentationViewController. Ninguna de las dos preguntas ha tenido una solución todavía. –

+0

Es por eso que informé sobre el error. Esperaré la reacción de Apple. – Tieme

+0

Apple: "Engineering ha solicitado la siguiente información para investigar más a fondo este problema: adjunte un proyecto de muestra que demuestre el problema que está informando". - Lo he hecho :) – Tieme

0

soy capaz de reproducir el error (se muestra en la consola), pero para mí el popover funciona todo el tiempo. Así que no me preocuparía, ya que no parece estar causando ningún bloqueo.

El único "problema" es desactivar/reemplazar la opción de menú "Definir".Pero la única manera de hacerlo es escribiendo una categoría para una clase privada (lo cual está prohibido):

@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 

Hay más maneras "inteligentes" de hacer esto sin tener que escribir una categoría (método swizzling), pero son mas peligrosos

Si funciona, simplemente lo dejaría en paz. Tengo ARC habilitado, así que no estoy seguro si eso hace la diferencia.

+0

Estoy construyendo una aplicación de lectura y definir es imprescindible (especialmente para lectores extranjeros). –

0

Todo el mérito de esta solución es @acue. Por favor, consulte here.

Ahora, así es como lo resolví. Se imprimió [UIApplication sharedApplication] .keyWindow después de que se había presentado el diccionario para averiguar qué subvista recibía el foco.

En ese subvista, registrada para UIWindowDidBecomeKeyNotification

Y. cuando la notificación consiguió publicado, llamado el método siguiente: -

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

Aunque, todavía ver el error, el UIMenu & el Diccionario tanto continúe trabajando como se esperaba.