[ios]在不工作的需求上的自定义单元格的显示/隐藏按钮

发布时间: 2017/3/21 23:27:43
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想在我根据在该单元格中显示的图像的类型表中的某些细胞上显示按钮

所以,我有两个 NSMutableArray 一个持有的缩略图图像 URL 和其他控股类型的 url,如果它是图像或视频的 NSMutableArray

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

这里是我的代码

- (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:

我看到这里的不同问题。

第一次

您的代码创建新的按钮,每次用户在表中滚动。这是因为您使用 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;
}
官方微信
官方QQ群
31647020