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 子视图没有响应更改的主要内容,如果未能解决你的问题,请参考以下文章