为啥我不能使用 StoryBoard 从 viewWithTag 方法访问嵌套的 UIView?

Posted

技术标签:

【中文标题】为啥我不能使用 StoryBoard 从 viewWithTag 方法访问嵌套的 UIView?【英文标题】:Why can't I access to nested UIView from viewWithTag method using StoryBoard?为什么我不能使用 StoryBoard 从 viewWithTag 方法访问嵌套的 UIView? 【发布时间】:2015-04-30 18:09:29 【问题描述】:

我在 Storyboard 的嵌套 UIView 中创建了一些 UIImageView,并为每个 UIImageView 创建了不同的 TAG。根据 Storyboard,ViewController 的树是这样的:

视图控制器 查看 视图嵌套 UIImageView1 UIImageView1 UIImageView1 UIImageView1

我必须以编程方式更改这些 ImageView,为了获取图像,我使用方法 viewWithTag,但它不起作用,因为它返回 NIL。 即使我将ViewNested IBOutlet 添加到我的班级并使用以下代码获取视图,也会发生这种情况:

// View is the top View with Tag:40            
UIView * view = [self.view viewWithTag:40]; //This works
// The nestedView with Tag:44          
UIView * viewNested = [view viewWithTag:44]; //DOESN'T work it returns NIL even if the TAG is exact

然后,如果我尝试使用相同的方法访问 imageView,当然会返回NIL。我不知道为什么,我也尝试使用此代码查看所有递归嵌套视图,但即使它们存在于情节提要中,它们似乎也不存在。

- (void)showAllSubView:(UIView *)view
   int i = 0;
    for (UIView * subView in [view subviews]) 
        NSLog(@"%@, tag:%ld", subView, (long)subView.tag) ;
        [self showAllSubView:subView] ;
        i++;
    
    NSLog(@"Numb of Views %d", i) ;


根视图的 TAGS 为 40,嵌套视图为 44,图像为 1,2,3,4。所以 TAGS 都是不同的。

任何帮助将不胜感激:)。提前致谢

【问题讨论】:

更新您的问题并显示层次结构中每个视图的标签。 为什么不使用 IBOutlet? 如果showAllSubView 说它们不是viewNested 的子视图,是什么让你认为它们应该是? 要查看实际情况,请在您确定所有视图都已加载的代码中的某处插入断点,然后在调试区域控制台中运行此命令:po [self.view recursiveDescription]。它将打印完整的视图层次结构,包括标签。 @OMGHaveFun 因为我有 18 个 UIImageView,所以我会通过 TAG 而不是 IBOutlet 访问它们 【参考方案1】:
UIImageView *imageView=(UIImageView *)[self.view viewWithTag:yourTag];
[imageView setImage:[UIImage imageNamed:@"yourImageName"]];

将 yourTag 替换为 UIImageView 标签; 用一些图像名称替换 yourImageName

如果您只想更改 ImageViews 的图像 - 您不需要

UIView * view = [self.view viewWithTag:40]; //This works
// The nestedView with Tag:44          
UIView * viewNested = [view viewWithTag:44];

您还可以更改所有图像:

for (int i=0; i<18; i++)
    
            UIImageView *imageView=(UIImageView *)[self.view viewWithTag:i];
NSString *imageName = [NSString stringWithFormat:@"imageName_%d", i];
    [imageView setImage:[UIImage imageNamed:imageName]];
    

【讨论】:

以上是关于为啥我不能使用 StoryBoard 从 viewWithTag 方法访问嵌套的 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从另一个控制器中删除视图?

为啥我不能从情节提要的表格单元格中删除标签?

为啥我不能将 UIView 分配给 self.view?

在Storyboard中,如何让view从状态栏顶部开始布局

iOS最牛逼得自定义View方式支持storyboard显示

IOS / Storyboard:使用Autolayout在一个故事板中复制和粘贴View Controller是否安全