Sto cercando di far sì che la mia app ricordi quale scheda è stata visualizzata per l'ultima volta prima che l'app si chiuda, in modo che l'app si apra alla stessa scheda al prossimo avvio. Questa è la funzionalità della funzione telefono dell'iPhone: come posso fare questo?Come ricordare l'ultima scheda selezionata in UITabBarController?
risposta
In delegato del UITabBar, sovrascrivere
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
e memorizzare indice s' elemento in NSUserDefaults. La prossima volta che verrà avviata l'app, leggerla da lì e reimpostarla in modo da essere selezionata. Qualcosa di simile a questo:
-In primo luogo, è necessario impostare un delegato per l'UITabBar, in questo modo:
tabBarController.delegate = anObject;
-in anObject, sovrascrivere didSelectItem:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setInteger: [NSNumber numberWithInt: tabBarController.selectedIndex]
forKey:@"activeTab"];
[def synchronize];
}
Si noti che si salva un NSNumber, come int i valori non possono essere serializzati direttamente. Quando si avvia l'applicazione di nuovo, leggerà e impostare il valore diselectedIndex rispetto alle impostazioni predefinite:
- (void)applicationDidFinishLaunchingUIApplication *)application {
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
int activeTab = [(NSNumber*)[def objectForKey:@"activeTab"] intValue];
tabBarController.selectedIndex = activeTab;
}
Memorizza l'indice di tabulazione selezionato nelle preferenze di NSUserDefaults ogni volta che l'utente seleziona una nuova scheda. Quindi, quando l'app si avvia, carica quel valore dalle preferenze e seleziona manualmente quella scheda.
Ecco come ho fatto. Entrambi i metodi si trovano nell'appDelegate e tabBarController è una variabile di istanza.
- (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;
}
questo codice non funziona per me –
I sottoclasse TabBarController e:
- (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"];
}
UPDATE
In the UITabBarControllerDelegate's Delegate, overwrite
Objective 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
}
Questo non è 'UITabBarDelegate', è' UITabBarControllerDelegate'. – MoLice
Ho modificato la mia risposta. –
Ecco la soluzione Swift 3. Basta impostare la classe del tuo TabBarController per RememberingTabBarController
nello 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()
}
}
Date un'occhiata a questa recente domanda, anche: http://stackoverflow.com/questions/1619478/how-can-i-have-my- iphone-app-start-with-a-specific-screen-showing- –