2010-02-22 12 views
24

Tôi có một UIViewController, trong đó tôi có một UITextView được thêm vào từ trình xây dựng giao diện. Bây giờ tôi muốn đẩy chế độ xem khi tôi nhấp vào siêu liên kết hoặc số điện thoại. Tôi có thể phát hiện url nào được nhấp bằng cách sử dụng phương thức tôi tìm thấy trong stackoverflow. Đây là phương phápLàm thế nào để có được UIViewController của SuperView UIView trong 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 

Bây giờ tôi muốn có được viewController của giám sát của khung nhìn để tôi có thể đẩy một viewController khác khi tôi nhấp vào URL/Số điện thoại.

Trả lời

73

Bạn không thể truy cập trực tiếp, nhưng bạn có thể tìm bộ điều khiển chế độ xem tiếp theo (nếu có) bằng cách đi qua chuỗi phản hồi.

Đây là cách the Three20 framework làm nó:

- (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

wow cảm ơn. sử dụng ba20 và không biết điều đó. tôi luôn tạo một đại biểu. cho bất kỳ ai quan tâm đến việc sử dụng điều này trong năm ba mươi. chỉ cần nhập '#import" Three20UICommon/UIView + TTUICommon.h "' – choise

+0

Cảm ơn! nó hoạt động hoàn hảo! –

+0

bạn lưu ngày của tôi. Nó hoạt động giống như một nét duyên dáng –

1

Xin lưu ý rằng -webView:decidePolicyForNavigationAction:... là một phương pháp không có giấy tờ (đối với iPhoneOS. Tài liệu dành cho Mac OS X) và ứng dụng có thể bị từ chối nếu đó là cho AppStore.


Trình điều khiển chế độ xem không được liên kết với chế độ xem. Chỉ áp dụng ngược lại. Để truy cập trình điều khiển chế độ xem, hãy biến nó thành biến hoặc thuộc tính có thể truy cập toàn cục.

Nếu trình tạo giao diện được sử dụng thường thì người ta có thể xác định lối thoát cho đại biểu ứng dụng kết nối với bộ điều khiển chế độ xem điều hướng. Sau đó, bạn có thể sử dụng

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

Bạn có thể lấy UIViewController từ UIView

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

_viewDelegate là thuộc tính riêng tư, không thể sử dụng được nếu bạn gửi ứng dụng tới AppStore. – Sirio