Как получить UIViewController из супер-просмотра UIView в iOS?
У меня есть UIViewController, в котором я добавил UITextView из конструктора интерфейса. Теперь я хочу нажать на вид, когда я нажимаю на гиперссылку или номер телефона. Я могу определить, по какой ссылке кликнули, используя метод, который я нашел в stackoverflow. Вот метод
@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/номер телефона.
Ответы
Ответ 1
Вы не можете получить к нему доступ напрямую, но вы можете найти следующий контроллер (если он есть), пройдя цепочку ответчиков.
Вот как структура 320:
- (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;
}
Ответ 2
Обратите внимание, что -webView:decidePolicyForNavigationAction:...
- это недокументированный метод (для iPhoneOS в любом случае. Он документирован для Mac OS X), и приложение, скорее всего, будет отклонено, если это для AppStore.
Контроллер вида не связан с представлением. Применяется только обратное. Чтобы получить доступ к контроллеру представления, сделайте его глобально доступной переменной или свойством.
Если используется построитель интерфейсов, обычно можно определить выход для делегата приложения, который подключается к контроллеру навигационного представления. Затем вы можете использовать
MyAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.the_navigation_view_controller pushViewController:...];
Ответ 3
Вы можете получить UIviewController из UIView
UIViewController *viewC = (UIViewController *)view->_viewDelegate;