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をプッシュできるようにします。
直接アクセスすることはできませんが、レスポンダーチェーンをたどることで次のビューコントローラー(ある場合)を見つけることができます。
これが 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;
}
その点に注意してください -webView:decidePolicyForNavigationAction:...
は文書化されていない方法(とにかくiPhoneOSの場合。MacOS Xの場合は文書化されています)であり、AppStoreの場合、アプリは拒否される可能性があります。
ビューコントローラーはビューに関連付けられていません。逆のみが適用されます。ビューコントローラーにアクセスするには、ビューコントローラーをグローバルにアクセスできる変数またはプロパティにします。
インターフェースビルダーが通常使用される場合、ナビゲーションビューコントローラーに接続するアプリケーションデリゲートへのアウトレットを定義できます。その後、使用できます
MyAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.the_navigation_view_controller pushViewController:...];