2010-02-22 3 views
24

У меня есть UIViewController, в котором у меня есть UITextView, добавленный из конструктора интерфейсов. Теперь я хочу нажать представление, когда я нажимаю на гиперссылку или номер телефона. Я могу обнаружить, что URL-адрес нажата, используя метод, который я нашел в stackoverflow. Вот методКак получить UIViewController супервизора UIView в 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 

Теперь я хочу, чтобы получить ViewController из надтаблицы в TextView, так что я могу нажать другую ViewController, когда я нажимаю на URL/номер телефона.

ответ

73

Вы не можете получить доступ к нему напрямую, но вы можете найти следующий контроллер представления (если таковые имеются) путем обхода ответчика цепи.

Это как 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

вау спасибо. используя три20 и не знал этого. Я всегда создавал делегата. для тех, кто заинтересован в использовании этого в трех20. просто импортируйте '#import". 320UICommon/UIView + TTUICommon.h "' – choise

+0

Спасибо! он отлично работает! –

+0

вы экономите мой день. Он работает как шарм –

1

Обратите внимание, что -webView:decidePolicyForNavigationAction:... - это недокументированный метод (для iPhoneOS в любом случае он документирован для Mac OS X), и приложение, скорее всего, будет отклонено, если это для AppStore.


Контроллер вида не связан с представлением. Применяется только обратное. Чтобы получить доступ к контроллеру представления, сделайте его глобально доступной переменной или свойством.

Если конструктор интерфейса используется обычно, можно определить выход для делегата приложения, который подключается к контроллеру навигационного представления. Затем вы можете использовать

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

Вы можете получить UIViewController с UIView

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

_viewDelegate - это частная собственность, которую нельзя использовать, если вы отправляете приложение в AppStore. – Sirio

Смежные вопросы