自定义 TableViewCell 按钮应该切换特定行的活动状态和图标,但它也会更改其他不相关行的图标
Custom TableViewCell Button should toggle active status and icon of a specific row, but it also changes the icon of other unrelated rows
我需要在包含自定义对象的tableView
中切换每个对象状态(active/inactive):我只想显示活动对象在那个 tableView
中,所以当一个对象的状态变为 inactive 时,它就会从列表中消失。
该应用正在运行(创建新的自定义对象,在 tableView
中显示它们,在 detailView 中查看和编辑它们的内容 - 包括 active/inactive 状态...);如果相关,请考虑 我的项目使用核心数据 并且我使用它的方法来填充 tableView
.
我还需要 tableView
单元格的自定义设计,我已经实现了(我有 UITableViewCell
的 子类和显示所需内容的自定义单元格) 这似乎也有效,但这是我第一次使用自定义单元格,我一定做错了什么......
当我点击单元格中的活动-非活动按钮以更改自定义对象状态时(并使其从列表中消失,因为它已变为非活动状态),我实际上得到了我想要的那个对象(它的状态改变并且对象从列表中消失)。
我的问题是我还看到其他几行的 UIButton
图像(当对象处于活动状态或非活动状态时显示两个不同的图标)变为非活动图标. 通常所有行的按钮图像,除了我刚刚点击的那一个已经消失了,应该是活动的。
请注意,对于这些其他行,只有图标是错误的,对于我未点击的每一行,实际状态仍然有效:如果我停止应用程序并且 运行 又一次,启动时图标没问题,在 tableView
中我只看到仍处于活动状态的对象。
我很确定我的问题与`dequeueReusableCellWithIdentifier 有关,但我不知道如何解决该问题。
以下是我的一些方法:
// TableViewController
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as MyCustomTableViewCell
self.configureCell(cell, atIndexPath: indexPath)
return cell
}
func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {
let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject
cell.customLabel.text = aObject.name
cell.detailLabel.text = aObject.anotherProperty
//...
cell.objectToMarkAsInactive = aObject
}
// MyCustomTableViewCell
//... IBOutlets
var objectToMarkAsInactive : CustomObject?
@IBAction func markObjectAsInactive(sender: AnyObject) {
activeButton.selected = !activeButton.selected
objectToMarkAsInactive?.active = !(objectToMarkAsInactive?.active as Bool)
saveContext()
}
override func awakeFromNib() {
super.awakeFromNib()
// UIImage vars
activeButton.setImage(activeImage, forState: UIControlState.Selected)
activeButton.setImage(inactiveImage, forState: UIControlState.Normal)
activeButton.setImage(highlightedImage, forState: UIControlState.Highlighted)
}
我也尝试在保存上下文后重新加载 tableView
,但其他行上的图标问题仍然存在。
显然,我设置 TableViewController 的单元格 objectToMarkAsInactive = aObject in configureCell
的自定义 属性 的解决方案不正确,因为单元格被重复使用,但我没有其他想法来完成我的工作想要,因为单元格的状态更改按钮必须作为 IBAction 连接到 MyCustomTableViewCell 而不是 TableViewController。
我是编程的新手,我的问题可能是由于我的错误决定造成的,但我真的可以使用一些建议,我被卡住了...
我应该停止使用 dequeueReusableCellWithIdentifier
吗?我不喜欢它,因为我可能有大量的对象,但是如果我必须使用普通单元格,我可以在没有双端队列的情况下为它们定制设计吗? "regular" 单元实例化方法在枚举 (UITableViewCellStyle.
) 中仅显示普通单元的几个选项,而不是自定义单元。
提前致谢,
@cdf1982
您无需停止使用 dequeueReusableCellWithIdentifier
。问题是单元格被重复使用,但如果只是按钮的图像不正确,请添加一个检查以查看需要显示哪个图像。
func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {
let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject
cell.customLabel.text = aObject.name
cell.detailLabel.text = aObject.anotherProperty
//...
if aObject.isActive { // set button to active }
else { // set button to inactive }
cell.objectToMarkAsInactive = aObject
}
我需要在包含自定义对象的tableView
中切换每个对象状态(active/inactive):我只想显示活动对象在那个 tableView
中,所以当一个对象的状态变为 inactive 时,它就会从列表中消失。
该应用正在运行(创建新的自定义对象,在 tableView
中显示它们,在 detailView 中查看和编辑它们的内容 - 包括 active/inactive 状态...);如果相关,请考虑 我的项目使用核心数据 并且我使用它的方法来填充 tableView
.
我还需要 tableView
单元格的自定义设计,我已经实现了(我有 UITableViewCell
的 子类和显示所需内容的自定义单元格) 这似乎也有效,但这是我第一次使用自定义单元格,我一定做错了什么......
当我点击单元格中的活动-非活动按钮以更改自定义对象状态时(并使其从列表中消失,因为它已变为非活动状态),我实际上得到了我想要的那个对象(它的状态改变并且对象从列表中消失)。
我的问题是我还看到其他几行的 UIButton
图像(当对象处于活动状态或非活动状态时显示两个不同的图标)变为非活动图标. 通常所有行的按钮图像,除了我刚刚点击的那一个已经消失了,应该是活动的。
请注意,对于这些其他行,只有图标是错误的,对于我未点击的每一行,实际状态仍然有效:如果我停止应用程序并且 运行 又一次,启动时图标没问题,在 tableView
中我只看到仍处于活动状态的对象。
我很确定我的问题与`dequeueReusableCellWithIdentifier 有关,但我不知道如何解决该问题。
以下是我的一些方法:
// TableViewController
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as MyCustomTableViewCell
self.configureCell(cell, atIndexPath: indexPath)
return cell
}
func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {
let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject
cell.customLabel.text = aObject.name
cell.detailLabel.text = aObject.anotherProperty
//...
cell.objectToMarkAsInactive = aObject
}
// MyCustomTableViewCell
//... IBOutlets
var objectToMarkAsInactive : CustomObject?
@IBAction func markObjectAsInactive(sender: AnyObject) {
activeButton.selected = !activeButton.selected
objectToMarkAsInactive?.active = !(objectToMarkAsInactive?.active as Bool)
saveContext()
}
override func awakeFromNib() {
super.awakeFromNib()
// UIImage vars
activeButton.setImage(activeImage, forState: UIControlState.Selected)
activeButton.setImage(inactiveImage, forState: UIControlState.Normal)
activeButton.setImage(highlightedImage, forState: UIControlState.Highlighted)
}
我也尝试在保存上下文后重新加载 tableView
,但其他行上的图标问题仍然存在。
显然,我设置 TableViewController 的单元格 objectToMarkAsInactive = aObject in configureCell
的自定义 属性 的解决方案不正确,因为单元格被重复使用,但我没有其他想法来完成我的工作想要,因为单元格的状态更改按钮必须作为 IBAction 连接到 MyCustomTableViewCell 而不是 TableViewController。
我是编程的新手,我的问题可能是由于我的错误决定造成的,但我真的可以使用一些建议,我被卡住了...
我应该停止使用 dequeueReusableCellWithIdentifier
吗?我不喜欢它,因为我可能有大量的对象,但是如果我必须使用普通单元格,我可以在没有双端队列的情况下为它们定制设计吗? "regular" 单元实例化方法在枚举 (UITableViewCellStyle.
) 中仅显示普通单元的几个选项,而不是自定义单元。
提前致谢,
@cdf1982
您无需停止使用 dequeueReusableCellWithIdentifier
。问题是单元格被重复使用,但如果只是按钮的图像不正确,请添加一个检查以查看需要显示哪个图像。
func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {
let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject
cell.customLabel.text = aObject.name
cell.detailLabel.text = aObject.anotherProperty
//...
if aObject.isActive { // set button to active }
else { // set button to inactive }
cell.objectToMarkAsInactive = aObject
}