我在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)
}
}
答案 0 :(得分:5)
您应该将按钮的状态保存在数组中,并在数据源函数cellForRowAtIndexPath
中读取状态并配置单元格按钮。
答案 1 :(得分:1)
这是因为表视图重用单元格并使用滚动连续出列。因此,每次滚动时单元格都会被创建和销毁,因此所有属性都将设置为默认值,您将在cellforrow
或单元格的自定义类(如果可用)中进行设置。
所以,您可以管理类似的内容,您可以将tag
设置为按钮indexpath.row
,当您选择按钮时设置一些flag
或将其保存在某个地方,并将条件设置为cellforrow
如果按钮的标签来自保存的标签而不是选中它。
答案 2 :(得分:0)
你应该创建一个维护按钮选择轨道的selectedArray
var selectedButtonsArray = [{
isSelected = true
},
{isSelected = false}
]
希望这对你有帮助, 谢谢
答案 3 :(得分:0)
阐述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
}
然后在你的cell for cellforrowatindexpath方法中,你可以将这些bool设置为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
}
答案 4 :(得分:0)
你应该管理细胞模型:
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)))