web-dev-qa-db-fra.com

Comment obtenir UIViewController d'un Superview d'UIVIEW dans iOS?

J'ai un UIViewController dans lequel j'ai une vue UitextTVoir ajoutée à partir de l'interface Builder. Maintenant, je veux appuyer sur une vue lorsque je clique sur le lien hypertexte ou le numéro de téléphone. Je suis capable de détecter que l'URL est cliquée à l'aide d'une méthode que j'ai trouvée dans Stackoverflow. Voici la méthode

@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

Maintenant, je souhaite obtenir la vue ContentryController de TextView's SuperView pour que je puisse appuyer sur une autre vue de la vue lorsque je clique sur URL/numéro de téléphone.

24
Rahul Vyas

Vous ne pouvez pas y accéder directement, mais vous pouvez trouver le contrôleur de visualisation suivant (le cas échéant) en parcourant la chaîne du répondeur.

C'est comment le framework Three2 Le fait:

- (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;
}
76
Felixyz

Veuillez noter que -webView:decidePolicyForNavigationAction:... est une méthode sans papiers (pour iPhoneo de toute façon. Il est documenté pour Mac OS X) et l'application sera probablement rejetée si c'est pour Appstore.


Un contrôleur d'affichage n'est pas associé à une vue. Seul inversement s'applique. Pour accéder à un contrôleur d'affichage, faites-en une variable ou une propriété accessible à l'échelle mondiale.

Si l'interface Builder est généralement utilisé, on pourrait définir une prise sur le délégué d'application qui se connecte au contrôleur de la vue de navigation. Ensuite, vous pouvez utiliser

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