应用所选图像时 UITabBarButton 索引发生变化

Posted

技术标签:

【中文标题】应用所选图像时 UITabBarButton 索引发生变化【英文标题】:UITabBarButton index getting changed while applying selected image 【发布时间】:2019-06-24 12:48:32 【问题描述】:

目前,我在将所选图像应用于 UITabBarButton 时遇到了问题。当我这样做时,它会更改 tabBar.items 内的 UITabBarbutton 的层次结构。真的不知道为什么会这样。贴出代码-

 UIWindow *keyWindow = [[UIApplication sharedApplication]keyWindow];
 UITabBarController *tabBarController =(UITabBarController*)[keyWindow rootViewController];
 UITabBar *tabBar = tabBarController.tabBar;
 UITabBarItem *targetTabBarItem = [[tabBar items] objectAtIndex:1]; // whichever tab-item
 [targetTabBarItem setSelectedImage:image];
 [targetTabBarItem setImage:image];

我在这里做的是-

从服务器获取图像并将其应用于特定的 UItabBarbutton 图像。每当我设置它时,它都会使用 UITabbarButton 并插入到所有 UITabBarButtons 的最后一个位置。

每当图像从服务器发生变化时,它的层次结构就会像这样发生变化-

这里我们可以看到,最初按钮的顺序是Tab1、Tab2和Tab3,而在更改所选图像后,它变成了Tab1、Tab3和Tab2。表示选中的图像索引弹出并始终插入到 TabBarButtons 集合中的最后一个。如果我最初在索引 0 处更改所选图像,则顺序将是 Tab2、Tab3 和 Tab1。

所以这里的任何人都可以简要说明代码中出了什么问题? 很抱歉发了这么长的帖子,也提前致谢。

谢谢。

【问题讨论】:

【参考方案1】:

在视图调试器中显示的标签栏视图层次结构的顺序应该完全独立于保存标签栏项目数组的支持 tabBarController 的 tabBar 属性。

我的猜测是您看到视图层次结构排序的这种调整的原因是因为更改图像属性会导致它被重绘或删除/重新添加到视图层次结构中,因此它将是最后添加的项目(这根本不应该影响tabBarController.tabBar.items 的排序)

如果您只是更改标签栏项目的标题,您会看到同样的事情发生。

我设置了一个按钮来更改与您显示的代码类似的索引 1 标签栏项目图像,然后在标签中显示标签栏排序:

- (IBAction)changeTabBarImage:(id)sender 
    UIWindow *keyWindow = [[UIApplication sharedApplication]keyWindow];
    UITabBarController *tabBarController =(UITabBarController*)[keyWindow rootViewController];
    UITabBar *tabBar = tabBarController.tabBar;
    UITabBarItem *targetTabBarItem = [[tabBar items] objectAtIndex:1]; // whichever tab-item
    NSMutableString *tabBarOrder = [[NSMutableString alloc] init];
    for (NSUInteger tabBarIndex = 0; tabBarIndex < [tabBar items].count; tabBarIndex++) 
        [tabBarOrder appendString:[NSString stringWithFormat:@"index: %lu title: %@\n", tabBarIndex, [[tabBar items] objectAtIndex:tabBarIndex].title]];
    
    self.firstLabel.text = [NSString stringWithString:tabBarOrder];
    UIImage *image = [UIImage imageNamed:@"sync"];
    [targetTabBarItem setSelectedImage:image];
    [targetTabBarItem setImage:image];

唯一更改的图像是索引 1 处的选项卡栏,并且 tabBarController.tabBar.items 的顺序保持不变,即使视图调试器中的视图层次结构顺序发生了变化(如您在屏幕截图中所示)。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaViewsGuide/WorkingWithAViewHierarchy/WorkingWithAViewHierarchy.html

如果您看到不同的内容,我建议您添加一些额外的代码,因为我无法仅使用您添加的内容来重现该问题。

【讨论】:

以上是关于应用所选图像时 UITabBarButton 索引发生变化的主要内容,如果未能解决你的问题,请参考以下文章

带有动作的UITabBarButton

如何从 UITabBarButton 检索 CGRect 框架?

所选图像未显示在画布上

将所选图像从库中上传到gridview

如何使用 phonegap 应用程序获取所选图像的 URL

uitableview手动滚动时单元格图像消失