5

我正在使用此方法添加一个UILabel到我的UITableView和它的工作正常,但我还需要创建一个方法来选择行并保存到一个临时字符串中。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                             reuseIdentifier:CellIdentifier];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)];
    [cell.contentView addSubview:label];
    label.text = [tableArr objectAtIndex:indexPath.row];
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0];
    return cell;
}

但它不工作。当我使用 cell.textLabel 但不适用于自定义标签时,它工作正常。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *lbltemp = cell1.textLabel;

    _parent.labelone.text = lbltemp.text;       
}
4

6 回答 6

11

您可以创建自己的UITableViewCell子类以允许您获取对标签的引用(并防止您在单元格上创建多个标签)。或者你可以使用这样的标签:

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

    if (cell = nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                         reuseIdentifier:CellIdentifier];

        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)];
        label.tag = 123123;
        [cell.contentView addSubview:label];
    }

    UILabel *label = (UILabel *)[cell viewWithTag:123123];
    label.text = [tableArr objectAtIndex:indexPath.row];
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *label = (UILabel *)[cell viewWithTag:123123];

    _parent.labelone.text = label.text;       
}

您的原始代码正在添加一个新标签,但随后尝试从默认标签中获取文本......它也总是创建一个新单元格并为其添加一个新标签,这非常浪费。

此外,您通常不应该在标签中存储文本,您应该真正地tableArr去获取文本。当您重用单元格或让用户编辑文本(在 a 中UITextField)时,标记方法更适合更新标签。

于 2013-06-03T17:46:59.180 回答
3

问题cell1.textLabel不在于您创建的标签。它只是单元格创建的默认标签。

解决方案可能是:

创建自定义单元格时,将标签添加到您的标签。

label.tag=100;

didSelectRow,

利用

UILabel *lbltemp=(UILabel *)[cell1.contentView viewWithTag:100];

然后_parent.labelone.text=lbltemp.text; should从该标签中获取您的文本。

于 2013-06-03T17:44:36.980 回答
3

它不起作用的原因是您没有在didSelectRowAtIndexPath. 获取自定义标签引用的最简单方法是使用标签:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    
    static NSString *CellIdentifier = @"Cell";

    // Also, this is the proper way to use reuseIdentifier (your code is incorrect)
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                             reuseIdentifier:CellIdentifier];
    }

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)];
    [cell.contentView addSubview:label];

    label.text = [tableArr objectAtIndex:indexPath.row];
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0];
    label.tag = 1;

    return cell;
}

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
    UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *customLabel = [cell viewWithTag:1];
    _parent.labelone.text = customLabel.text;       
}
于 2013-06-03T17:44:48.450 回答
0

我认为您可以使用默认标签并拒绝此解决方法,只需添加

cell.textLabel.frame = CGRectMake(10,10, 300, 30);

此外,最好让内存重用单元格,如 Wain 的回答

于 2013-06-03T18:24:06.597 回答
0

在这里 ([cell.contentView addSubview:label];_) 您正在创建自定义标签并将其作为子视图添加到单元格的内容视图,但在 UILabel *lbltemp = cell1.textLabel; 您正在尝试访问 tableview 单元格的默认标签。将一些标识符(如标签)添加到您的标签并在 didSelectRowAtIndexPath 中访问它。

于 2013-06-03T17:49:15.380 回答
0

使用 cell.indentationallevel 或 cell.indentationwidth

于 2014-05-22T08:19:50.897 回答