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 来查找特定按钮或任何其他视图根本不可行,除非您对视图层次结构有非常严格的控制。如果您使用UITableViewUITableViewCell,则您没有足够的控制权,因为这些视图中的每一个都有私有子视图,它们的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 中注册触摸

UIButton 操作未在模态显示的 ViewController 上触发

子类UIButton:属性未在super.init调用时初始化

属性标题未在 xib 文件的 UIButton 中加载自定义字体