Jak uzyskać UIViewController superview UIView w iOS?

Mam UIViewController, w którym mam UITextView dodany z interface builder. Teraz chcę wypchnąć Widok po kliknięciu hiperłącza lub numeru telefonu. Jestem w stanie wykryć, który adres URL został kliknięty za pomocą metody znalezionej w stackoverflow. Oto Metoda

@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

Teraz chcę uzyskać viewController z Superview textview tak, że mogę wypchnąć inny viewController po kliknięciu na URL/numer telefonu.

Author: Cœur, 2010-02-22

3 answers

Nie możesz uzyskać do niego bezpośredniego dostępu, ale możesz znaleźć następny kontroler widoku (jeśli istnieje), przechodząc przez łańcuch odpowiedzi.

Tak to robi 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;
}
 76
Author: Felixyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-21 12:33:34

Należy pamiętać, że -webView:decidePolicyForNavigationAction:... jest nieudokumentowaną metodą(w przypadku iPhoneOS. Jest udokumentowane dla Mac OS X) i aplikacja prawdopodobnie zostanie odrzucona, jeśli jest to dla AppStore.


Kontroler widoku nie jest skojarzony z widokiem. Obowiązuje tylko odwrotność. Aby uzyskać dostęp do kontrolera widoku, zmień go na globalnie dostępną zmienną lub właściwość.

Jeśli interface builder jest używany zazwyczaj można zdefiniować wyjście do delegata aplikacji, który łączy się z kontrolerem widoku nawigacyjnego. Wtedy ty można użyć

MyAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.the_navigation_view_controller pushViewController:...];
 1
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 08:35:53

Możesz pobrać UIviewController z UIView

UIViewController *viewC = (UIViewController *)view->_viewDelegate;
 -1
Author: Prabhjot Singh Gogana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 08:52:56