2013-04-06 3 views
5

У меня есть приложение для панели управления панелью, которое использует раскадровку. Каждая вкладка имеет UIWebview. Я хочу захватить ссылку, когда пользователь нажимает ссылку в Webview, если ссылка является внешней ссылкой (если это не мой сайт). Я хочу открыть ссылку в другом UIViewControl. (например, приложение для iphone для popupi Twitter)pushViewController не работает с TabbarController

Прямо сейчас; Я получил этот код для захвата ссылки (если ссылка bing.com, тогда она должна открыть ее еще один контроллер представления), но я не могу открыть другой UIViewController (в данном случае PopViewController). Это дает мне эту ошибку:

Нет видимых @interface для 'GundemViewController' не декларирует селектор 'pushViewController: анимированные:'

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

ответ

10

Вы можете вставлять навигационные контроллеры на каждой вкладке, так что вместо того, чтобы:

UITabBarController 
    Tab1 View Controller 
    Tab2 View Controller 
    Tab3 View Controller 

у вас есть

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

и так далее. Вы можете только позвонить -pushViewController:animated: на экземпляр навигационного контроллера.

В делетете приложения вы, вероятно, инициализируете каждый из ваших контроллеров представлений, помещаете их в массив и затем назначаете этот массив контроллеру панели вкладок. Чтобы добавить навигационные контроллеры, у вас есть дополнительный шаг:

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

// etc 

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

На ваш взгляд, контроллеры, а не позвонить -pushViewController:animated: по телефону self, вы можете позвонить по телефону self.navigationController.

редактировать:

Если вы не хотите, навигационный контроллер, вы можете использовать

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

представить всплывал. Во всплывающем окне, когда пользователь прикасается к кнопке закрытия, используйте

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

отклонить его.

+0

В основном я просто перетаскиваю Tabbarcontroller на сцену (раскадровку), чем пытаюсь добиться создания всплывающего окна (отдельно от всех текущих вкладок и других вещей). Я просто хочу создать контроллер верхнего уровня и когда пользователь нажмет на него закрыть кнопку. Мне нужно уволить –

+0

См. Правки выше. –

+0

Seamus Я понял, что любая идея будет оценена *** WebKit отказался от неперехваченного исключения в webView: solvePolicyForNavigationAction: request: frame: decisionListener: delegate: Не удалось загрузить NIB в пакете: 'NSBundle (загружен) 'с именем «PopupViewController» –

1

Что такое GundemViewController? Посмотрите, почему это возвращается с self.navigationController вместо UINavigationController. Один из способов сделать это - установить точку останова непосредственно перед тем, как вы нажмете контроллер просмотра, а затем перейдите в вызов self.navigationController.

+0

GundemViewController - это UIViewController. Не могли бы вы снова проверить эту часть. Я отредактировал эту часть. –

+0

Вы не можете вызвать '-pushViewController: анимированный:' на любом старом контроллере. Вам нужно вызвать его на 'UINavigationController'. Самый простой способ сделать это - вызвать 'self.navigationController', который вернет контроллер навигации, в котором сейчас находится контроллер представления. –

+0

Но когда я делаю это self.navigationController, ничего не происходит? Это проблема, которую я пытаюсь решить. Я что-то пропустил? метод или что-то еще? –