在核心数据中存储标签栏标签顺序

Posted

技术标签:

【中文标题】在核心数据中存储标签栏标签顺序【英文标题】:store tabbar tabs order in core data 【发布时间】:2015-03-22 20:27:55 【问题描述】:

我有一个基于标签栏的应用程序,我在其中向应用程序添加控制器,如下所示:

UIStoryboard *storyboard = self.storyboard;
self.tabbar = [[UITabBarController alloc]init];

// FirstViewController
SoccerViewController *fvc=[storyboard  instantiateViewControllerWithIdentifier:@"SoccerViewController"];
fvc.navigationItem.title =  @"Fodbold";
fvc.tabBarItem.image=[UIImage imageNamed:@"fodbold.png"];

//SecondViewController
HaandballViewController *svc=[storyboard  instantiateViewControllerWithIdentifier:@"HaandballViewController"];
svc.title=@"Håndbold";
svc.tabBarItem.image=[UIImage imageNamed:@"handball.png"];

//ThirdViewController
FootballViewController *tvc= [storyboard  instantiateViewControllerWithIdentifier:@"FootBallViewController"];
tvc.title=@"Amr. Fodbold";
tvc.tabBarItem.image=[UIImage imageNamed:@"nfl.png"];

//ForthViewController
BasketballViewController *fovc=[storyboard  instantiateViewControllerWithIdentifier:@"BasketBallViewController"];
fovc.title=@"Basketball";
fovc.tabBarItem.image=[UIImage imageNamed:@"basketball.png"];

//FifthViewController
HockeyViewController *ftvc=[storyboard  instantiateViewControllerWithIdentifier:@"HockeyViewController"];
ftvc.title=@"Ishockey";
ftvc.tabBarItem.image=[UIImage imageNamed:@"icehockey.png"];



[API sharedInstance].allViewCont = [NSMutableArray arrayWithObjects:fvc,svc,tvc,fovc,ftvc,  nil];


self.tabbar.viewControllers=  [API sharedInstance].allViewCont;

[self.view addSubview:self.tabbar.view];

 // NSLog(@"%@", [API sharedInstance].allViewCont);

 //[self performSelector:@selector(hideSports) withObject:nil afterDelay:1];

self.tabbar.delegate = self;

现在保存工作,我关闭应用程序并重新打开我得到这个:

"<HaandballViewController: 0x7fdd9a589bd0>",
"<SoccerViewController: 0x7fdd9a58ac40>",
"<FootballViewController: 0x7fdd9a593180>",
"<BasketballViewController: 0x7fdd9a594350>",
"<HockeyViewController: 0x7fdd9a58efe0>"

但我不能像这样设置排序的水龙头:

- (void)setTabOrderIfSaved 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"sortetTabs"];
NSMutableArray *savedOrder = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSMutableArray *orderedTabs = [NSMutableArray arrayWithCapacity:6];
  NSLog(@"Test af gem array %@",savedOrder);
if (savedOrder!=nil && [savedOrder count] > 0 ) 
    for (int i = 0; i < [savedOrder count]; i++)
        for (UIViewController *aController in self.tabbar.viewControllers) 
            if ([aController.title isEqualToString:[savedOrder objectAtIndex:i]]) 
                [orderedTabs addObject:aController];
            
        
    
    for (UIViewController *aController in self.tabbar.viewControllers) 
        int loaded=0;
        for (UIViewController *bController in orderedTabs) 
            if ([aController.title isEqualToString:bController.title]) 
                loaded=1; 
                break; 
             
         
        if (loaded==0)  
            [orderedTabs addObject:aController]; 
         
     

    self.tabbar.viewControllers = orderedTabs;
 

我修复了这个.......

【问题讨论】:

您不应该将标签栏控制器的视图添加为子视图而不使标签栏控制器成为子视图控制器——即使那样,我也不确定您是否应该这样做。标签栏控制器可能应该是窗口的根视图控制器,或者您可以从另一个控制器模态显示它。 【参考方案1】:

Core Data 存储用户偏好绝对是矫枉过正。您应该使用NSUserDefaults。只需存储一组描述您的控制器的字符串(您可以使用您想出的那些可爱的不可读的缩写)。

[[NSUserDefaults standardUserDefaults] setObject:
  @[@"fvc", @"svc", @"tvc", @"fovc", @"ftvc"] forKey:@"TabsOrder"];

所以要从默认值中获取可变数组:

NSMutableArray *tabs = [NSMutableArray arrayWithArray:
   [[NSUserDefaults standardUserDefaults] objectForKey:@"TabsOrder"]];

编辑完成后保存:

[[NSUserDefaults standardUserDefaults] setObject:tabs forKey:@"TabsOrder"];

【讨论】:

正如我所说,我将它们存储在 NaMutable 数组和设置中的 tabelview 中,用户可以到达并放下单元格以制作他们想要的顺序,我尝试添加到 NSuserdefault 但不是其中之一我见过的方法有效。和(只要我知道缩写) 这就是它的完成方式。我将扩展我的答案以解释如何使用用户默认值中的静态数组来填充可变数组。 [如果你能尝试写出通俗易懂的英语会有所帮助。]

以上是关于在核心数据中存储标签栏标签顺序的主要内容,如果未能解决你的问题,请参考以下文章

转到其他视图后,标签栏按钮的顺序发生了变化

标签栏控制器/ Segue问题

如何访问标签栏控制器中的标签栏?

如何在运行时在 TabBarcontroller 中排列标签栏项目?

如何保持标签栏顺序一致但更改默认视图控制器?

重构故事板时如何交换标签栏项目的位置