Как получить UIViewController из супервьюма UIView в iOS? - PullRequest
24 голосов
/ 22 февраля 2010

У меня есть 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, чтобы при нажатии на URL / номер телефона можно было нажать другой viewController.

Ответы [ 3 ]

76 голосов
/ 22 февраля 2010

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

Вот как платформа Three20 делает это:

- (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;
}
1 голос
/ 22 февраля 2010

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


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

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

MyAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.the_navigation_view_controller pushViewController:...];
0 голосов
/ 02 сентября 2014

Вы можете получить UIviewController из UIView

UIViewController *viewC = (UIViewController *)view->_viewDelegate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...