使用viewWithTag在UITableviewCell

时间:2016-01-20 10:34:14

标签: ios objective-c uitableview viewwithtag

我真的无法理解为什么这不能正常工作。 我有一个带有动态原型的TableViewController。我在一个名为" InfoCell"的原型中放了4个标签,并给了它们约束。 如果我使用以下cellForRowAtIndexPath运行应用程序:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"InfoCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    return cell;
}

我得到的就是这个。 Everything looks fine 'til now

我这样做只是为了检查标签是否显示在正确的位置。页面应该显示2个单元格,所以一切看起来都很好。

现在,当我尝试获取对标签的引用以便更改文本时,问题就开始了。即使没有实际更改文本,如果我的代码如下所示:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"InfoCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:10];
    UILabel *surnameLabel = (UILabel *)[cell viewWithTag:20];
    UILabel *roleLabel = (UILabel *)[cell viewWithTag:30];
    UILabel *spouseNameLabel = (UILabel *)[cell viewWithTag:40];

    [cell addSubview:nameLabel];
    [cell addSubview:surnameLabel];
    [cell addSubview:roleLabel];
    [cell addSubview:spouseNameLabel];

    return cell;
}

我明白了。 Labels' positions went nuts

例如,我尝试以编程方式更改每个标签的框架,

nameLabel.frame = CGRectMake(15.0, 50.0, 120.0, 20.0)

但是它没有做任何事情,我想是因为启用了自动布局......但是我在项目中已经太远了以禁用自动布局。另外我已经看到了上面写的viewWithTag的使用,而无需以编程方式重新定位标签,所以它让我不知道那里发生了什么!

1 个答案:

答案 0 :(得分:0)

请记住,当您在任何UI对象上添加constraints时,您无法通过更改其CGRect来更改该对象的框架。实际上,您应该更改其constraint值。 现在代码中的问题是,

[cell addSubview:nameLabel];
[cell addSubview:surnameLabel];
[cell addSubview:roleLabel];
[cell addSubview:spouseNameLabel];

以上4行。在故事板中添加UILabel后,为什么要使用addSubview方法再次添加它们?删除上述4行,并在UILabel上设置文字,您已经有一个使用tag值访问的参考文献。所以你的方法应该如下所示。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *cellIdentifier = @"InfoCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

  UILabel *nameLabel = (UILabel *)[cell viewWithTag:10];
  UILabel *surnameLabel = (UILabel *)[cell viewWithTag:20];
  UILabel *roleLabel = (UILabel *)[cell viewWithTag:30];
  UILabel *spouseNameLabel = (UILabel *)[cell viewWithTag:40];

  nameLabel.text = @"";
  surnameLabel.text = @"";
  roleLabel.text = @"";
  spouseNameLabel.text = @"";

  return cell;
}