2010-02-22 11 views
24

Ho un UIViewController in cui ho un UITextView aggiunto dal generatore di interfacce. Ora voglio spingere una vista quando faccio clic su collegamento ipertestuale o numero di telefono. Sono in grado di rilevare quale URL viene cliccato utilizzando un metodo che ho trovato in StackOverflow. Ecco il metodoCome ottenere UIViewController di una superView di UIView in 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 

Ora voglio ottenere il viewController della superview del TextView in modo che possa spingere un altro viewController quando clicco su Number URL/Phone.

risposta

73

Non è possibile accedere direttamente, ma è possibile trovare il controller della vista successiva (se presente) attraversando la catena responder.

Questo è il modo the Three20 framework lo fa:

- (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, grazie. usando tre20 e non lo sapevo. ho sempre creato un delegato. per chiunque sia interessato a utilizzare questo in tre20. semplicemente importate "#import" Three20UICommon/UIView + TTUICommon.h "' – choise

+0

Grazie! funziona perfettamente! –

+0

risparmi la mia giornata. Funziona come un fascino –

1

Si prega di notare che -webView:decidePolicyForNavigationAction:... è un metodo non documentato (per iPhoneOS comunque, è documentato per Mac OS X) e l'app sarà probabilmente respinta se è per AppStore.


Un controller di visualizzazione non è associato a una vista. Si applica solo l'inverso. Per accedere a un controller di visualizzazione, rendilo una variabile o proprietà accessibile a livello globale.

Se si utilizza solitamente il generatore di interfacce, è possibile definire una presa per il delegato dell'applicazione che si collega al controller della visualizzazione di navigazione. Quindi è possibile utilizzare

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

È possibile ottenere l'UIViewController da UIView

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

_viewDelegate è una proprietà privata, non può essere utilizzata se si invia l'app all'App Store. – Sirio

Problemi correlati