web-dev-qa-db-ja.com

iOSでUIViewのスーパービューのUIViewControllerを取得する方法

UIViewControllerがあり、インターフェイスビルダーからUITextViewが追加されています。次に、ハイパーリンクまたは電話番号をクリックしたときにビューをプッシュします。私は、stackoverflowで見つけた方法を使用して、クリックされたURLを検出できます。ここに方法があります

@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を取得して、URL /電話番号をクリックしたときに別のviewControllerをプッシュできるようにします。

24
Rahul Vyas

直接アクセスすることはできませんが、レスポンダーチェーンをたどることで次のビューコントローラー(ある場合)を見つけることができます。

これが 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;
}
76
Felixyz

その点に注意してください -webView:decidePolicyForNavigationAction:...は文書化されていない方法(とにかくiPhoneOSの場合。MacOS Xの場合は文書化されています)であり、AppStoreの場合、アプリは拒否される可能性があります。


ビューコントローラーはビューに関連付けられていません。逆のみが適用されます。ビューコントローラーにアクセスするには、ビューコントローラーをグローバルにアクセスできる変数またはプロパティにします。

インターフェースビルダーが通常使用される場合、ナビゲーションビューコントローラーに接続するアプリケーションデリゲートへのアウトレットを定義できます。その後、使用できます

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