iPhone TableViewCell - 添加和删除条件的按钮

时间:2011-06-17 08:37:30

标签: iphone uitableview uibutton

如何正确添加/删除单元格右侧(附件视图)上的按钮?

如何向每个单元格添加目录检查条件,然后显示两种类型的单元格之一?

就我而言:ViewWillAppear使用目录名称下载XML并将其加载到TableView。每个单元格都在检查手机上是否存在该目录。如果确实如此,则单元格没有按钮(关闭),如果没有,则单元格获得按钮(打开)。 ImageViews也不同。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [uitableview dequeueReusableCellWithIdentifier:CellIdentifier];

    SomeClass *k = (SomeClass*)[self.arr_SomeClass objectAtIndex:indexPath.row];
    NSString *checkThisDir = [documents_dir stringByAppendingPathComponent:[k.dir_name stringByDeletingPathExtension]];

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

        cell.imageView.tag = 121;
        cell.imageView.contentMode = UIViewContentModeScaleAspectFit;

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    if (![[NSFileManager defaultManager] fileExistsAtPath:dir_name isDirectory:nil]) {

        cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];

        UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        bt.contentMode = UIViewContentModeScaleAspectFit;
        bt.tag = 123;
        UIImage *imgDownload = [UIImage imageNamed:@"icon_button.png"];
        [bt setImage:imgDownload forState:UIControlStateNormal];
        [bt setImage:imgDownload forState:UIControlStateHighlighted];
        [bt setImageEdgeInsets:UIEdgeInsetsMake(4,3,2,3)];
        [bt setFrame:CGRectMake(282,5,34,34)];
        [bt addTarget:self action:@selector(listButtonClick:event:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:bt];

        UIView *empty = [UIView new]; // makes space for button
        cell.accessoryView = empty;
        [empty release];
    }
    else {      

        // or: cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
        UIButton *bt = (UIButton*)[cell viewWithTag:123];
        [bt removeFromSuperview];

        UIImageView *iv = (UIImageView*)[cell viewWithTag:121];
        iv.image = [UIImage imageNamed:@"icon_off.png"];
    }
    cell.detailTextLabel.text = k.details;
    cell.textLabel.text = k.name;

    return cell;    
}

listButtonClicked只需下载文件并创建目录,然后在TableView上执行reloadDatareloadRowsAtIndexPaths

问题是,当我将列表滚动到足够高或低时,有时会有一些按钮被添加到不应该有它们的单元格中。

任何帮助都会很好,提前谢谢!

解决:

将按钮创建移至if (cell==nil) { .. }并在外面添加:

UIButton *bt = (UIButton*)[cell viewWithTag:123];
if (![[NSFileManager defaultManager] fileExistsAtPath:albumDir isDirectory:nil]) {
    cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];
    [bt setHidden:NO];
}
else {
    cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
    [bt setHidden:YES];
}

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为你要从表中出列单元格(这很好!),这样每次需要新单元格时iOS都不会重新创建它们。一旦单元格出列,它将带入您之前添加到其中的所有子视图(例如,用于另一行)。为了使整个工作正常,一旦你将一个单元格出列,你应该清理它的所有内容然后按你的意愿渲染它。

否则,更好的方法可能是在if (cell == nil)块中创建一个单元格,自动添加图像和按钮的视图,而不设置图像。传递该块后,您将使用标记([cell viewWithTag:121])和按钮([cell viewWithTag:123])获取图像,并将其设置为隐藏。从现在开始,您可以根据需要开始定义单元格。

这样,每次你请求一个单元格时,它都会有一个默认的图像和按钮,但是会隐藏,之后根据你的需要将它们设置为可见。

这应该可以解决您的问题。如果有帮助,请告诉我。