2013-04-06 27 views
5

Mam aplikację Tab Bar Controller, która używa storyboardu. Każda karta ma widok UIWebview. Chcę przechwycić link, gdy użytkownik kliknie łącze w widoku sieciowym, jeśli link jest linkiem zewnętrznym (jeśli to nie jest moja strona) Chcę otworzyć łącze w innym UIViewControl. (podobnie jak w przypadku aplikacji Twitter Twitter))pushViewController nie działa z TabbarController

Teraz; Mam ten kod do przechwytywania łącza (jeśli link jest bing.com to powinien otworzyć go inny kontroler widoku), ale nie mogę otworzyć innego UIViewController (w tym przypadku PopViewController). To daje mi ten błąd:

Brak widocznych @interface dla 'GundemViewController' deklaruje selektor 'pushViewController: animowane:'

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

Odpowiedz

10

można umieścić kontrolery nawigacyjne na każdej karcie, dzięki czemu zamiast:

UITabBarController 
    Tab1 View Controller 
    Tab2 View Controller 
    Tab3 View Controller 

masz

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

i tak dalej. Możesz zadzwonić pod numer -pushViewController:animated: tylko na instancję kontrolera nawigacyjnego.

W delegacie aplikacji prawdopodobnie zainicjujesz każdy ze kontrolerów widoku, umieścisz je w tablicy, a następnie przypiszesz tę tablicę do kontrolera paska kart. Aby dodać kontrolery nawigacyjne, masz dodatkowy krok:

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

// etc 

następnie ustawić tablicę widzenia regulatorów na karcie Pasek kontrolera do utworzonych kontrolerów nawigacyjnych.

W swoich kontrolerach widoku, zamiast wywoływać -pushViewController:animated: na self, zadzwonisz pod numer self.navigationController.

edit:

Jeśli nie chcesz kontrolera nawigacyjnego, można użyć

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

przedstawienie pop-up. W wyskakującym okienku, gdy użytkownik dotknie przycisku zamykania, użyj go, aby go odrzucić.

+0

Zasadniczo po prostu przeciągam i upuszczam kontrolkę Tabbarcontroller na scenę (storyboard), niż próbuję stworzyć popup (oddzielne od wszystkich obecnych kart i innych rzeczy) Chcę tylko utworzyć kontroler widoku z góry i kiedy użytkownik kliknie przycisk zamykania. Muszę odrzucić –

+0

Zobacz zmiany powyżej. –

+0

Seamus Mam pomysł, który zostanie doceniony *** WebKit odrzucił nieprzechwycony wyjątek w webView: decisionPolicyForNavigationAction: request: frame: decisionListener: delegate: Nie można załadować NIB w pakiecie: 'NSBundle (loaded) 'o nazwie' PopupViewController ' –

1

Co jest GundemViewController? Sprawdź, dlaczego jest on zwracany od self.navigationController zamiast UINavigationController. Jednym ze sposobów jest ustawienie punktu przerwania tuż przed naciśnięciem kontrolera widoku, a następnie przejście do połączenia self.navigationController.

+0

GundemViewController jest kontrolerem UIViewController. Czy mógłbyś ponownie sprawdzić tę część? Edytowałem tę część. –

+0

Nie możesz wywołać '-pushViewController: animated:' na jakimkolwiek starym kontrolerze widoku. Musisz wywołać to na "UINavigationController". Najprostszym sposobem na to jest wywołanie 'self.navigationController', która zwróci kontroler nawigacji, w którym znajduje się kontroler widoku. –

+0

Ale kiedy robię to self.navigationController nic się nie dzieje? To jest problem, który próbuję rozwiązać. Czy coś mi brakuje? metoda czy coś? –

Powiązane problemy