除非快速选择所有单元格,否则限制表格视图

Posted

技术标签:

【中文标题】除非快速选择所有单元格,否则限制表格视图【英文标题】:Restrict table view unless select all cell in swift 【发布时间】:2018-05-24 05:28:06 【问题描述】:

我有一个表格视图,我在其中填充从我的服务获取的数据。数据是完全动态的,表格视图包含部分和单元格,所有的东西都是动态的。我在表格视图之外有一个按钮操作,用于添加选定的单元格数据。现在我想限制它不添加数据的按钮,直到选择了部分下的所有单元格。我希望用户首先检查单元格,然后通过添加按钮添加。我的表格视图代码是这样的,

func numberOfSections(in tableView: UITableView) -> Int 

        return AddonCategoryModel!.count


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 

         return AddonCategoryModel![section].name


func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 34


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

         return 50


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return AddonCategoryModel![section].addonItems.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = addonTableView.dequeueReusableCell(withIdentifier: "addonCell", for: indexPath) as! RestaurantMenuDetailAddonTVC

        cell.addonTitleLbl.text = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].name
        cell.priceLbl.text = String(AddonCategoryModel![indexPath.section].addonItems[indexPath.row].price)


        if selection[indexPath.section].isSelected[indexPath.row] 
             cell.radioBtn.setImage(UIImage (named: "radio"), for: UIControlState.normal)
          addonItemName = cell.addonTitleLbl.text!
          addonItemprice = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].price
          addonItemId = AddonCategoryModel![indexPath.section].addonItems[indexPath.row].addonPKcode
          addonItemNameArray.append(addonItemName)
          addonItemPriceArray.append(addonItemprice)
          addonItemIdArray.append(addonItemId)

          let defaults = UserDefaults.standard
            defaults.set(addonItemName, forKey: "addonItemName")
            defaults.set(addonItemprice, forKey: "addonItemPrice")
            defaults.set(addonItemId, forKey: "addonItemId")

            defaults.synchronize()

        
        else 

            cell.radioBtn.setImage(UIImage (named: "uncheckRadio"), for: UIControlState.normal)
        

        cell.radioBtn.tag = indexPath.row

// cell.radioBtn.addTarget(self, action: #selector(checkBoxSelection(_:)), for: .touchUpInside) cell.selectionStyle = .none cell.backgroundColor = UIColor.clear 返回单元格

我的屏幕是这样的,

【问题讨论】:

你完成了选中和未选中的单选按钮图像吗? 是的,它工作正常,只是我希望用户不能添加任何项目,直到它应该从表格视图中选择所有单元格。 @PPL 好的,请稍候回复 在你做的部分使按钮高亮或启用, 【参考方案1】:

基本上,您必须根据用户选择行或取消选择行来设置选择的真假,然后只需检查您的数据集是否选择了任何内容,如果是,则使按钮突出显示/启用,否则禁用/不突出显示

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    selection[indexPath.section].isSelected = true
    tableView.reloadData()
    CheckIfAnyOneIsSelected()


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
   selection[indexPath.section].isSelected = false
   tableView.reloadData()
   CheckIfAnyOneIsSelected()


func CheckIfAnyOneIsSelected() 
    //loop through your array and check if anyone is selected if yes break the loop and set the button to enable
    //else make the button disable

   var anyOneSelecte = false
   for singleModel in AddonCategoryModel 
      for item in addonItems 
        if item.isSelected == true 
        anyOneSelecte = true
        break;
      
   

   if anyOneSelecte 
      //enable your button 
    else 
     //disable your button
   

【讨论】:

我使用了自定义单选按钮,你说的是默认检查按钮。我的添加按钮操作在表格视图之外。 @Iraniya Naynesh 当您单击单元格时我所说的进行选择 [indexPath.section].isSelected = true 并重新加载表格,然后 CheckIfAnyOneIsSelected 如果是则使“我的添加按钮启用/禁用” ,添加按钮对表格视图没有任何作用,无论它在哪里,你只想让它禁用启用,如果某些东西被选中/取消选中对吗? 但如果用户选择一个部分下的任何单元格,则此方案将起作用。它会检查所有部分的单元格吗? @Iraniya Naynesh 在这种情况下,在检查时您必须循环通过 AddonCategoryModel,无论您选择哪个部分,设置部分都将起作用,并且在检查时您必须遍历所有部分 如何循环浏览该部分并且在我的函数中我必须应用循环? @Iraniya Naynesh【参考方案2】:

