Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 选择自定义构建的UITableViewCell时UILabel文本的错误行为:文本与以前加载的标签混合或重叠_Iphone_Uitableview_Text_Uilabel - Fatal编程技术网

Iphone 选择自定义构建的UITableViewCell时UILabel文本的错误行为:文本与以前加载的标签混合或重叠

Iphone 选择自定义构建的UITableViewCell时UILabel文本的错误行为:文本与以前加载的标签混合或重叠,iphone,uitableview,text,uilabel,Iphone,Uitableview,Text,Uilabel,几天来我一直在寻找解决这个问题的方法。。。找不到有类似问题或解决方案的人。在这一点上,我甚至不确定我是否做错了什么,因为我已经阅读并分析了许多示例代码,我几乎100%确定我是按照应该的方式来做的 无论如何,它来了: 我有一个UITableView,可以在其中显示自定义构建的UITableViewCell,这里是我创建它们的地方: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexP

几天来我一直在寻找解决这个问题的方法。。。找不到有类似问题或解决方案的人。在这一点上,我甚至不确定我是否做错了什么,因为我已经阅读并分析了许多示例代码,我几乎100%确定我是按照应该的方式来做的

无论如何,它来了:

我有一个UITableView,可以在其中显示自定义构建的UITableViewCell,这里是我创建它们的地方:

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

    NSDictionary *myDictionary = [myArray objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView
                 dequeueReusableCellWithIdentifier:CellIdentifier];  

    if (cell == nil)
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                               reuseIdentifier: CellIdentifier] autorelease];


    CGRect textViewRect = CGRectMake(10.0, 0.0, 250, 25);
    UILabel *textView = [[UILabel alloc] initWithFrame:textViewRect];

    textView.text = [myDictionary objectForKey:@"name"];
    textView.font = [UIFont systemFontOfSize:12.0];
    textView.textColor = [UIColor blackColor];
    textView.highlightedTextColor = [UIColor whiteColor];
    textView.textAlignment = UITextAlignmentRight;

    [cell.contentView addSubview:textView];
    [textView release];


    CGRect imageRect = CGRectMake(270.0, 15, 16, 16);
    UIImageView *icon = [[UIImageView alloc] initWithFrame:imageRect];

    icon.image = [myDictionary objectForKey:@"color-icon"];
    icon.highlightedImage = [myDictionary objectForKey:@"gray-icon"];

    [cell.contentView addSubview:icon];
    [icon release];
}
如你所见,相当标准的东西。。。然后,当我单击其中一个单元格时,会加载另一个视图而不是表。 直到现在,一切都很好,但当我回到那个表视图,它必须重新加载时,问题开始了

顺便说一下,我已将其添加到委托方法中,因此单元格永远不会保持选中状态:

- (void)tableView:(UITableView *)tableView
                 didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // [...] a lot more code here 
}
当我在模拟器中用鼠标点击我的单元格并将其按住时,该单元格将按预期保持选中状态(与设备本身的方式相同),这就是我得到以下结果的原因:

[图1]

UILabel文本完全混淆了!屏幕截图实际上是表格最后一个单元格的截图,重叠文本是第一个单元格的截图。第一个单元格的行为是相似的,如果我保持单击,它将显示与最后一个单元格的UILabel文本混合的相同行为。我猜这是由于
dequeueReusableCellWithIdentifier
的工作方式(可能是FILA队列)

当然,我试着解决这个问题,发现了一些非常奇怪的东西

如果我没有单击,则单元格是完美的,没有错误,显示正确的文本等:

[图2]

然后我试图把UILabel的参数搞得一团糟。我补充说:

textView.backgroundColor = [UIColor clearColor];
当我这样做时,一旦表格重新加载,我甚至不需要突出显示单元格来查看出错行为:

[图3]

我要解决这个问题的唯一方法是总是实例化一个新的单元,而不是将其退出队列

UITableViewCell *cell = [tableView
                 dequeueReusableCellWithIdentifier:CellIdentifier];   
if (cell == nil)
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                               reuseIdentifier: CellIdentifier] autorelease];
替换为:

UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                               reuseIdentifier: CellIdentifier] autorelease];
但当然,由于内存泄漏,这不会长期起作用

另外,需要注意的是,我在这个应用程序的某个地方的另一个视图中的另一个UITableView有完全相同的行为。。。另一个自定义单元格更复杂,有更多标签、更多图像等,但所有标签都显示相同的行为。这个更复杂的表视图由导航控制器管理,因此没有像第一个那样的自定义加载/卸载

这就是我所有的,我找不到解决办法。。。请帮忙

啊,这真的很烦人。。。我是新来的,所以我不能发布图片…:( 以下是一个链接,您可以在其中查看引用的图像:


Alex

问题在于,每次重复使用单元格时,您都会创建新标签并将其添加到单元格中。要解决此问题,您必须仅在创建单元格时创建标签:

if (cell == nil){
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                               reuseIdentifier: CellIdentifier] autorelease];

    CGRect textViewRect = CGRectMake(10.0, 0.0, 250, 25);
    UILabel *textView = [[UILabel alloc] initWithFrame:textViewRect];
    textView.tag = kLabelTag;
    textView.font = [UIFont systemFontOfSize:12.0];
    textView.textColor = [UIColor blackColor];
    textView.highlightedTextColor = [UIColor whiteColor];
    textView.textAlignment = UITextAlignmentRight;

    [cell.contentView addSubview:textView];
    [textView release];


    CGRect imageRect = CGRectMake(270.0, 15, 16, 16);
    UIImageView *icon = [[UIImageView alloc] initWithFrame:imageRect];

    icon.image = [myDictionary objectForKey:@"color-icon"];
    icon.highlightedImage = [myDictionary objectForKey:@"gray-icon"];

    [cell.contentView addSubview:icon];
    [icon release];
}
然后,您可以使用指定的标记属性从单元格中获取标签:

UILabel *textView = (UILabel*)[cell.contentView viewWithTag:kLabelTag];
textView.text = [myDictionary objectForKey:@"name"];
如果图标imageview在不同的单元格中有所不同,则同样的逻辑也适用于设置图标imageview


还可以查看标准UITableViewCell已经提供的组件(取决于其单元格样式)-那里已经有UIImageView和UILabels,您可以为它们设置自定义属性并使用它们,而无需创建额外的组件

谢谢您这么快的回复,但这对我来说真的不起作用。我添加了标签,并尝试从视图中检索标签(如果它重用以前的单元格)。有些单元格似乎可以工作好的,但是其他的有“黑屏”标签。和桌子周围的玩家将很快给出一个带有“消息发送到解除分配的实例0x69210c0”的SegF.这听起来很正常,因为我正在发布所有标签…但我是iOS开发的新手…所以我肯定错过了一些东西如何哇…好的,找到了pb,我不知道我怎么错过了…你是对的Vladimir,对不起我的误解。我甚至不需要使用标签,我从来没有意识到我不应该这么做每次重新创建单元格。标识符足够聪明,可以知道它是正确的单元格,而不是相同的“单元格类型”。如果cell==nil,我基本上只应该创建一次子视图,就这样。感谢您的帮助!现在更有意义了:)