• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 自定义 UITableViewCell prepareForReuse 未按预期工作

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:12:11 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的 prepareForReuse 工作不正常。我有一个 UITableView 应该只有在表的第一部分的第一行中有一个 login UIButton。但是,当我在 prepareForReuse 中删除 login 按钮时,它会停留并进入下一批行。 (视频说明 -> http://pixori.al/8g3v)

这是我的自定义 UITableViewCell:

#import "MAGradeCell.h"

@implementation MAGradeCell

- (id)initWithStyleUITableViewCellStyle)style reuseIdentifierNSString *)reuseIdentifier cellForRowAtIndexPathNSIndexPath *)indexPath {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self; }

-(void)layoutSubviews{
    [super layoutSubviews]; }

- (void)prepareForReuse {
    self.loginButton = nil;
    [self removeFromSuperview];
    [self.loginButton removeFromSuperview];
    self.textLabel.text = nil;

    [super prepareForReuse]; }

/*
 - (void)setSelectedBOOL)selected animatedBOOL)animated  {  [super setSelected:selected animated:animated];    // Configure the view for the selected state  }*/

@end

以及设置单元格的 View Controller 部分 (cellForRowAtIndexPath)。即我把 QBFlatButton 和所有东西放在哪里:

- (MAGradeCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";
    //UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    MAGradeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


//    // Redefine layout variables in method from `viewDidLoad`
    CGFloat inset = 20; // For padding


    if (! cell) {
        cell = [[MAGradeCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier cellForRowAtIndexPath:indexPath];
    }


    // Sets up attributes of each cell
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.detailTextLabel.textColor = [UIColor whiteColor];
    QBFlatButton* loginButton = nil;

    if (indexPath.section == 0) {
        if (indexPath.row == 0) {
            [self configureHeaderCell:cell title"Grades"];

                UIView *cellView = cell.contentView;
                loginButton = [[QBFlatButton alloc] initWithFrame:CGRectMake((cellView.frame.size.width - (80 + inset)), 18, 80, (cellView.frame.size.height -(cellView.frame.size.height/2)))];
                [loginButton addTarget:self actionselector(loginButtonWasPressed)forControlEvents:UIControlEventTouchUpInside];
                loginButton.faceColor = [UIColor grayColor];
                loginButton.sideColor = [UIColor clearColor];

                loginButton.radius = 6.0;
                loginButton.margin = 4.0;
                loginButton.depth = 3.0;
                loginButton.alpha = 0.3;

                loginButton.titleLabel.font = [UIFont fontWithName"HelveticaNeue-Light" size:20];
                [loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
                [loginButton setTitle"Login" forState:UIControlStateNormal];
                [cellView addSubview:loginButton];
        } else {
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
            MAGradeClient *grade = [[MAGradeClient alloc] init];
            [self configureGradesCell:cell grade:grade];
        }
    } else if (indexPath.section == 1) {
        if (indexPath.row == 0) {
            [self configureHeaderCell:cell title"Hourly Forecast"];
        }
        else {
            // Get hourly weather and configure using method
            MACondition *weather = [MAManager sharedManager].hourlyForecast[indexPath.row - 1];
            [self configureHourlyCell:cell weather:weather];
        }
    }
    else if (indexPath.section == 2) {
        if (indexPath.row == 0) {
            [self configureHeaderCell:cell title"Daily Forecast"];
        }
        else if (indexPath.section == 2) {
            // Get daily weather and configure using method
            MACondition *weather = [MAManager sharedManager].dailyForecast[indexPath.row - 1];
            [self configureDailyCell:cell weather:weather];
        }
    }

    return cell;
}



Best Answer-推荐答案


如果你这样做:

self.loginButton = nil;

然后尝试做:

[self.loginButton removeFromSuperview];

它不起作用,因为您已经取消了引用。

考虑为该单元格使用不同的单元格标识符,因为如果您要添加和删除按钮,它并不是真正的纯重用。还考虑隐藏/显示按钮。如果要删除它,请将代码更改为:

- (void)prepareForReuse
{
    [self.loginButton removeFromSuperview];
    self.loginButton = nil;

    self.textLabel.text = nil;

    [super prepareForReuse];
}

看起来你从来没有设置过:

cell.loginButton = loginButton;

所以单元格可能没有使用的引用...

关于ios - 自定义 UITableViewCell prepareForReuse 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22607293/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap