UIbutton 未在 UITableViewCell 中更新其标记值
Posted
技术标签:
【中文标题】UIbutton 未在 UITableViewCell 中更新其标记值【英文标题】:UIbutton not updating its tag value in UITableViewCell 【发布时间】:2013-04-13 06:05:30 【问题描述】:我有一个表格视图,我正在其中加载一些 UIButtons 并给它们动态标签。但是标签 = 0 没有为 UIButton 更新。我不明白哪里错了...
int i=-1;
@synthesize......
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
btnTemp = [[UIButton alloc]initWithFrame:CGRectMake(10,lblName.frame.origin.y+lblName.frame.size.height+3,17, 17)];
[btnTemp addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
btnTemp.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[btnTemp setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
btnTemp.titleLabel.font =[UIFont systemFontOfSize:14.f];
btnTemp.tag=++i;
return cell;
但是第一次进入这个方法 UIButtons 标签值没有更新为 0。
-(IBAction) btnClicked:(UIButton *) sender
UIButton *button = (UIButton *)sender;
NSLog(@"%d", [button tag]);
UIButton *btnTemp = (UIButton*)[cell viewWithTag:0]; //Here UIButton is being converted to UItableViewCell and getting error.
[buttonsinaSection addObject:btnTemp];
我哪里出错了..?
【问题讨论】:
使用indexPath.row
设置按钮标签。这对您的情况有何帮助?
【参考方案1】:
-(void) btnClicked:(UIButton *) sender
NSLog(@"%d", [sender tag]);
[buttonsinaSection addObject:sender];
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
btnTemp = [[UIButton alloc]initWithFrame:CGRectMake(10,lblName.frame.origin.y+lblName.frame.size.height+3,17, 17)];
[btnTemp addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
btnTemp.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[btnTemp setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
btnTemp.titleLabel.font =[UIFont systemFontOfSize:14.f];
btnTemp.tag=indexpath.row;
return cell;
嘿,在 btnClicked 操作中,您再次使用 ViewWithTag:0.. 因此,默认情况下,在 View 上,每个对象都将具有标签 = 0.. 因此,您将在 btnClicked 中获得按钮实例这个(UIButton *)在哪里说
【讨论】:
我把它作为 btnTemp.tag=indexpath.row; 但即使现在 indexpath.row 为 0 btnTemp 值也不是 gtng 更新为 0?我该怎么办? 曾经在 btnClicked 有一个断点,您能否粘贴我编辑过的答案的 sender.tag..【参考方案2】:tag
的默认值为 0。这意味着您的视图层次结构中的每个视图都有一个为 0 的 tag
,除非有什么改变它。这包括您的UITableView
和该表视图中的每个UITableViewCell
。因此,例如,当您在 UITableViewCell
上调用 [cell viewWithTag:0]
时,单元格将返回自身,除非您将单元格的 tag
更改为 0 以外的值。
尝试使用tag
值 0 来查找特定按钮或任何其他视图根本不可行,除非您对视图层次结构有非常严格的控制。如果您使用UITableView
或UITableViewCell
,则您没有足够的控制权,因为这些视图中的每一个都有私有子视图,它们的tag
值很可能为0。
【讨论】:
你的意思是我无法查看标签 0 的 UIbutton?如果是这种情况,我可以为 UItableViewCell 分配单独的标签值吗?因为我需要标签值为零的 UIbutton ...否则如何我可以比较它是否是 UItableViewCell 吗?【参考方案3】:当你写作时:
btnTemp.tag=++i;
对于每个单元格 btnTemp 的标记都变为 0。
所以你应该写:
btnTemp.tag=indexPath.row;
和,
UIButton *btnTemp = (UIButton*)[cell viewWithTag:0];
会报错,因为[cell viewWithTag:0]
方法不能在cellForRowAtIndexPath:
-(void) btnClicked:(UIButton *) sender
UIButton *button = (UIButton *)sender;
[buttonsinaSection addObject:button];
【讨论】:
以上是关于UIbutton 未在 UITableViewCell 中更新其标记值的主要内容,如果未能解决你的问题,请参考以下文章
UIbutton 未在 UITableViewCell 中更新其标记值
touchesBegan 和 touchesEnded 未在 UIButton 上调用
UIButton 操作未在模态显示的 ViewController 上触发