UITabBarControllerで最後に選択したタブを記憶する方法は?
質問
アプリが終了する前に最後に表示されていたタブをアプリに記憶させて、アプリが次に起動されたときに同じタブが開くようにします。これは、iPhoneの電話機能の機能です。どうすればいいですか?
解決
UITabBarのデリゲートで、上書き
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
NSUserDefaultsに item のインデックスを保存します。次回アプリを起動するときは、そこからアプリを読み取り、選択状態に戻します。このようなもの:
-最初に、次のようにUITabBarのデリゲートを設定します:
tabBarController.delegate = anObject;
- anObject で、 didSelectItem を上書きします:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setInteger: [NSNumber numberWithInt: tabBarController.selectedIndex]
forKey:@"activeTab"];
[def synchronize];
}
NSNumberを保存することに注意してください。 int の値は直接シリアル化できないためです。 アプリを再度起動すると、デフォルトから selectedIndex の値が読み取られ、設定されます。
- (void)applicationDidFinishLaunchingUIApplication *)application {
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
int activeTab = [(NSNumber*)[def objectForKey:@"activeTab"] intValue];
tabBarController.selectedIndex = activeTab;
}
他のヒント
更新
In the UITabBarControllerDelegate's Delegate, overwrite
目的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
}
TabBarControllerをサブクラス化して、
- (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"];
}
これが私がそれをした方法です。 両方のメソッドはappDelegateにあり、tabBarControllerはインスタンス変数です。
- (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;
}
これがSwift 3ソリューションです。ストーリーボードでTabBarControllerのクラスを RememberingTabBarController
に設定するだけです
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()
}
}
ユーザーが新しいタブを選択するたびに、選択したタブインデックスをNSUserDefaults設定に保存します。その後、アプリが起動したら、設定からその値を読み込み、手動でそのタブを選択します。
所属していません StackOverflow