将 NIB 注册为自定义 tableviewcell 无法正确显示 - *有时*
Registered NIB as custom tableviewcell not displaying properly - *sometimes*
我很确定我所看到的是单元格出队和重用的某种问题,但这在上下文中确实没有意义,因为它只是有时,仅在某些手机上,并且似乎只具体影响视图的背景颜色。
我有一个显示自定义 class tableviewcell 的常规旧 tableview 我在编辑器中为其创建了一个 xib(基本上只是一些标签、按钮和彩色子视图,但它更容易在编辑器中比在代码中直观地布置约束)。注册nib,使用cellForRowAtIndexPath
中的dequeueReusableCellWithIdentifier
,一切正常,完全符合预期。我以前做过很多次。
也就是说,直到我 运行 它在一个旧的 iPhone 5s 上我已经闲置了 (运行ning iOS 13,但我的应用程序是以 12 为目标只是为了安全起见)- 现在,大部分时间 ,根据 cellForRowAtIndexPath 中的代码,单元格子视图之一的背景颜色不会改变- 它显示的是笔尖的颜色。但是 cellForRowAtIndexPath 运行s 中的其他所有内容都很好 - 标签的文本已更改,我的 print()
s 甚至显示正确的 If 分支正在执行以更改背景颜色。
我很想相信有一些关于更改颜色的特定内容挂在某个地方(关于较旧的显示器,或者比我的其他测试设备更旧的 iOS 版本?),但事实证明,如果你反弹- 滚动让单元格离开视野一秒钟,当它回来时一切都是正确的颜色。某种内存缓存?
This blog post from Medium(当然,已经有四岁了)谈到当您使用 tableviewcells 走 dequeue/reuse 路线时,有时图像可能无法正确更新,这听起来确实很相似(在至少,比任何其他 Google 结果更相似)正在发生的事情。我怀疑我需要为我的自定义单元格 class 重写 prepareForReuse
方法,但我不知道我需要在那里放什么(真的,单元格根本不应该被重用,对吧?它最初在第一次加载时显示错误的内容)。博客 post 基本上只是将需要重新完成的图像设置为 nil
,但是当我在我的背景颜色子视图上尝试时,这会给我带来错误(正如预期的那样,典型的“找不到对象”错误,因为我正在尝试设置 nil 对象的背景颜色)。
有什么想法吗?我是否必须进入每个 cellForRowAtIndexPath 并以编程方式从头开始构建我的单元格?但是,这不会消除从 nibs/xibs 制作细胞的全部意义吗?看在上帝的份上,为什么只在我年长的 iPhone 上?
呃,想通了。首先(显然也是最重要的),我使用的 iPhone 5s 实际上是 运行 iOS 12.4.8,而不是我想的 13.*。
https://developer.apple.com/forums/thread/649009
事实证明 iOS 12 中存在一个错误,如果您在 xib 中的 UIView 上设置了背景颜色,iOS 会将其设置为背景颜色 甚至在之后,它在其他地方以编程方式设置(比如在CellForRowAt
函数中)。
要修复它,您必须确保编辑器中的背景颜色设置为 'Default',然后您在诸如 awakeFromNib
之类的东西中实现您的“起始”或默认背景会工作得很好。
我很确定我所看到的是单元格出队和重用的某种问题,但这在上下文中确实没有意义,因为它只是有时,仅在某些手机上,并且似乎只具体影响视图的背景颜色。
我有一个显示自定义 class tableviewcell 的常规旧 tableview 我在编辑器中为其创建了一个 xib(基本上只是一些标签、按钮和彩色子视图,但它更容易在编辑器中比在代码中直观地布置约束)。注册nib,使用cellForRowAtIndexPath
中的dequeueReusableCellWithIdentifier
,一切正常,完全符合预期。我以前做过很多次。
也就是说,直到我 运行 它在一个旧的 iPhone 5s 上我已经闲置了 (运行ning iOS 13,但我的应用程序是以 12 为目标只是为了安全起见)- 现在,大部分时间 ,根据 cellForRowAtIndexPath 中的代码,单元格子视图之一的背景颜色不会改变- 它显示的是笔尖的颜色。但是 cellForRowAtIndexPath 运行s 中的其他所有内容都很好 - 标签的文本已更改,我的 print()
s 甚至显示正确的 If 分支正在执行以更改背景颜色。
我很想相信有一些关于更改颜色的特定内容挂在某个地方(关于较旧的显示器,或者比我的其他测试设备更旧的 iOS 版本?),但事实证明,如果你反弹- 滚动让单元格离开视野一秒钟,当它回来时一切都是正确的颜色。某种内存缓存?
This blog post from Medium(当然,已经有四岁了)谈到当您使用 tableviewcells 走 dequeue/reuse 路线时,有时图像可能无法正确更新,这听起来确实很相似(在至少,比任何其他 Google 结果更相似)正在发生的事情。我怀疑我需要为我的自定义单元格 class 重写 prepareForReuse
方法,但我不知道我需要在那里放什么(真的,单元格根本不应该被重用,对吧?它最初在第一次加载时显示错误的内容)。博客 post 基本上只是将需要重新完成的图像设置为 nil
,但是当我在我的背景颜色子视图上尝试时,这会给我带来错误(正如预期的那样,典型的“找不到对象”错误,因为我正在尝试设置 nil 对象的背景颜色)。
有什么想法吗?我是否必须进入每个 cellForRowAtIndexPath 并以编程方式从头开始构建我的单元格?但是,这不会消除从 nibs/xibs 制作细胞的全部意义吗?看在上帝的份上,为什么只在我年长的 iPhone 上?
呃,想通了。首先(显然也是最重要的),我使用的 iPhone 5s 实际上是 运行 iOS 12.4.8,而不是我想的 13.*。
https://developer.apple.com/forums/thread/649009
事实证明 iOS 12 中存在一个错误,如果您在 xib 中的 UIView 上设置了背景颜色,iOS 会将其设置为背景颜色 甚至在之后,它在其他地方以编程方式设置(比如在CellForRowAt
函数中)。
要修复它,您必须确保编辑器中的背景颜色设置为 'Default',然后您在诸如 awakeFromNib
之类的东西中实现您的“起始”或默认背景会工作得很好。