自定义 TabBar 丢失 TabBarItem 图像

Posted

技术标签:

【中文标题】自定义 TabBar 丢失 TabBarItem 图像【英文标题】:custom TabBar loses TabBarItem images 【发布时间】:2013-09-27 21:45:29 【问题描述】:

我制作了一个运行良好的自定义 UITabBar,但我对导航进行了更改,现在我遇到了一些严重的问题。这是我所拥有的:

常规设置

TabBarController 
    NavbarController1 - TabBarItem1
        Links to: PeopleView
    NavbarController2 - TabBarItem2
        Links to: ContentView
    NavbarController3 - TabBarItem3
        Links to: ContentView //Same VC as TabBaritem 2.  

App Delegate - 在我的 didFinishLaunchingWithOptions 方法中,我调用了 customizeTabBar 方法,如下所示

-(void) customizeTabBar


UITabBarController *tabVC = (UITabBarController *) self.window.rootViewController;
//Load Navigation Bar images
NSArray *unSelectedImages = [[NSArray alloc] initWithObjects:@"image1.jpg", @"image2.jpg", @"image3.jpg", @"image4.jpg", @"image5.jpg", nil];
NSArray *selectedImages = [[NSArray alloc] initWithObjects:@"image1_on.jpg", @"image2_on.jpg", @"image3_on.jpg", @"image4_on.jpg", @"image5_on.jpg", nil];

NSArray *items = tabVC.tabBar.items;

for (int idx = 0; idx < items.count; idx++)

    
    UITabBarItem *barItem = [items objectAtIndex:idx];
    barItem.tag = idx;
    UIImage *selectedImage = [UIImage imageNamed:[selectedImages objectAtIndex:idx]];
    UIImage *unSelectedImage = [UIImage imageNamed:[unSelectedImages objectAtIndex:idx]];
    
    
    UIEdgeInsets inset = 
        .top = 10,
        .left = 0,
        .bottom = -10,
        .right = 0
    ;
    
    barItem.imageInsets = inset;
    
    [barItem setFinishedSelectedImage:selectedImage withFinishedUnselectedImage:unSelectedImage];

到目前为止,这一切都很好。

这就是问题所在。为了让我的 TabBarItem3 链接到 ContentView, 我在 TabBarClass 中实现了以下代码:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

if (viewController.tabBarItem.tag == 1 || viewController.tabBarItem.tag == 2 )

    // Validating if is necesarry to replace the TabBarController.ViewControllers
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    
    MediaList *mediaView = [storyboard  instantiateViewControllerWithIdentifier:@"SB_MediaList"];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mediaView];
    NSMutableArray *viewsArray = [NSMutableArray arrayWithArray:self.viewControllers];
    
    
    if (viewController.tabBarItem.tag == 1)
    
        //Setting the specfic data for my instance for tabBarItem 1
        NSLog(@"Here we are in 1");
        [mediaView setContent:@"Personalized content/data for TabBarItem 1"];
    
    else if (viewController.tabBarItem.tag == 2)
    
        //Setting the specfic data for my instance for tabBarItem 2
        NSLog(@"Here we are in 2");
        [mediaView setContent:@"Personalized content/data for TabBarItem 2"];
    
    [viewsArray replaceObjectAtIndex:viewController.tabBarItem.tag withObject:navigationController];
    self.viewControllers = viewsArray;
    


执行此代码后,我会丢失与项目 2 或 3 的自定义标签栏相关联的图像(取决于我选择的选项)。

更新

所以,我将我的标签栏自定义方法从我的委托中移到了一个 maintabbar 类中,我在 viewdidload 上调用它,然后我隐藏了 didselectviewcontroller。这似乎解决了丢失图像的问题,但是当我单击任一软管项目时,会产生屏幕上闪烁的不良副作用。我已经尝试了从 viewdidload 方法中删除它的不同组合,但仍然没有运气..

【问题讨论】:

【参考方案1】:

据我了解,整个事情的目的是避免为两个标签栏项目创建不同的类,这两个标签栏项目将执行几乎相同的操作,但具有不同的数据。

所以首先,你必须定义一个能够做这种事情的类,我们称之为CommonClass。此类必须具有进行正确初始化的必要方法。 [我确定你已经这样做了]。

然后在你的故事板上,你仍然需要有两个ViewController 元素,每个元素都作为它对应的NavigationController 的rootViewController。

我强烈建议这样做,而不是像我们尝试的那样尝试通过代码分配新实例:Linking to a view multiple times from tabar。这两个视图控制器显然属于同一类CommonClass,因此您仍将重用该类。通过这种方式,我们不必在执行期间更改NavigationBar,这可能会很混乱。

然后,您可以为您的CommonClass 发送必要的初始化信息,在您的CommonClass 上有一个方法,该方法将根据所选的tabBarItem 加载适当的信息/数据,您可以在viewDidLoad 方法上执行此操作。

如下:

- (void)viewDidLoad

    [super viewDidLoad];
    if (self.tabBarController.selectedIndex == 1) 
        [self customizeWithData:@"Specific data for my first instance"];
     else if (self.tabBarController.selectedIndex == 2) 
        [self customizeWithData:@"Specific data for my second instance"];        
    

通过这种方式,您将只在代码的一部分中对标签栏进行自定义,并且由于您不会在执行时更改它,因此您不需要在其他部分进行自定义导致闪烁。

【讨论】:

我已经接受了您的指导并搬走了一切。我更喜欢这个设计,但不幸的是闪烁问题仍然存在。见***.com/q/19123984/2804909

以上是关于自定义 TabBar 丢失 TabBarItem 图像的主要内容,如果未能解决你的问题,请参考以下文章

iOS 自定义滑动切换TabbarItem 觉得设计丑也要做出来的UI效果。。。

自定义tabbaritem上的badeg

在iPhone中自定义TabBar

自定义TabBar

自定义tabBar

通过代码将标题/图标等设置为在 IB 中创建的 TabBarItem?