自定义 UITableViewCell prepareForReuse 未按预期工作

2024-01-29

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

这是我的习惯UITableViewCell:

#import "MAGradeCell.h"

@implementation MAGradeCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellForRowAtIndexPath:(NSIndexPath *)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)setSelected:(BOOL)selected animated:(BOOL)animated  {  [super setSelected:selected animated:animated];    // Configure the view for the selected state  }*/

@end

以及我的视图控制器设置单元格的部分(cellForRowAtIndexPath)。即我放置的地方QBFlatButton和所有:

- (MAGradeCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)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 action:@selector(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;
}

如果你这样做:

self.loginButton = nil;

然后尝试做:

[self.loginButton removeFromSuperview];

它不会工作,因为你已经清空了引用。

请考虑为此单元格使用不同的单元格标识符,因为如果您要添加和删除按钮,它实际上并不是纯粹的重用。还可以考虑隐藏/显示按钮。如果你想删除它,请将代码更改为:

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

    self.textLabel.text = nil;

    [super prepareForReuse];
}

它看起来也像你从来没有设置过:

cell.loginButton = loginButton;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 UITableViewCell prepareForReuse 未按预期工作 的相关文章

  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • Objective-C NSString for 循环与characterAtIndex

    我试图逐个字符地循环遍历 NSString 但出现 EXC BAD ACCESS 错误 您知道如何正确执行此操作吗 我已经在谷歌上搜索了几个小时但无法弄清楚 这是我的代码 m self textLength self text length
  • 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

    相关这个问题 https stackoverflow com questions 1082554 我想把数据加载放在后台 但是 我收到 库例程调用不按顺序 错误 In 这个所以线程 https stackoverflow com quest
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • UITableViewCell显示多种字体

    我想在 uitableviewcell 中以类似于 iPhone 地址簿的不同字体显示两个单词 例如 约翰Buchanan 您应该使用两个 UILable 或者您可以使用OH属性标签 https github com AliSoftware
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • iPhone:UIApplication WillResignActiveNotification 从未被调用

    我正在视图控制器中播放视频 当用户按下硬件主页按钮并且当前正在播放视频时 应用程序崩溃并显示EXC BAD ACCESS在模拟器中 我读到我应该使用applicationWillResignActive停止视频播放的消息应该可以解决崩溃问题
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • 为什么 Objective-C 允许在方法定义末尾使用分号? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 实现文件中方法名后面的分号 https stackoverflow com questions 5678360 semicolon after the method name
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • 如何为 UIImageView 随机化器实现滑动手势

    我一直在浏览大量的教程和问题 但似乎找不到我要找的东西 我有一种感觉 我只是错过了一个简单的步骤 我仍在学习诀窍 所以请承受和我一起做这个 我正在 xcode 4 3 3 上制作图像随机化器 并且我已经能够使用按钮来随机化图像 但我希望它能

