根据需要在自定义单元格中显示/隐藏按钮不起作用

时间:2014-07-17 09:00:57

标签: ios objective-c xcode uitableview

我正在尝试在我的tableview中的某些单元格上显示一个按钮,具体取决于该单元格中显示的图像类型

soo我有两个NSMutableArray,一个拿着缩略图图片的URL,另一个NSMutableArray拿着url的类型,如果它是图像或视频

问题是按钮没有显示在所有视频类型单元格上

这是我的代码

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

TVCustom *cell = (TVCustom *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCustom" owner:self options:nil];
    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[TVCustom class]]) {
            cell = (TVCustom *) currentObject;
            break;
        }
    }
}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString *imgURL = [arrayImagesURL objectAtIndex:indexPath.row];
    NSURL *imageURL = [NSURL URLWithString:imgURL];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

    dispatch_async(dispatch_get_main_queue(), ^{
        UIImage *image = [UIImage imageWithData:imageData];
        cell.thumbImg.image = image;
    });
});

NSString *MediaType = [NSString stringWithFormat:@"%@", [arrayType objectAtIndex:indexPath.row]];

if ([MediaType isEqualToString:@"video"]) {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(120, 319, 50, 30);
    [button setTitle:@"Play" forState:UIControlStateNormal];
    button.tag = indexPath.row;
    [button addTarget:self action:@selector(PlayBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
    button.backgroundColor= [UIColor clearColor];
    [cell.contentView addSubview:button];
}

return cell;
}

我不知道我做错了什么,任何想法?

1 个答案:

答案 0 :(得分:1)

我在这看到不同的问题。

第一

每次用户在tableView中滚动时,您的代码都会创建新按钮。这是因为你使用dequeueReusableCellWithIdentifier这很好并且返回现有的单元格而不是创建新的单元格。

但是你在已经存在的细胞上添加一个新按钮(可能有也可能没有按钮)

[cell.contentView addSubview:button];

我建议您在TVCustom课程中添加按钮:

在TVCustom.h中

@property (strong, nonatomic) UIButton *viedoButton;

在TVCustom.m

- (UIButton *)videoButton
{
    if (!_videoButton) {
        _videoButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        _videoButton.frame = CGRectMake(120, 319, 50, 30);
        [_videoButton setTitle:@"Play" forState:UIControlStateNormal];
        [_videoButton addTarget:self action:@selector(PlayBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
        _videoButton.backgroundColor= [UIColor clearColor];
        [self.contentView _videoButton];
    }
    return _videoButton;
}

然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中你只做:

if ([MediaType isEqualToString:@"video"]) {
    cell.videoButton.hidden = NO;
} else {
    cell.videoButton.hidden = YES;
}

这样每个单元格只有一个按钮,只有在需要时才可见,但每次都不会重新分配。但PlayBtnClicked必须在TVCustom课程中,通过代理人调用您的viewController。

第二

您不应该使用cellForRowAtIndexPath方法处理图片的加载。将TVCustom类封装起来:

在TVCustom.h中

@property (strong, nonatomic) NSString *imgURL;

在TVCustom.m

- (void)setImgURL:(NSString *)imgURL
{
    _imgURL = imgURL;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

         NSURL *imageURL = [NSURL URLWithString:imgURL];
         NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

         dispatch_async(dispatch_get_main_queue(), ^{
             UIImage *image = [UIImage imageWithData:imageData];
             self.thumbImg.image = image;
         });
    });
 }

然后在cellForRowAtIndexPath中看起来像:

cell.imgURL = [arrayImagesURL objectAtIndex:indexPath.row];

第三

我不知道你有什么特别的理由:

if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCustom" owner:self options:nil];
    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[TVCustom class]]) {
            cell = (TVCustom *) currentObject;
            break;
        }
    }
}

但是这样做的好方法是在viewController的viewDidLoad(或其他方法)中:

NSString *identifier = @"TVCustomCell";
NSString *nibName = @"TVCustom";
UINib *cellNib = [UINib nibWithName:nibName];
[self.tableView registerNib:cellNib forCellReuseIdentifier:identifier];

您的最终代码应如下所示:

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


    static NSString *CellIdentifier = @"TVCustomCell";

    TVCustom *cell = (TVCustom *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.imgURL = [arrayImagesURL objectAtIndex:indexPath.row];

    if ([MediaType isEqualToString:@"video"]) {
        cell.videoButton.hidden = NO;
    } else {
        cell.videoButton.hidden = YES;
    }

    return cell;
}