UIView 子视图没有响应更改

Posted

技术标签:

【中文标题】UIView 子视图没有响应更改【英文标题】:UIView subview not responding to changes 【发布时间】:2011-03-10 19:23:25 【问题描述】:

我正在学习如何处理子视图,但我很难操纵其中一个的位置。每个子视图都有一个唯一的标签。值得注意的是,我在 UITableCell 中搜索子视图,UITableView 大约有 5 行。

如果我这样做:

UIView *mike = [self.view viewWithTag:6];
mike.frame = CGRectMake(250, 5, 25, 20);
mike.backgroundColor = [UIColor redColor];
NSLog(@"mike=%@ tag=%d",[[mike class] description], [mike tag]);

或:

UILabel *label = (UILabel *)[self.view viewWithTag:6];
label.frame = CGRectMake(250, 5, 25, 20);
label.backgroundColor = [UIColor redColor];
NSLog(@"label=%@ tag=%d",[label text], [label tag]);

子视图不会改变位置,但是如果我使用下面的代码搜索它,它确实可以工作。

for (UIView *subview0 in [self.view subviews])

  for (UIView *subview1 in [subview0 subviews])
  
    for (UIView *subview2 in [subview1 subviews])
    
      if ([[[subview2 class] description] isEqualToString: @"UILabel"]) 
      
        [subview2 setText:@"mike"];
        subview2.frame = CGRectMake(250, 5, 25, 20);
        subview2.backgroundColor = [UIColor redColor];
      
    
   
 

非常感谢任何帮助。

迈克

编辑:从控制台执行

2011-03-10 19:53:42.344 mike=UILabel 标签=6 0x4b59610 2011-03-10 19:53:42.344 标签=842 标签=6 0x4b59610 2011-03-10 19:53:42.345 0-subview=PerformAnalysisCustomCell 标签=0 2011-03-10 19:53:42.345 1-subview=UIGroupTableViewCellBackground 标签=0 2011-03-10 19:53:42.346 2-subview=UIView 标签=0 0x4d62910 2011-03-10 19:53:42.349 1-subview=UITableViewCellContentView 标签=0 2011-03-10 19:53:42.349 2-subview=UILabel 标签=0 0x4b51320 2011-03-10 19:53:42.350 2-subview=UILabel 标签=1 0x4b59290 2011-03-10 19:53:42.350 2-subview=UILabel 标签=2 0x4b59370 2011-03-10 19:53:42.358 2-subview=UILabel 标签=3 0x4b59410 2011-03-10 19:53:42.359 2-subview=UILabel 标签=4 0x4b594b0 2011-03-10 19:53:42.360 2-subview=UILabel 标签=5 0x4b59560 2011-03-10 19:53:42.360 2-subview=UILabel 标签=6 0x4b59610

将 %p 放入 NSLog 后,内存地址地址就可以相同了。其他 tag=6 行具有不同的地址,因此我应该期望至少该单元格会移动。

【问题讨论】:

self.view是tableView吗?标签是否在所有表格单元格中都是唯一的?你在哪里为你的标签设置标签? 是的。每个标签对于单元格都是唯一的,但不是整个表格,因为表格单元格是重复的。我在 IB 中设置标签。 啊...那么您只需要在 1 个单元格上执行 viewWithTag,而不是在整个 tableView 上。如果你在 tableView 上执行 viewWithTag,你只会得到它遇到的那个标签的第一个实例。 【参考方案1】:

您需要在每个单元格上运行 viewWithTag 语句,而不是在整个 tableView 上。这很可能应该在 cellForRowAtIndexPath 中设置,然后您会在需要时重新加载更改的行。

【讨论】:

【参考方案2】:

我更喜欢继承 UITableViewCell,然后我可以通过属性访问我想要的内容。我不喜欢 -viewWithTag:,它之前给我带来了问题,并且让代码难以管理。

【讨论】:

【参考方案3】:

您的前两个示例做了完全相同的事情。在这种情况下,静态类型(UIView* 与 UILabel*)不会更改编译器生成的代码。

第三个例子应该 NSLog 它操作的每个视图。可能标签没有设置。

检查if (subview2.tag == 6) 之类的东西也很有意义,看看是否有多个视图具有相同的标签(听起来好像有)。

您的日志消息还可以打印视图描述(或仅以“%p”格式显示视图的地址)以查看您使用的视图是否相同。

【讨论】:

谢谢!我在上面添加了一些输出,您可以在其中看到地址,并且它至少有一个子视图显示为相同的地址。因此,这应该改变 - 不应该吗? 至少有一个子视图具有相同的地址,但它可能不是您看到更改的子视图之一。您最初断言“每个子视图都有一个唯一的标签”对于您正在调用的视图是错误的 -viewWithTag: on (您是在表格视图而不是单元格上调用它吗?)。

以上是关于UIView 子视图没有响应更改的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 作为子视图没有响应

在uiview中加载xib但没有响应

带有按钮的 iOS 子视图不响应触摸。

让超出父视图范围的子视图响应事件,在UIView范围外响应点击

UIview 在调用视图控制器时没有响应

作为 UIWindow 子视图添加的 UIView 不响应点击