2013-04-06 14 views
5

Tôi có ứng dụng Tab Bar Controller sử dụng bảng phân cảnh. Mỗi tab có một UIWebview. Tôi muốn nắm bắt liên kết khi người dùng nhấp vào liên kết trên Webview nếu liên kết là một liên kết bên ngoài (nếu nó không phải là trang web của tôi) Tôi muốn mở liên kết trong một UIViewControl khác nhau. (giống như một ứng dụng trên iPhone của Twitter) làm điều đó)pushViewController không hoạt động với TabbarController

Ngay bây giờ; Tôi đã nhận mã này để nắm bắt các liên kết (nếu liên kết là bing.com sau đó nó sẽ mở nó một bộ điều khiển xem) nhưng tôi không thể mở một UIViewController (trong trường hợp này PopViewController). Nó mang lại cho tôi lỗi này:

Không @ interface có thể nhìn thấy cho 'GundemViewController' tuyên bố chọn 'pushViewController: hoạt hình:'

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 

//CAPTURE USER LINK-CLICK. 

NSURL *url = [request URL]; 

NSString *urlString = [url absoluteString]; 

/****** 
UIWebViewNavigationTypeLinkClicked: When user click on a link in the app it senses the action 
*/ 

if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
    if ([urlString hasPrefix:@"http://www.bing.com/"]) { 

     PopViewController *popUpView = [[PopViewController alloc] initWithNibName:@"PopupViewController" bundle:nil]; 

     [self pushViewController:popUpView animated:YES]; 
     return NO; 
    } 
} 


return YES; 
} 

Trả lời

10

Bạn có thể nhúng các bộ điều khiển chuyển hướng trong mỗi tab, do đó thay vì:

UITabBarController 
    Tab1 View Controller 
    Tab2 View Controller 
    Tab3 View Controller 

bạn có

UITabBarController 
    Tab1 Navigation Controller 
     Tab1 View Controller 
    Tab2 Navigation Controller 
     Tab2 View Controller 
    Tab3 Navigation Controller 
     Tab3 View Controller 

và vân vân. Bạn chỉ có thể gọi -pushViewController:animated: trên phiên bản của bộ điều khiển điều hướng.

Trong ủy nhiệm ứng dụng, bạn có thể khởi tạo từng bộ điều khiển chế độ xem của mình, đặt chúng trong một mảng và sau đó gán mảng đó cho bộ điều khiển thanh tab. Để thêm bộ điều khiển điều hướng, bạn có thêm một bước:

UIViewController *tab1Controller = [[MyViewController alloc] initWithNibNamed:@"MyViewController" bundle:nil]; 
UINavigationController *tab1Nav = [[UINavigationController alloc] initWithRootViewController:tab1Controller]; 

// etc 

Sau đó, đặt bộ điều khiển chế độ xem cho bộ điều khiển thanh tab của bạn thành bộ điều khiển điều hướng bạn đã tạo.

Trong bộ điều khiển chế độ xem của bạn, thay vì gọi -pushViewController:animated: trên self, bạn sẽ gọi số này theo số self.navigationController.

chỉnh sửa:

Nếu bạn không muốn có một bộ điều khiển chuyển hướng, bạn có thể sử dụng

[self presentViewController:popUpView 
        animated:YES 
       completion:nil]; 

để trình bày các pop-up. Trong cửa sổ bật lên, khi người dùng chạm vào nút đóng, hãy sử dụng

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

để loại bỏ nó.

+0

Về cơ bản, tôi chỉ cần kéo và thả một Tabbarcontroller vào stage (storyboard) hơn là tôi đang cố gắng tạo popup (tách biệt với tất cả các tab hiện tại và những thứ khác). nút đóng. Tôi cần phải loại bỏ –

+0

Xem các chỉnh sửa ở trên. –

+0

Seamus Tôi nhận thấy rằng bất kỳ ý tưởng nào cũng sẽ được đánh giá cao *** WebKit đã loại bỏ một ngoại lệ chưa được thực hiện trong webView: decisionPolicyForNavigationAction: request: frame: decisionListener: delegate: Không thể tải NIB trong gói: 'NSBundle (nạp) 'với tên' PopupViewController ' –

1

GundemViewController là gì? Xem xét lý do tại sao khoản tiền đó được trả lại từ self.navigationController thay vì UINavigationController. Một cách để làm điều đó là đặt điểm ngắt ngay trước khi bạn đẩy trình điều khiển chế độ xem và sau đó bước vào cuộc gọi self.navigationController.

+0

GundemViewController là một UIViewController. Bạn có thể vui lòng kiểm tra lại phần đó không. Tôi đã chỉnh sửa phần đó. –

+0

Bạn không thể gọi '-pushViewController: animated:' trên bất kỳ bộ điều khiển xem cũ nào. Bạn cần phải gọi nó trên một 'UINavigationController'. Cách dễ nhất để thực hiện điều này là gọi 'self.navigationController', sẽ trả về bộ điều khiển điều hướng mà bộ điều khiển xem hiện đang ở. –

+0

Nhưng khi tôi làm điều này thì self.navigationController không có gì xảy ra? Đó là vấn đề tôi đang cố gắng giải quyết. Tôi có nhớ điều gì không? một phương pháp hay một cái gì đó? –