Question

J'essaie de faire en sorte que mon application mémorise le dernier onglet affiché avant la fermeture de l'application, de sorte que l'application s'ouvre sous le même onglet lors de son prochain lancement. Voici la fonctionnalité de la fonction de téléphone de l'iPhone: comment puis-je faire cela?

Était-ce utile?

La solution

Dans le délégué de la barre de menu UIT, écrasez

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item

et stockez l'index de élément dans NSUserDefaults. La prochaine fois que votre application démarrera, lisez-la à partir de là et redéfinissez-la pour la sélectionner. Quelque chose comme ça:

-d'abord, vous définiriez un délégué pour votre UITabBar, comme suit:

tabBarController.delegate = anObject;

-dans unObjet , écrasez didSelectItem :

       - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
        {
          NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

          [def setInteger: [NSNumber numberWithInt: tabBarController.selectedIndex]
 forKey:@"activeTab"];

          [def synchronize];
        }

Notez que vous enregistrez un numéro NSNumber car les valeurs int ne peuvent pas être sérialisées directement. Lorsque vous redémarrez l'application, elle lit et définit la valeur selectedIndex à partir des valeurs par défaut:

- (void)applicationDidFinishLaunchingUIApplication *)application {  
   NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

   int activeTab = [(NSNumber*)[def objectForKey:@"activeTab"] intValue];

   tabBarController.selectedIndex = activeTab;
} 

Autres conseils

MISE À JOUR

In the UITabBarControllerDelegate's Delegate, overwrite

Objectif C

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
NSLog(@"%lu",self.tabBarController.selectedIndex);
return YES;
}

In this delegate method you will get last selected index.

Swift 3.2

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool
{
    print("%i",tabBarController.selectedIndex)
    return true
}

J'ai sous-classé TabBarController et:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.selectedIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"activeTab"];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSUserDefaults standardUserDefaults] setInteger: self.selectedIndex
             forKey:@"activeTab"];
}

Voici comment je l'ai fait. Les deux méthodes sont dans appDelegate et tabBarController est une variable d'instance.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
     */

    //Remember the users last tab selection
    NSInteger tabIndex = self.tabBarController.selectedIndex;
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger: tabIndex forKey:@"activeTab"];

    if (![userDefaults synchronize]) 
    {
        NSLog(@"Error Synchronizing NSUserDefaults");
    }

}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
     */

    //Set the tabBarController to the last visted tab
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    int activeTab = [(NSNumber*)[userDefaults objectForKey:@"activeTab"] intValue];
    self.tabBarController.selectedIndex = activeTab;
}

Voici la solution Swift 3. Définissez simplement la classe de votre TabBarController sur RememberingTabBarController dans le Storyboard

import Foundation
import UIKit

class RememberingTabBarController: UITabBarController, UITabBarControllerDelegate {
    let selectedTabIndexKey = "selectedTabIndex"

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self

        // Load the last selected tab if the key exists in the UserDefaults
        if UserDefaults.standard.object(forKey: self.selectedTabIndexKey) != nil {
            self.selectedIndex = UserDefaults.standard.integer(forKey: self.selectedTabIndexKey)
        }
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        // Save the selected index to the UserDefaults
        UserDefaults.standard.set(self.selectedIndex, forKey: self.selectedTabIndexKey)
        UserDefaults.standard.synchronize()
    }
}

Stockez l'index d'onglets sélectionné dans les préférences NSUserDefaults chaque fois que l'utilisateur sélectionne un nouvel onglet. Ensuite, lorsque l'application démarre, chargez cette valeur à partir des préférences et sélectionnez manuellement cet onglet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top