【问题标题】:How to: Save order of tabs when customizing tabs in UITabBarController如何:在 UITabBarController 中自定义选项卡时保存选项卡的顺序
【发布时间】:2011-01-03 07:12:21
【问题描述】:

我在查找有关如何为我的 UITabBarController 保存选项卡顺序的文档以外的任何其他信息时遇到问题,以便保存用户的自定义以供下次应用启动时使用。我在网上搜索过,但找不到任何通过正确代码执行此操作的博客文章或文章。

我意识到我必须使用 UITabBarController (didEndCustomizingViewControllers:) 的委托方法,但我不确定在保存用户想要标签的顺序状态方面如何最好地处理持久性。

有人可以发布一些代码,为我指明正确的方向,或者您有保存的链接吗? :)

谢谢

【问题讨论】:

    标签: iphone uitabbarcontroller


    【解决方案1】:

    就您要求提供一些示例代码而言,我将在这里简单地发布我如何在我的应用程序中处理相同的任务。

    快速介绍:我使用 NIB 文件来存储初始 UITabBarController 状态并区分我的选项卡,我只是为 UITabBarItem 对象定义了标签变量,分配给填充在我的 UITabBarController 中的每个 UIViewController。为了能够准确地跟踪最后选择的选项卡(包括“更多”选项卡),我为我的UITabBarControllerUITabBarControllerDelegate 和它的moreNavigationController 的UINavigationControllerDelegate 实现了以下方法。他们在这里:

    #pragma mark UINavigationControllerDelegate
    
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        [[NSUserDefaults standardUserDefaults] setInteger:mainTabBarController.selectedIndex forKey:@"mainTabBarControllerSelectedIndex"];
    }
    
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        [[NSUserDefaults standardUserDefaults] setInteger:mainTabBarController.selectedIndex forKey:@"mainTabBarControllerSelectedIndex"];
    }
    
    #pragma mark UITabBarControllerDelegate
    
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
        [[NSUserDefaults standardUserDefaults] setInteger:tabBarController.selectedIndex forKey:@"mainTabBarControllerSelectedIndex"];
    }
    

    这是保存标签顺序的代码:

    #pragma mark UITabBarControllerDelegate
    
    - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed {
        int count = mainTabBarController.viewControllers.count;
        NSMutableArray *savedTabsOrderArray = [[NSMutableArray alloc] initWithCapacity:count];
        for (int i = 0; i < count; i ++) {
            [savedTabsOrderArray addObject:[NSNumber numberWithInt:[[[mainTabBarController.viewControllers objectAtIndex:i] tabBarItem] tag]]];
        }
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:savedTabsOrderArray] forKey:@"tabBarTabsOrder"];
        [savedTabsOrderArray release];
    }
    

    如您所见,我一直在 NSUserDefaults 的数组中存储选项卡索引的顺序。

    在以applicationDidFinishLaunching: 方法启动应用时,我使用以下代码重新排序了UIViewControllers

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        mainTabBarController.delegate = self;
    
        int count = mainTabBarController.viewControllers.count;
        NSArray *savedTabsOrderArray = [[userDefaults arrayForKey:@"tabBarTabsOrder"] retain];
        if (savedTabsOrderArray.count == count) {
            BOOL needsReordering = NO;
    
            NSMutableDictionary *tabsOrderDictionary = [[NSMutableDictionary alloc] initWithCapacity:count];
            for (int i = 0; i < count; i ++) {
                NSNumber *tag = [[NSNumber alloc] initWithInt:[[[mainTabBarController.viewControllers objectAtIndex:i] tabBarItem] tag]];
                [tabsOrderDictionary setObject:[NSNumber numberWithInt:i] forKey:[tag stringValue]];
    
            if (!needsReordering && ![(NSNumber *)[savedTabsOrderArray objectAtIndex:i] isEqualToNumber:tag]) {
                    needsReordering = YES;
                }
            }
    
            if (needsReordering) {
                NSMutableArray *tabsViewControllers = [[NSMutableArray alloc] initWithCapacity:count];
                for (int i = 0; i < count; i ++) {
                    [tabsViewControllers addObject:[mainTabBarController.viewControllers objectAtIndex:
                                                    [(NSNumber *)[tabsOrderDictionary objectForKey:
                                                                  [(NSNumber *)[savedTabsOrderArray objectAtIndex:i] stringValue]] intValue]]];
                }
                [tabsOrderDictionary release];
    
                mainTabBarController.viewControllers = [NSArray arrayWithArray:tabsViewControllers];
                [tabsViewControllers release];
            }
        }
        [savedTabsOrderArray release];
    
        if ([userDefaults integerForKey:@"mainTabBarControllerSelectedIndex"]) {
            if ([userDefaults integerForKey:@"mainTabBarControllerSelectedIndex"] == 2147483647) {
                mainTabBarController.selectedViewController = mainTabBarController.moreNavigationController;
            }
            else {
                mainTabBarController.selectedIndex = [userDefaults integerForKey:@"mainTabBarControllerSelectedIndex"];
            }
        }
    
        mainTabBarController.moreNavigationController.delegate = self;
    
        [window addSubview:mainTabBarController.view];
    }
    

    这很棘手,可能看起来很奇怪,但不要忘记我的UITabBarController 完全是在一个 nib 文件中创建的。如果您以编程方式构建它,您可以简单地执行相同的操作,但遵循保存的顺序。

    P.S.:当您的应用终止时,不要忘记同步 NSUserDefaults

    - (void)applicationWillTerminate:(UIApplication *)application {
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    

    我希望这会有所帮助。如果有不清楚的地方,请发表评论并询问。

    【讨论】:

    • 嗨,Iva,感谢您发布以上内容。我只是想知道您是否可以详细说明您运行的实际循环以创建您保存在 NSUSerDefaults 中以用于制表符顺序的数组?因为我意识到可以获得视图控制器的索引,但我认为这只是给了我它现在的顺序,而不是它应该是什么 - 以及这如何适合下次创建它们。你用标签分配视图控制器还是我怎么知道哪个是哪个?
    • 我其实一开始就贴出了所有的代码,之所以没有正确显示是因为我完全错过了'
    • 啊,谢谢 :) 但看起来 didEndCustomizingViewControllers: 方法中仍然缺少一些。..
    • 是的,它是... ;(我不知道为什么我开始编写代码和预标签,而不是简单地使用这个华丽的所见即所得功能。:-x 现在修复了一切(希望如此)!跨度>
    • 非常感谢,伊万。你的代码太棒了。我只需要复制并粘贴它就可以了!应用程序现在以正确的顺序恢复选项卡并在最后选择的选项卡中启动。谢谢谢谢谢谢:)
    【解决方案2】:

    首先,我对上一个答案投了赞成票,但后来我注意到它有多么复杂。它可以而且应该被简化。

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    
        NSArray *initialViewControllers = [NSArray arrayWithArray:self.tabBarController.viewControllers];
        NSArray *tabBarOrder = [[AppDelegate sharedSettingsService] tabBarOrder];
        if (tabBarOrder) {
            NSMutableArray *newViewControllers = [NSMutableArray arrayWithCapacity:initialViewControllers.count];
            for (NSNumber *tabBarNumber in tabBarOrder) {
                NSUInteger tabBarIndex = [tabBarNumber unsignedIntegerValue];
                [newViewControllers addObject:[initialViewControllers objectAtIndex:tabBarIndex]];
            }
            self.tabBarController.viewControllers = newViewControllers;
        }
    
        NSInteger tabBarSelectedIndex = [[AppDelegate sharedSettingsService] tabBarSelectedIndex];
        if (NSIntegerMax == tabBarSelectedIndex) {
            self.tabBarController.selectedViewController = self.tabBarController.moreNavigationController;
        } else {
            self.tabBarController.selectedIndex = tabBarSelectedIndex;
        }
    
        /* Add the tab bar controller's current view as a subview of the window. */
        [self.window addSubview:self.tabBarController.view];
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application {
    
        NSInteger tabBarSelectedIndex = self.tabBarController.selectedIndex;
        [[AppDelegate sharedSettingsService] setTabBarSelectedIndex:tabBarSelectedIndex];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    
    - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed {
    
            NSUInteger count = tabBarController.viewControllers.count;
            NSMutableArray *tabOrderArray = [[NSMutableArray alloc] initWithCapacity:count];
            for (UIViewController *viewController in viewControllers) {
    
                NSInteger tag = viewController.tabBarItem.tag;
                [tabOrderArray addObject:[NSNumber numberWithInteger:tag]];
            }
    
            [[AppDelegate sharedSettingsService] setTabBarOrder:[NSArray arrayWithArray:tabOrderArray]];
            [tabOrderArray release];
        }
    

    所有这些都发生在 AppDelegate 中。您在 Interface Builder 中将 UITabBarController 的委托设置为 AppDelegate 实例。 sharedSettingsService 是为我保留数据的东西。基本上它可以是 NSUserDefaults 前端或任何你喜欢的东西(例如 CoreData)。所以一切都很简单,Interface Builder 在这里提供帮助,而不是让事情变得更复杂。

    【讨论】:

    • 从未想过即使在不需要视图控制器时重新排序视图控制器并使用稍微不同的语法编写代码会使“荒谬”的现成解决方案变得“更简单”。很高兴我帮助您节省了一些时间,但没有从头开始实施所有内容。
    • 请不要误导我的语言。可笑和可笑的复杂是不同的东西。
    • Count 不是 NSArray 的属性。那应该是 [tabBarController.viewControllers count]。
    • 为清楚起见打勾。谢谢。
    • 加了一个...这个解决方案绝对更简单...没有冒犯伊万:)
    【解决方案3】:

    也许玩得晚了,但在学校学习 Swift 还不到两个月,而且因为在 interwebz 上找不到合适的解释,所以坐了 15 多个小时。

    这是 Swift 中的解决方案

    1. 从 1 开始为所有 tabItem 指定一个标签。您可以在每个单独的视图中执行此操作。如果您有六个视图,则它们的 tabItems 在这种情况下将有一个唯一的编号,每个编号介于 1 和 6 之间。

    2. UITabBarControllerDelegate 添加到所有 ViewController 的类中,以便您可以使用稍后在第 5 点中解释的函数。

      class FirstViewController: UIViewController, UITabBarControllerDelegate {
      
    3. 添加以下全局变量(作为示例,就在上面的代码之后),以便您可以从类中的任何函数将变量本地保存在手机上。

      let defaults = NSUserDefaults.standardUserDefaults()
      
    4. 将 tabBarController 委托给视图,以便视图可以更新对 tabBarController 的任何更改。将以下内容放入您的 viewDidLoad()

      tabBarController!.delegate = self
      
    5. 实现以下代码。当用户编辑选项卡视图时,此选项将激活。代码所做的是按照它们的顺序(在用户更改它之后)获取 [ViewControllers] 的标签,并将其保存在手机本地。第一个 viewController 的标签以整数形式保存在变量“0”中,第二个标签保存在变量“1”中,以此类推。

      func tabBarController(tabBarController: UITabBarController, didEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool) {
          if (changed) {
              print("New tab order:")
              for (var i=0; i<viewControllers.count; i++) {
                  defaults.setInteger(viewControllers[i].tabBarItem.tag, forKey: String(i))
                  print("\(i): \(viewControllers[i].tabBarItem.title!) (\(viewControllers[i].tabBarItem.tag))")
              }
          }
      }
      

    打印件告诉您标签的新顺序。您不需要任何东西,但我认为很高兴看到后台发生的事情。所有这些只是为了保存选项卡的顺序。您现在必须在程序启动时检索它们。

    1. 从您的 UIViewControl 文件切换到 AppDelegate.swift

    2. 最后在 func application(application: UIApplication, didFinishLaunchingWithOptions... 中写入以下内容,您可以在 AppDelegate.swift 的顶部找到。

      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
      // Let you read and write to local variables on your phone
      let defaults = NSUserDefaults.standardUserDefaults()
      
      // Getting access to your tabBarController
      let tabBar: UITabBarController = self.window?.rootViewController as! UITabBarController
      
      var junkViewControllers = [UIViewController]()
      
      // returns 0 if not set, hence having the tabItem's tags starting at 1.
      var tagNumber : Int = defaults.integerForKey("0")
      
      if (tagNumber != 0) {
          for (var i=0; i<tabBar.viewControllers?.count; i++) {
              // the tags are between 1-6 but the order of the
              // viewControllers in the array are between 0-5
              // hence the "-1" below.
              tagNumber = defaults.integerForKey( String(i) ) - 1
              junkViewControllers.append(tabBar.viewControllers![tagNumber])
          }
      
          tabBar.viewControllers = junkViewControllers
      }
      }
      

    值得一提的是,tabBarController 包含的所有视图都以数组的形式存储在 tabBarController.viewControllers 中。

    这段代码基本上创建了一个名为 junkViewControllers 的数组。然后,for 循环根据 UIViewControllers 的标签,按照之前存储的变量的顺序从程序中添加现有的 UIViewControllers。当所有这些都完成后,被缩短为 tabBar 的 tabBarController 被数组 junkViewController 覆盖。

    【讨论】:

      【解决方案4】:

      这就是我的诀窍,建立在 Rickard & Jesper 的答案之上。所有代码都进入主 TabBarController。

      import UIKit
      
      class TabBarController: UITabBarController, UITabBarControllerDelegate {
      
      let tabOrderKey = "customTabBarOrder"
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
          self.delegate = self
          loadCustomTabOrder()
      }
      
      func loadCustomTabOrder() {
      
          let defaults = NSUserDefaults.standardUserDefaults()
          let standardOrderChanged = defaults.boolForKey(tabOrderKey)
      
          if standardOrderChanged {
              print("Standard Order has changed")
      
              var VCArray = [UIViewController]()
              var tagNumber = 0
      
              let tabBar = self as UITabBarController
      
              if let countVC = tabBar.viewControllers?.count {
                  print("\(countVC) VCs in total")
                  for var x = 0; x < countVC; x++ {
                      tagNumber = defaults.integerForKey("tabPosition\(x)")
      
                      for VC in tabBar.viewControllers! {
                          if tagNumber == VC.tabBarItem.tag {
                              VCArray.append(VC)
                              print("Position \(x): \(VCArray[x].tabBarItem.title!) VC (tag \(tagNumber))")
                          }
                      }
                  }
              }
              tabBar.viewControllers = VCArray
          }
      
      }
      
      func tabBarController(tabBarController: UITabBarController, didEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool) {
      
          print("Change func called")
      
          if changed {
              print("Order has changed")
              let defaults = NSUserDefaults.standardUserDefaults()
      
              for var x = 0; x < viewControllers.count; x++ {
                  defaults.setInteger(viewControllers[x].tabBarItem.tag, forKey: "tabPosition\(x)")
                  print("\(viewControllers[x].tabBarItem.title!) VC (with tag: \(viewControllers[x].tabBarItem.tag)) is now in position \(x)")
              }
              defaults.setBool(true, forKey: tabOrderKey)
          } else {
              print("Nothing has changed")
          }
      }
      
      }
      

      【讨论】:

        【解决方案5】:

        我将解释如何以编程方式执行此操作。注意:这是使用 ARC,因此您可能必须根据需要插入保留/释放调用。

        您使用UITabBarItemtag 属性进行排序。对于您要添加到UITabBarController 的每个UIViewController,请确保每个tag 都有一个唯一的tag

        - (id)init
        {
            self = [super init];
            if (self) {
                self.tabBarItem.tag = 0;
                self.tabBarItem.image = <image>;
                self.tabBarItem.title = <title>;
            }
            return self;
        }
        

        大概你只会使用他们的默认排序顺序来为他们的标签,所以无论你有什么作为你原来的第一个视图控制器都是 0,然后是 1、2、3 等等。

        像往常一样在 AppDelegate 的didFinishLaunchingWithOptions 中设置您的 UIViewControllers,确保您以它们的“默认顺序”实例化它们。这样做时,将它们添加到 NSMutableArray 的实例中。

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        {    
            self.tabBarController = [[UITabBarController alloc] init];
            self.tabBarController.delegate = self;
        
            NSMutableArray *unsortedControllers = [NSMutableArray array];
        
            UIViewController *viewOne = [[UIViewController alloc] init];
            [unsortedControllers addObject:viewOne];
        
            UIViewController *viewTwo = [[UIViewController alloc] init];
            [unsortedControllers addObject:viewTwo];
            ...
        

        在它们全部实例化并添加到数组后,您将通过查询NSUserDefaults 来检查用户是否自定义了他们的订单。默认情况下,您将存储用户自定义标签栏顺序的数组。这将是一个 NSNumbers 数组(如何创建在最后的代码 sn-p 中解释)。使用这些来创建一个新的“排序”视图控制器数组并将其传递给标签栏控制器。如果他们没有自定义顺序,默认会返回 nil,你可以简单地使用未排序的数组。

            ...
            NSArray *tabBarOrder = [[NSUserDefaults standardUserDefaults] arrayForKey:@"tabBarOrder"];
            if (tabBarOrder)
            {
              NSMutableArray *sortedControllers = [NSMutableArray array];
              for (NSNumber *sortNumber in tabBarOrder)
              {
                 [sortedControllers addObject:[unsortedControllers objectAtIndex:[sortNumber intValue]]];
              }
              self.tabBarController.viewControllers = sortedControllers;
            } else {
              self.tabBarController.viewControllers = unsortedControllers;
            }
            [self.window setRootViewController:self.tabBarController];
            [self.window makeKeyAndVisible];
        
            return YES;
        }
        

        要创建自定义排序顺序,请使用 UITabBarController 的委托方法:

        - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
        {
            NSMutableArray *tabOrderArray = [[NSMutableArray alloc] init];
            for (UIViewController *vc in self.tabBarController.viewControllers)
            {
                [tabOrderArray addObject:[NSNumber numberWithInt:[[vc tabBarItem] tag]]];
            }
            [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:tabOrderArray] forKey:@"tabBarOrder"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        

        【讨论】:

        • 我做了这个答案的 Swift 等价物,效果很好。我所做的唯一有意义的更改是使用参数viewControllers,该参数已经传递给tabBarController:didEndCustomizingViewControllers:changed:,并在执行保存新世界秩序™之前实际检查了changed
        【解决方案6】:

        简化的 Rickard Elimää 回答更进一步。使用 tabBarController CustomizingViewControllers 的委托功能保存和加载自定义 ViewControllers 的“Swift”解决方案。

        我就是这样做的。

        class TabBarController: UITabBarController, UITabBarControllerDelegate {
        
            let kOrder = "customOrder"
        
            override func viewDidLoad() {
                super.viewDidLoad()
                self.delegate = self
        
                loadCustomizedViews()
            }
        
            func loadCustomizedViews(){
                let defaults = NSUserDefaults.standardUserDefaults()
        
                // returns 0 if not set, hence having the tabItem's tags starting at 1.
                let changed : Bool = defaults.boolForKey(kOrder)
        
                if changed {
                    var customViewControllers = [UIViewController]()
                    var tagNumber: Int = 0
                    for (var i=0; i<self.viewControllers?.count; i++) {
                        // the tags are between 0-6 and the
                        // viewControllers in the array are between 0-6
                        // so we swap them to match the custom order
                        tagNumber = defaults.integerForKey( String(i) )
        
                        //print("TabBar re arrange i = \(i), tagNumber = \(tagNumber),  viewControllers.count = \(self.viewControllers?.count) ")
                        customViewControllers.append(self.viewControllers![tagNumber])
                    }
        
                    self.viewControllers = customViewControllers
                }
            }
        
            func tabBarController(tabBarController: UITabBarController, didEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool){
        
                if (changed) {
                    let defaults = NSUserDefaults.standardUserDefaults()
                    //print("New tab order:")
                    for (var i=0; i<viewControllers.count; i++) {
                        defaults.setInteger(viewControllers[i].tabBarItem.tag, forKey: String(i))
                        //print("\(i): \(viewControllers[i].tabBarItem.title!) (\(viewControllers[i].tabBarItem.tag))")
                    }
        
                    defaults.setBool(changed, forKey: kOrder)
                }
            }
        }
        

        【讨论】:

          【解决方案7】:

          Swift 2.0 的更新答案

          `
          让 tabBarOrderKey = "tabBarOrderKey"

          extension TabBarButtonsController: UITabBarControllerDelegate {
          
           // Saves new tab bar custom order
          
            func tabBarController(tabBarController: UITabBarController, didEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool) {
          var orderedTagItems = [Int]()
          if changed {
            for viewController in viewControllers {
              let tag = viewController.tabBarItem.tag
              orderedTagItems.append(tag)
          
            }
            NSUserDefaults.standardUserDefaults().setObject(orderedTagItems, forKey: tabBarOrderKey)
          }
          }
          
          // set up tag to compare with when pulling from defaults and for saving initial tab bar change
          
          func setUpTabBarItemTags() {
          var tag = 0
          if let viewControllers = viewControllers {
            for view in viewControllers {
              view.tabBarItem.tag = tag
              tag += 1
            }
           }
          }
          
          // Get Saved Tab Bar Order from defaults
          
          func getSavedTabBarItemsOrder() {
          var newViewControllerOrder = [UIViewController]()
          if let initialViewControllers = viewControllers {
            if let tabBarOrder = NSUserDefaults.standardUserDefaults().objectForKey(tabBarOrderKey) as? [Int] {
              for tag in tabBarOrder {
                newViewControllerOrder.append(initialViewControllers[tag])
              }
              setViewControllers(newViewControllerOrder, animated: false)
            }
           }
          }
          

          }

          `

          记得设置委托并在视图中调用这些方法确实加载

          【讨论】:

            【解决方案8】:

            我想分享我近 3 天以来一直在编写的代码,现在尝试了各种组合,但有很多错误和失败 - 编码的一般生活!哈哈。无论如何,下面的代码适用于 Swift 5。 这是对 Sam 的代码 How to: Save order of tabs when customizing tabs in UITabBarController 的提取,但对 Swift 5 进行了 for 循环更新。 我在 TabBarViewController.swift 文件中做得很好。

            因此,如果您只是将其粘贴到您的 Swift 文件中,请确保您的 Tab Bar Items 具有来自 Attributes Inspector 的标签号,并且一切顺利!

            首先再次感谢 Sam 提供代码。

            import UIKit
            
            
            class TabBarController: UITabBarController, UITabBarControllerDelegate {
            
            let tabOrderKey = "customTabBarOrder"
            
            override func viewDidLoad() {
            super.viewDidLoad()
            
            self.delegate = self
            loadCustomTabOrder()
            }
            
            func loadCustomTabOrder() {
            
            let defaults = UserDefaults.standard
            let standardOrderChanged = defaults.bool(forKey: tabOrderKey)
            
            if standardOrderChanged {
                print("Standard Order has changed")
            
                var VCArray = [UIViewController]()
                var tagNumber = 0
            
                let tabBar = self as UITabBarController
            
                if let countVC = tabBar.viewControllers?.count {
                    print("\(countVC) VCs in total")
                    for x in 0..<countVC {
                        tagNumber = defaults.integer(forKey: "tabPosition\(x)")
            
                        for VC in tabBar.viewControllers! {
                            if tagNumber == VC.tabBarItem.tag {
                                VCArray.append(VC)
                                print("Position \(x): \(VCArray[x].tabBarItem.title!) VC (tag \(tagNumber))")
                            }
                        }
                    }
                }
                tabBar.viewControllers = VCArray
             }
            
             }
            
            func tabBarController(_ tabBarController: UITabBarController, didEndCustomizing viewControllers: [UIViewController], changed: Bool) {
            
            print("Change func called")
            
            if changed {
                print("Order has changed")
                let defaults = UserDefaults.standard
            
                for x in 0..<(viewControllers.count)  {
                    defaults.set(viewControllers[x].tabBarItem.tag, forKey: "tabPosition\(x)")
                    print("\(viewControllers[x].tabBarItem.title!) VC (with tag: \(viewControllers[x].tabBarItem.tag)) is now in position \(x)")
               }
                defaults.set(true, forKey: tabOrderKey)
                } else {
                print("Nothing has changed")
                }
              }
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多