2010-02-22 9 views
24

Tengo un UIViewController en el que tengo una UITextView agregada desde el constructor de interfaz. Ahora quiero presionar una vista cuando hago clic en un hipervínculo o número de teléfono. Puedo detectar en qué URL se hace clic usando un método que encontré en stackoverflow. Este es el método¿Cómo obtener UIViewController de una supervista de UIView en iPhone SDK?

@interface UITextView (Override) 
@end 

@class WebView, WebFrame; 
@protocol WebPolicyDecisionListener; 

@implementation UITextView (Override) 

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener 
{ 
    NSLog(@"request: %@", request); 
} 
@end 

ahora quiero conseguir el viewController de supervista del TextView para que pueda empujar otra viewController cuando hago clic en Número URL/teléfono.

Respuesta

73

No se puede acceder a él directamente, pero se puede encontrar el siguiente controlador de vista (si lo hay) por la que atraviesa la cadena de respuesta.

Así es como lo hace the Three20 framework:

- (UIViewController*)viewController 
{ 
    for (UIView* next = [self superview]; next; next = next.superview) 
    { 
     UIResponder* nextResponder = [next nextResponder]; 

     if ([nextResponder isKindOfClass:[UIViewController class]]) 
     { 
      return (UIViewController*)nextResponder; 
     } 
    } 

    return nil; 
} 
+0

wow gracias. usando tres20 y no lo sabía. siempre he creado un delegado. para cualquiera que esté interesado en usar esto en tres20. simplemente importe '#import" Three20UICommon/UIView + TTUICommon.h "' – choise

+0

¡Gracias! ¡funciona perfecto! –

+0

me salvaste el día. Funciona como un amuleto –

1

Tenga en cuenta que -webView:decidePolicyForNavigationAction:... es un método no documentado (para iPhoneOS de todos modos. Está documentado para Mac OS X) y la aplicación probablemente será rechazada si eso es para AppStore.


Un controlador de visualización no está asociado a una vista. Solo aplica el reverso. Para acceder a un controlador de vista, conviértalo en una variable o propiedad accesible a nivel mundial.

Si se utiliza el constructor de interfaz, normalmente se podría definir una salida para el delegado de la aplicación que se conecta al controlador de vista de navegación. A continuación, puede utilizar

MyAppDelegate* del = [UIApplication sharedApplication].delegate; 
[del.the_navigation_view_controller pushViewController:...]; 
0

Puede obtener el UIViewController de UIView

UIViewController *viewC = (UIViewController *)view->_viewDelegate; 
+0

_viewDelegate es una propiedad privada, no se puede usar si envía la aplicación a AppStore. – Sirio

Cuestiones relacionadas