向下滚动时如何使 UIButton 在表格视图中保持选中状态
Posted
技术标签:
【中文标题】向下滚动时如何使 UIButton 在表格视图中保持选中状态【英文标题】:How to make UIButton stay selected in a tableview when scrolled down 【发布时间】:2016-07-11 05:14:14 【问题描述】:我在 cell.swift 文件中有一个按钮,上面有一个按钮,这是目标函数。
如果我选择按钮并向下滚动并返回,它会再次被取消选择。
我尝试了setSelected
的多种变体并设置为突出显示,但没有任何效果。
func selectRecipient(sender:UIButton)
if (!selectToShareButton.selected)
selectToShareButton.selected = true
selectToShareButton.setImage(UIImage(named: "checkSelected"), forState: .Selected)
else
selectToShareButton.selected = false
selectToShareButton.setImage(UIImage(named: "checkUnselected"), forState: .Normal)
【问题讨论】:
每次滚动时,您都在使单元格出列并制作新的单元格,我认为您无法实现您想要的。不过有一种方法,您可以设置使用 indexPath 选择的某些按钮。 检查这个***.com/questions/29507770/… ...它描述了一些可能对你有帮助的步骤 【参考方案1】:您应该将按钮的状态保存在数组中,并在数据源函数cellForRowAtIndexPath
中读取状态并配置您的单元格按钮。
【讨论】:
直截了当地回答 +1。但是您可以肯定地详细说明。 你能写一些代码吗?我将如何编辑我的函数? @HaasithSanka 我已经添加了一个答案来大致描述它是如何完成的。 @HaasithSanka 我可以编写一些代码,但我更喜欢自己编写代码(练习),并在遇到困难时在这里与我们联系以帮助您。【参考方案2】:这是因为表格视图重用了单元格并通过滚动不断地将其出列。因此,每次滚动时创建和销毁单元格时,所有属性都将设置为您在cellforrow
或单元格的自定义类中设置的默认值(如果可用)。
因此,您可以像这样进行管理,您可以将tag
设置为您的按钮为indexpath.row
,当您选择按钮设置一些flag
或将其标签保存在某处并将条件放入cellforrow
时,如果按钮的标签来自已保存的标签,而不是使其被选中。
【讨论】:
【参考方案3】:您应该创建一个 selectedArray 来维护按钮选择轨道
var selectedButtonsArray = [
isSelected = true
,
isSelected = false
]
-
选择按钮时在数组中添加一个对象
取消选择时从数组中删除对象
在行委托方法的单元格中根据数组显示按钮
希望对你有所帮助, 谢谢
【讨论】:
【参考方案4】:详细阐述 Hossam 的回答,
您可以创建一个布尔值数组来指示是否选择了单元格。
var selectedBoolArray = [Bool]()
您可以为您的按钮添加目标,以便在每次点击此按钮时触发一个方法:
override func viewDidLoad()
super.viewDidLoad()
/// If your button is referenced from storyboard. Or add target to each button somehow.
YourButton.addTarget(self, action: #selector(YourClass.methodToSelect(_:)), forControlEvents: .TouchUpInside)
func methodToSelect(sender: UIButton)
let index = sender.tag
selectedBoolArray[index] = true
然后在 cellforrowatindexpath 方法的单元格中,您可以将这些布尔值设置为 false 或 true,如下所示:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
if selectedBoolArray[indexPath.row]
// set you button selected, cell.button.selected = true?
YourButton.tag = self.indexPath.row
return cell
【讨论】:
可以在cell.swift中使用methodtoselect函数吗? @HaasithSanka 您的按钮是 IBOutlet 吗?肯定可以做到的。您可以添加通知观察者 不,它不是以编程方式制作的【参考方案5】:你应该管理细胞的模型:
func BtnPressed(sender: AnyObject)
var point: CGPoint = sender.convertPoint(CGPointZero, toView: self.categoryTable)
var index: NSIndexPath = self.categoryTable(forRowAtPoint: point)
var cell: UITableViewCell = self.categoryTable.cellForRowAtIndexPath(index)
category.manageCell(index.row)
self.categoryTable.reloadRowsAtIndexPaths([index], withRowAnimation: .Automatic)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
if category.indexArray.containsObject(Int(indexPath.row))
checkBtn.setImage(UIImage(named: "ic_check"), forState: .Normal)
else
checkBtn.setImage(UIImage(named: "ic_uncheck"), forState: .Normal)
return cell
func manageCell(index: Int)
// index array mutable array
if !indexArray.containsObject(Int(index))
indexArray.append(Int(index))
else
indexArray.removeAtIndex(indexArray.indexOf(Int(index)))
【讨论】:
要求快速回答以上是关于向下滚动时如何使 UIButton 在表格视图中保持选中状态的主要内容,如果未能解决你的问题,请参考以下文章
如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]