risposta

0

Utilizzando la risposta di JAL come base, sono stato in grado di attuare questa me stesso in un'app che aveva già una struttura con schede.

Desideravo la scheda n. 3 per entrare in un controller di Safari all'interno della scheda dopo aver premuto un pulsante sulla vista esistente e non inserire il controller di Safari nella sua finestra come se utilizzasse il codice predefinito di Apple.

La chiave era di scambiare un SFSafariViewController nell'array di controller di vista esistente di UITabBarController. Ho salvato il controller di visualizzazione originale esistente nella scheda n. 3 (indice 2) per tornare ad esso quando è stato premuto il pulsante Fine sul controller Safari.

Ecco cosa ho fatto per andare al controller Safari dal con la mia scheda quando un pulsante è stato premuto:

NSMutableArray *viewArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers]; 
self.savedController = [viewArray objectAtIndex:2]; 
[viewArray replaceObjectAtIndex:2 withObject:safariController]; 
self.tabBarController.viewControllers = viewArray; 
[self setTabIconTitle]; 

Poi ho Potreste scambiare di nuovo alla vista originale su quella scheda come questo, quando il pulsante Done era premuto sul controller Safari utilizza questa chiamata delegato:

- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller 
{ 
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 
    NSMutableArray *viewArray = [NSMutableArray arrayWithArray:tabBarController.viewControllers]; 
    [viewArray replaceObjectAtIndex:2 withObject:self.savedController]; 
    tabBarController.viewControllers = viewArray; 
    [self setTabIconTitle]; 
} 

Quando ho scambiato i controller in un fuori della matrice di controllo tabBarController vista, ho perso la mia scheda icona e scheda nome, così ho dovuto impostare quelli. Ecco come ho risolto tale questione (e mantenuto la mia tematizzazione quando l'icona scheda è stato toccato):

- (void)setTabIconTitle 
{ 
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 
    UITabBar *tabBar = tabBarController.tabBar; 
    UITabBarItem *marketplaceTab = [tabBar.items objectAtIndex:2]; 
    marketplaceTab.image = [[UIImage imageNamed:@"tab2-icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    marketplaceTab.selectedImage = [UIImage imageNamed:@"tab2-icon"]; 
    marketplaceTab.title = @"My Tab"; 
} 

devo ammettere che io non sono sicuro che Apple intende che il SFSafariViewController essere utilizzato in questo modo all'interno di una scheda, in base a ciò che fa normalmente il normale comportamento di chiamare SFSafariViewController. Tieni presente che i futuri aggiornamenti di iOS potrebbero modificare questo comportamento e testare sempre il codice quando le nuove versioni di iOS entrano nella versione beta.

2

Sono riuscito a farlo a livello di programmazione. Hanno la chiave per non hanno il UITabBar sovrapposizione sulla parte superiore del UIViewController è quello di impostare translucent a NO:

Nel vostro AppDelegate.m:

@import SafariServices; 

// ... 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    UITabBarController *tabBarController = [[UITabBarController alloc] init]; 
    tabBarController.tabBar.translucent = NO; 

    SFSafariViewController *firstVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http://stackoverflow.com"]]; 

    firstVC.title = @"SFSafariViewController"; 

    UIViewController *secondVC = [[UIViewController alloc] init]; 
    secondVC.view.backgroundColor = [UIColor blueColor]; 

    secondVC.title = @"Blue VC"; 

    tabBarController.viewControllers = @[firstVC, secondVC]; 

    self.window.rootViewController = tabBarController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
}