Antwort

0

Mit JAL Antwort als Basis, ich war in der Lage, dies zu implementieren Ich selbst in einer App, die bereits bestehende Struktur mit Tabs hatte.

Ich wollte Tab 3 in einen Safari-Controller innerhalb der Registerkarte gehen, nachdem eine Schaltfläche auf der vorhandenen Ansicht gedrückt wurde, und den Safari-Controller nicht in ein eigenes Fenster wie Apple-Standard-Code.

Der Schlüssel war, in einer in die bestehende UITabBarController Array von View-Controller zu tauschen. Ich habe den vorhandenen Original-View-Controller auf Tab. 3 (Index 2) gespeichert, um zu diesem zurückzukehren, wenn die Schaltfläche Fertig auf dem Safari-Controller gedrückt wurde. Safari-Controller gehen in aus mit meinem Tab

Hier ist, was ich tat, als eine Taste gedrückt wurde:

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

Dann konnte ich auf dieser Registerkarte wie folgt auf die ursprüngliche Ansicht wechseln zurück, wenn die Schaltfläche Fertig war gedrückt diese Delegierten Anruf auf den Safari-Controller verwenden: in einem aus dem tabBarController-view-Controller-Array,

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

Als ich Controller getauscht verlor ich meine Tabulatorsymbol und Registernamen, also musste ich diejenigen setzen. Hier ist, wie ich dieses Problem behoben (und hielt meine Theming, wenn die Registerkarte Symbol berührt wurde):

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

Ich muss zugeben, dass ich nicht sicher bin, dass Apple beabsichtigt, dass die SFSafariViewController in einem Register auf diese Weise verwendet werden, basierend auf dem, was das normale Verhalten des Aufrufens SFSafariViewController derzeit tut. Beachten Sie jedoch, dass zukünftige iOS-Updates dieses Verhalten möglicherweise ändern und Ihren Code immer testen, wenn neue iOS-Versionen in die Betaversion aufgenommen werden.

2

Ich konnte dies programmatisch erreichen. Der Schlüssel zu nicht über die UITabBar Overlay auf Ihrem UIViewController ist gesetzt translucent zu NO:

In Ihrem 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; 
} 
Verwandte Themen