随机推荐

  • 忽略来自 Google Closure 中一个文件的编译器警告

    我在一个相当大的 Closure 项目中使用外部库 Phonegap 不幸的是 Phonegap 生成了大量编译器警告 所有 危险使用 这足以让我在编译器输出中搜索有关我自己的代码的警告变得非常烦人 有没有一种方法可以仅消除一个文件中的警告
  • 每当使用除法时,C 程序中的计算结果总是为 0

    我使用两个不同的变量来除以来自的变量int and double 当我使用类似以下内容时 这些工作正常 int cost cost 40 cost cost 400 20 2 为此 该方法工作正常 我得到了正确的结果 即4 但是当我使用变量
  • 常见 C++ 优化技术列表 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 仅针对特定服务的拦截器

    我的应用程序中有多个指向不同 API URL 的服务 现在我需要为每个服务设置不同的标头 我现在的问题是关于 Angular 4 中的新拦截器 是否可以为特定服务设置一个拦截器 那么每个服务都有其特定的拦截器 希望你们能明白我的问题 TL
  • 删除填充或强制拟合或删除方形矢量资源中的空白空间以适合矩形按钮?

    我正在尝试调整all inclusive svg 图像 https material io resources icons icon all inclusive到我的矩形按钮 形状本身也是矩形 但矢量资源是正方形 24x24 形状上方和下方
  • 如何将所需的验证器添加到ajax AsyncFileUpload?

    如何将客户端所需的验证器添加到 asyncfileupload 以强制用户在提交页面之前选择文件 您还可以使用 C 或 VB 而不是客户端 Javascript 或 JQuery 函数 在服务器端方法中设置隐藏文本框的文本 protecte
  • python eval 函数中的 \r\n 与 \n

    为什么 eval 函数不能与 r n 一起使用 而可以与 n 一起使用 例如 eval for i in range 5 r n print hello 不起作用 eval for i in range 5 n print hello 有效
  • java中的package语句有什么理由应该放在开头吗?

    我从 Java 编程语言开始 我有一个简单的问题 在 java 包中 如果类是包的一部分 则 package 语句必须位于源代码文件中的第一行 位于可能存在的任何 import 语句之前 包声明应该放在开头有什么有价值的理由吗 有理由吗 当
  • 使用elasticsearch-river-mysql将数据从MySQL数据库流式传输到Elasticsearch

    我想用Elasticsearch 河 mysql https github com scharron elasticsearch river mysql以便不断地将数据从 MySQL 数据库传输到 ElasticSearch 我是 ES 和
  • 检查函数是否属于/哪个工具箱

    我们的工作站上安装了一个相对 丰富 的matlab 我现在需要发送一些代码到 并且我想检查它需要哪些工具箱才能正常工作 最简单的方法是什么 如何找出某个功能属于哪个工具箱 我看到两个问题 我要发送的函数需要哪些工具箱 你需要生成一个依赖性报
  • STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

    我正在使用 Django 1 7 将我的网站部署到生产服务器并运行时collectstatic 我收到以下错误消息 django core exceptions ImproperlyConfigured STATICFILES DIRS 设
  • 将反应本机升级到最新版本

    我有一个在react native 0 49 3 上运行的应用程序 我想升级到最新版本 v0 57 4 我应该逐步更新它吗 例如 0 49 gt 0 50 gt 0 51 等 或者我可以直接更新到最新版本吗 你建议使用react nativ
  • 委托和谓词查询

    我正在学习 lambda 并试图理解为什么 同时拥有 EmployeeFilterAge 类 如下所示 public class EmployeeFilterAge int age public EmployeeFilterAge int
  • iOS 8 Safari 打印重定向不会停止 javascript 执行

    我需要提供在成功保存时以及打印重定向到搜索页面后打印标签的能力 这适用于 chrome firefox ie iOS 6 7 safari 等 但是 当从 javascript 发出 window print 时 iOS 8 似乎不再停止
  • 运行 zipalign 时出错

    尝试在 Eclipse 中导出签名的 apk 时出现此错误 运行 zipalign 时出错 打不开 作为 zip 存档 我已运行 帮助 gt 检查更新 以确保安装了最新更新并且 SDK 工具也是最新的 我收到了同样的错误消息 让我发疯 直到
  • 从类路径中动态删除 jar

    我有一个要求 必须根据从 UI 捕获分布的分布来更改 jar 一组与另一组的分布各不相同 如果选择了某个发行版 则必须以动态 编程方式将与该发行版相关的 jar 添加到类路径中 如果选择另一个发行版 则必须动态地从类路径中删除添加到类路径的
  • 返回只出现一次的数字 (JavaScript)

    假设我有数组 1 2 3 5 2 1 4 如何让 JS 返回 3 4 5 我在这里查看了其他问题 但它们都是关于删除多次出现的数字的副本 而不是原始文件和副本 Thanks Use Array filter https developer
  • 调用 win32 API 并对类函数进行回调

    我试图通过将一些现有的 win32 UI 代码放入一个类中来清理它 以前我有一个像这样的 AppDlgProc 函数 BOOL CALLBACK AppDlgProc HWND hDlg UINT uMsg WPARAM wParam LP
  • 将 JTextField 添加到游戏菜单 (graphics2d)

    我正在开发一款多人游戏 在菜单中 我需要添加一个字段 玩家可以在其中输入主机 IP 我正在使用 Graphics2D 制作菜单 并循环更新它 JFrame screenFrame screen getFullScreenWindow whi
  • 自定义 UITableViewCell prepareForReuse 未按预期工作

    My prepareForReuse无法正常工作 我有一个UITableView那应该有一个login UIButton仅在表的第一部分的第一行中 但当 在prepareForReuse 我删除了login按钮 它会保留并进入下一批行 视频