我正在学习如何处理子视图,而且我很难操纵其中一个的位置。每个子视图都有一个唯一的标记。值得注意的是,我在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 tag = 6 0x4b59610
2011-03-10 19:53:42.344 label = 842 tag = 6 0x4b59610
2011-03-10 19:53:42.345 0-subview = PerformAnalysisCustomCell tag = 0
2011-03-10 19:53:42.345 1-subview = UIGroupTableViewCellBackground tag = 0
2011-03-10 19:53:42.346 2-subview = UIView tag = 0 0x4d62910
2011-03-10 19:53:42.349 1-subview = UITableViewCellContentView tag = 0
2011-03-10 19:53:42.349 2-subview = UILabel tag = 0 0x4b51320
2011-03-10 19:53:42.350 2-subview = UILabel tag = 1 0x4b59290
2011-03-10 19:53:42.350 2-subview = UILabel tag = 2 0x4b59370
2011-03-10 19:53:42.358 2-subview = UILabel tag = 3 0x4b59410
2011-03-10 19:53:42.359 2-subview = UILabel tag = 4 0x4b594b0
2011-03-10 19:53:42.360 2-subview = UILabel tag = 5 0x4b59560
2011-03-10 19:53:42.360 2-subview = UILabel tag = 6 0x4b59610
将%p放入NSLog后,您可以将内存地址相同。其他tag = 6行有不同的地址,所以我应该期望至少该单元格移动。
答案 0 :(得分:0)
我更喜欢子类UITableViewCell,然后我可以通过属性访问我想要的内容。我不喜欢 -viewWithTag:,它之前给我带来了问题,并且使代码难以管理。
答案 1 :(得分:0)
你的前两个例子完全相同。静态类型(UIView * vs UILabel *)不会更改编译器在这种情况下生成的代码。
第三个例子应该是NSLog操作的每个视图。也许标签没有设置。
使用if (subview2.tag == 6)
之类的内容进行检查也是有意义的,看看是否有多个具有相同标签的视图(听起来像是这样)。
您的日志消息还可以打印视图描述(或简单地以“%p”格式显示视图的地址),以查看您使用的视图是否相同。
答案 2 :(得分:0)
您需要在每个单元格上运行viewWithTag语句,而不是在整个tableView上运行。这应该很可能在cellForRowAtIndexPath中设置,然后您将在需要时重新加载已更改的行。