使用 viewWithTag 获取 UITableviewCell 内的标签时约束不起作用
Constraints not working when using viewWithTag to get labels inside UITableviewCell
我真的不明白为什么这不能正常工作。
我有一个带有动态原型的 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 的使用不需要以编程方式重新定位标签,所以我不知道那里到底发生了什么,这让我很烦恼!
请记住,当您在任何 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;
}
我真的不明白为什么这不能正常工作。 我有一个带有动态原型的 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 的使用不需要以编程方式重新定位标签,所以我不知道那里到底发生了什么,这让我很烦恼!
请记住,当您在任何 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;
}