如何使用自定义的两个单元格在表视图中显示/隐藏特定部分

How to show/hide particular section in tableview with customised two cells

提问人:Anilkumar iOS - ReactNative 提问时间:7/28/2022 最后编辑:Anilkumar iOS - ReactNative 更新时间:7/29/2022 访问量:380

问:

我必须根据标志值显示带有两个部分的 tableview。根据标志值,我必须显示/隐藏第一部分。 第一部分只有一行和静态自定义单元格,该单元格将始终显示相同的数据。 第二部分是另一个自定义单元格,这是从服务器数据中显示的动态行。 我需要显示第二部分总是。第一部分基于旗帜,我必须显示或隐藏。 如何处理?

这是我的代码

    override func viewDidLoad() {
        super.viewDidLoad()
        self.registerCells()
    }

    func registerCells(){

        self.DetailsTableview.register(RadioButtonTableViewCell.nib, forCellReuseIdentifier: RadioButtonTableViewCell.identifier)
        if flagValue == true {
            self.DetailsTableview.register(UPPercentageCell.nib, forCellReuseIdentifier: PercentageCell.identifier)
        }
}

    func numberOfSections(in tableView: UITableView) -> Int {
        if flagValue == true {
            return 2
        }
        return 1
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if flagValue == true {
            return 20
        }
        return 40
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        if flagValue == true {
            if section == 0 {
                return 1
            } else {
                return self.response?.data?.count ?? 0
            }
        }
        return self.response?.data?.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        if flagValue == true {
            if indexPath.section == 0 {
                let percentagecell: PercentageCell = tableView.dequeueReusableCell(withIdentifier: "PercentageCell", for: indexPath) as! UPPercentageCell
                percentagecell.percentage = "20" //some dynamic value
                percentagecell.isUserInteractionEnabled = false
                return percentagecell
            } else {
                let cell: RadioButtonTableViewCell = tableView.dequeueReusableCell(withIdentifier: "RadioButtonTableViewCell", for: indexPath) as! RadioButtonTableViewCell
                cell.displayDataToUI(title: response?.data?[indexPath.row] ?? "", currentIndexpath: indexPath, selectedIndexpath: selectedIndexpath ?? IndexPath())
                cell.radioButtonClicked = {
                    [weak self] (indexpath) in
                    self?.saveButton.isUserInteractionEnabled = true
                    self?.reloadTableviewFromSelectedIndexpath(indexpath: indexpath)
                }
                return cell
            }
            
        } else {
            let cell: RadioButtonTableViewCell = tableView.dequeueReusableCell(withIdentifier: "RadioButtonTableViewCell", for: indexPath) as! RadioButtonTableViewCell
                cell.displayDataToUI(title: response?.data?[indexPath.row] ?? "", currentIndexpath: indexPath, selectedIndexpath: selectedIndexpath ?? IndexPath())
                cell.radioButtonClicked = {
                    [weak self] (indexpath) in
                    self?.saveButton.isUserInteractionEnabled = true
                    self?.reloadTableviewFromSelectedIndexpath(indexpath: indexpath)
                }
                return cell
        }
        return UITableViewCell()
    }

有没有更好的方法来实现这一目标?

非常感谢您的宝贵建议。

iOS Swift iPhone Xcode UITableView

评论

0赞 Reinier Melian 7/28/2022
也许你应该尝试对你的 dataSource 进行建模,因为这样你就可以通过修改这个数组数组来删除完整的部分,每个内部数组都是一个部分,并且你可以很容易地删除添加或删除你的逻辑将大大减少,你的代码可读性/可维护性会更好。[[itemCells]]numberOfRowsInSectionnumberOfSections

答:

0赞 DonMag 7/29/2022 #1

你的方法很好,但你可以用更少的 if/else 块来简化事情......

第一:

func registerCells(){
    self.DetailsTableview.register(RadioButtonTableViewCell.nib, forCellReuseIdentifier: RadioButtonTableViewCell.identifier)
    // doesn't hurt to go ahead and register both cell classes for reuse
    self.DetailsTableview.register(UPPercentageCell.nib, forCellReuseIdentifier: PercentageCell.identifier)
}

接下来,只是一种更紧凑的编写方式:

override func numberOfSections(in tableView: UITableView) -> Int {
    return flagValue ? 2 : 1
}

和:

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

    // this will only be true if
    //  section is 0
    //  AND
    //  flagValue is true
    if section == 0 && flagValue {
        return 1
    }

    //  whether we're in section 0 WITHOUT the "top" section, or
    //  we're in section 1 WITH the "top" section
    return self.response?.data?.count ?? 0

}

和:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    // this will only be true if
    //  section is 0
    //  AND
    //  flagValue is true
    if indexPath.section == 0 && flagValue {
        let cell = tableView.dequeueReusableCell(withIdentifier: UPPercentageCell.identifier, for: indexPath) as! UPPercentageCell
        cell.percentage = "20" //some dynamic value
        cell.isUserInteractionEnabled = false
        return cell
    }
    
    // we want to display the same cells from the same data array
    //  whether we're in section 0 WITHOUT the "top" section, or
    //  we're in section 1 WITH the "top" section
    let cell = tableView.dequeueReusableCell(withIdentifier: RadioButtonTableViewCell.identifier, for: indexPath) as! RadioButtonTableViewCell

    cell.displayDataToUI(title: response?.data?[indexPath.row] ?? "", currentIndexpath: indexPath, selectedIndexpath: selectedIndexpath ?? IndexPath())
    cell.radioButtonClicked = {
        [weak self] (indexpath) in
        self?.saveButton.isUserInteractionEnabled = true
        self?.reloadTableviewFromSelectedIndexpath(indexpath: indexpath)
    }

    return cell
}