UITableViewCell 中的 UIButton 标题在重用时发生变化
Posted
技术标签:
【中文标题】UITableViewCell 中的 UIButton 标题在重用时发生变化【英文标题】:UIButton title inside UITableViewCell changes on reuse 【发布时间】:2018-01-02 14:20:30 【问题描述】:我有一个表格视图,其中包含由电话联系人和 Facebook 朋友组成的数据。如果用户是联系人,则单元格的按钮标题应为“邀请”,如果用户是 Facebook 好友,则应为“添加”。
但是,每个按钮上的标题都是错误的,并且在滚动时会交换。
这是我的模型:
struct MyContact
var name: String
var phone: String
var photoUrl: String
var isFBUser: Bool
模型数组
var myContacts = [MyContact]()
cellForRowAt
func tableView(_ tableView: UITableView, cellForRowAt indexpath: Indexpath) -> UITableviewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ContactCell
let contact = myContacts[indexPath.row]
if contact.isFBUser == true
cell.button.setTitle("Add", for: .normal)
else
cell.button.setTitle("Invite", for: .normal)
cell.contact = contact
cell.configureCell()
ContactCell.swift
func configureCell()
if contact.isFBUser == true
button.setTitle("Add", for: .normal)
else
button.setTitle("Invite", for: .normal)
我什至尝试在 prepareForReuse 上将按钮标题设置为 nil
override func prepareForReuse()
super.prepareForReuse
button.setTitle(nil, for: .normal)
【问题讨论】:
您的代码似乎是正确的,但您能确定一下CellForRowAtIndex
吗?在调用configureCell()
之前,您是否在单元格上设置了contact
?还有,按钮是怎么创建的?
我已经更新了我的代码。
如果您正在传递一个联系人对象并且您正在调用configureCell()
,那么您不需要制作if contact.isFBUser == true button.setTitle("Add", for: .normal) else button.setTitle("Invite", for: .normal)
dequeueCell 代码?没有“myCell.contact = someArray[indexpath.row]”?你的方法没有返回单元格?
我再次更新了我的代码,对不起。
【参考方案1】:
Cell 对象被重用,因此当您将它们出列时需要继续设置它们的联系属性(或将其传递给configureCell()
)
【讨论】:
如果您不介意,可以举个例子吗?我很困惑,因为我认为我在 cellForRowAt 中的代码已经在这样做了?无时无刻不在设置属性。以上是关于UITableViewCell 中的 UIButton 标题在重用时发生变化的主要内容,如果未能解决你的问题,请参考以下文章
更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象
确定 UITableViewCell 中的 UIButton
UITableViewCell 事件中的 UIButton 不起作用