我已经创建了演示,假设你有两个模型类,

class AddOnCategoryModel 
    var name: String = ""
    var arrValues = [Category]()

    init(name: String) 
        self.name = name
    


class Category 
    var name: String = ""
    var price : String = ""
    var isSelected: Bool = false

以下是mainArray

    for i in 0...2 
        let model = AddOnCategoryModel(name: "Section \(i)")
        for j in 0...3 
            let cate = Category()
            cate.name = "Category \(j)"
            model.arrValues.append(cate)
        
        mainArray.append(model)
    

现在考虑到你有关注ListTableCell

有两个IBOutlets

@IBOutlet weak var lblTemp: UILabel!
@IBOutlet weak var btnRadio: UIButton!

仅供参考。请正确设置btnRadiodefaultselected图片。

您的UITableViewDataSource 方法,

func numberOfSections(in tableView: UITableView) -> Int 
    return mainArray.count


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return mainArray[section].arrValues.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "ListTableCell") as! ListTableCell
    let category = mainArray[indexPath.section]
    cell.lblTemp.text = category.arrValues[indexPath.row].name
    cell.btnRadio.tag = indexPath.row
    cell.tag = indexPath.section
    cell.btnRadio.addTarget(self, action: #selector(btnRadioTapped), for: .touchUpInside)
    return cell


func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 50


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    return mainArray[section].name

请找btnRadioTapped方法,

@objc func btnRadioTapped(_ sender: UIButton) 
    sender.isSelected = !sender.isSelected

    let cell = sender.superview?.superview as! ListTableCell

    let addOnModel = mainArray[cell.tag]
    let category = addOnModel.arrValues[sender.tag]
    category.isSelected = sender.isSelected

不要让我们检查所有复选框是否在这样的按钮点击事件中被选中,

@IBAction func btnTapped(_ sender: UIButton) 
    var isCheckedAll = true
    for (_ , item) in mainArray.enumerated() 
        let value = item.arrValues.filter($0.isSelected==false)
        if value.count > 0 
            isCheckedAll = false
            break;
        
    

    print("Done ", isCheckedAll)

如果radioButtons都被选中返回true,如果没有选中任何一个radioButton返回false。

如有任何疑问,请告诉我。这只是演示,您必须根据最终要求进行细微更改。

更新

请在下方找到didSelectRowAt indexPath方法,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let model = mainArray[indexPath.section]
    let category = model.arrValues[indexPath.row]
    category.isSelected = !category.isSelected

    let cell = tableView.cellForRow(at: indexPath) as! ListTableCell
    cell.btnRadio.isSelected = category.isSelected

【讨论】:

兄弟我在单选按钮的选择上设置了我自己的逻辑,因为每个部分下的单元格选择都有一些条件。所以如果可以根据我的逻辑编辑你的答案。 @PPL 是的,您可以相应地设置您的逻辑,但这是您问题的完美答案并且它正在工作,您必须根据您的情况更新 btnRadioTapped 方法 我的单选按钮逻辑未在按钮操作中设置,而是在 didSelect 委托中设置。按钮只是添加选定的单元格数据。 @PPL @raheem 那就太好了,让我更新我的答案,所以你不想检查 UITableView 的 didSelect 上的 radioButton 吗? @raheem 请找到更新的答案并删除 btnRadioTapped 方法

以上是关于除非快速选择所有单元格,否则限制表格视图的主要内容,如果未能解决你的问题,请参考以下文章

如何快速选择aTableView部分中的单元格

长按选择的 Swift 3.0 表格视图单元格

值更改时快速重新加载视图

是否可以快速显示表格视图单元格索引路径和集合视图索引路径?

word怎么选中表格后边

将表格视图快速添加到表格视图单元格中的问题