向下滚动时如何使 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 在表格视图中保持选中状态的主要内容,如果未能解决你的问题,请参考以下文章

滚动时更改 UIButton 色调颜色

如何使搜索栏不与表格视图一起滚动? [复制]

当用户向下滚动后向上滚动时,如何在表格视图中显示搜索框?

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

当用户在表格视图中向下滚动时,如何将 UINavigationBar 背景颜色从透明更改为红色

当用户在表格视图中向下滚动时隐藏视图