斯威夫特/ iOS版:折叠在一个UITableView节

问题描述 投票:0回答:5

我有大约5节一UITableView。我试图折叠和展开通过点击按钮的部分之一,但我看到了一个问题,我使用的是这样做的代码在其他部分的塌陷结果也是如此。具体而言,所有可见部分的第一排都崩溃了。

下面是该代码的样子:

func didClickSectionCollapseButton() {
    shouldCollapseSection = !shouldCollapseSection
    tableView.beginUpdates()
    tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
    tableView.endUpdates()
}

这里是numberOfRowInSection方法:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return 1
    case 1:
        // collapsible section
        return shouldCollapse ? 0 : collapsibleSectionCellCount
    case 2:
        return getCellCount()
    case 3:
        return 1
    case 4:
        return 1
    default:
        return 0
    }
}

有什么我丢失在这里吗?我已经通过各种教程和问题走了,但我一直没能找到解决的办法呢。

ios swift uitableview
5个回答
2
投票

嗨了大量的研究后,我发现这工作对我来说完全用故事板的解决方案。

storyboard setup

查看控制器代码:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tblView: UITableView!

var sections = ["section1","section2","section3"]

var cells = ["cell1","cell2","cell3","cell4"]

var selectedIndx = -1

var thereIsCellTapped = false

override func viewDidLoad() {
    super.viewDidLoad()
    tblView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return 2
    case 1:
        return 3
    default:
        return 4
    }
}

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

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.section == selectedIndx && thereIsCellTapped{
        return 50
    }else{
        return 0
    }
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableCell(withIdentifier: "SectionTableViewCell") as! SectionTableViewCell
    headerCell.lblHeader.text = sections[section]
    headerCell.btnSelection.tag = section
    headerCell.btnSelection.addTarget(self, action: #selector(ViewController.btnSectionClick(sender:)), for: .touchUpInside)
    return headerCell
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ExpandeTableViewCell") as! ExpandeTableViewCell
    cell.lblCell.text = cells[indexPath.row]
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(indexPath.section)
}

@objc func btnSectionClick(sender:UIButton!){
    print("selected index",sender.tag)
    if selectedIndx != sender.tag {
        self.thereIsCellTapped = true
        self.selectedIndx = sender.tag
    }
    else {
        // there is no cell selected anymore
        self.thereIsCellTapped = false
        self.selectedIndx = -1
    }
    tblView.reloadData()
}
}

如果你不想做的选择,并取消在同一个选择,那么,请参见下面的代码。

@objc func btnSectionClick(sender:UIButton!){
    print("selected index",sender.tag)

    selectedIndx = sender.tag

    tblView.reloadData()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.section == selectedIndx{
        return 50
    }else{
        return 0
    }
}

它为我,我提到很多答案,并做到了。我希望这会帮助你。


1
投票

我用这个代码很久以前,它是在雨燕2.3。我不知道这是否会帮助或没有,但值得一提的。

class DriversVC : UIViewController , UITableViewDelegate , UITableViewDataSource {
    //-----------------------------------------------------------------------
    //MARK: - Outlets

    @IBOutlet var tvDriverList: UITableView! {
        didSet {
            tvDriverList.delegate = self
            tvDriverList.dataSource = self
        }
    }

    //-----------------------------------------------------------------------
    //MARK: - Variables

    var arrDriverList : NSArray? //Section data
    var arrWorkerList : NSArray? //Section data
    var collapseSection0 : Bool = false
    var collapseSection1 : Bool = false
    var btnSection0Headder : UIButton = UIButton()
    var btnSection1Headder : UIButton = UIButton()

    //------------------------------------------------------

    func btnSection0HeadderTapped () {
        if collapseSection0 {
            collapseSection0 = false
        } else {
            collapseSection0 = true
        }
        tvDriverList.reloadSections(NSIndexSet(index: 0), withRowAnimation: UITableViewRowAnimation.Fade)
    }

    //------------------------------------------------------

    func btnSection1HeadderTapped () {
        if collapseSection1 {
            collapseSection1 = false
        } else {
            collapseSection1 = true
        }
        tvDriverList.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.Fade)
    }

    //-----------------------------------------------------------------------------------
    //MARK:- Table delegate and data sources

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

    //------------------------------------------------------

    func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 20
    }

    //------------------------------------------------------

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: 50))
        view.backgroundColor = OrangeColor //Set your color
        let lbl = UILabel(frame: CGRect(x: 10, y: 5, width: UIScreen.mainScreen().bounds.width - 20, height: 40))
        lbl.font = UIFont(name: OpenSansRegular, size: 18) //Set your font
        lbl.textColor = UIColor.whiteColor()
        view.addSubview(lbl)
        if section == 0 {
            lbl.text = "D R I V E R"
            btnSection0Headder.addTarget(self, action: #selector(self.btnSection0HeadderTapped), forControlEvents: .TouchUpInside)
            btnSection0Headder.frame = view.frame
            view.addSubview(btnSection0Headder) // uncomment to apply collapse effect
        } else {
            lbl.text = "W O R K E R"
            btnSection1Headder.addTarget(self, action: #selector(self.btnSection1HeadderTapped), forControlEvents: .TouchUpInside)
            btnSection1Headder.frame = view.frame
            view.addSubview(btnSection1Headder) // uncomment to apply collapse effect
        }
        return view
    }

    //------------------------------------------------------

    func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return UIView()
    }

    //------------------------------------------------------

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        if arrWorkerList != nil && arrWorkerList?.count > 0 {
            return 2
        }
        return 1
    }

    //------------------------------------------------------

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            if !collapseSection0 {
                guard arrDriverList != nil else {return 0}
                return arrDriverList!.count
            } else {
                return 0
            }
        } else {
            if !collapseSection1 {
                guard arrWorkerList != nil else {return 0}
                return arrWorkerList!.count
            } else {
                return 0
            }
        }
    }

    //------------------------------------------------------

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(DriversCVC).componentsSeparatedByString(".").last!) as? DriversCVC else { fatalError("unexpected DriversCVC dequeued from tableView") }
        cell.superViewController = self
        if indexPath.section == 0 {
            guard let dict = arrDriverList![indexPath.row] as? NSDictionary else {return cell}
            cell.data = dict
        } else {
            guard let dict = arrWorkerList![indexPath.row] as? NSDictionary else {return cell}
            cell.data = dict
        }
        cell.setup()
        return cell
    }

    //----------------------------------------------------------------------
    //MARK: - Action Method

    @IBAction func btnBackTapped(sender: AnyObject) {
        guard self.navigationController != nil else {
            self.dismissViewControllerAnimated(true, completion: nil)
            return
        }
        guard self.navigationController?.popViewControllerAnimated(true) != nil else {
            guard self.navigationController?.dismissViewControllerAnimated(true, completion: nil) != nil else {
                AppDelegate.sharedInstance().loginCall()
                return
            }
            return
        }
    }

    //-----------------------------------------------------------------------
    //MARK: - View Life Cycle Methods

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    //----------------------------------------------------------------------

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        setUpVC()
    }

    //----------------------------------------------------------------------

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    } }

0
投票

您可以使用:

func didClickSectionCollapseButton() {
    shouldCollapseSection = !shouldCollapseSection
    tableView.beginUpdates()
    tableView.deleteSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
    tableView.endUpdates()
}

0
投票

beginUpdates()endUpdates()工程对,如果你想后续插入,删除和选择操作,而不是为reloadData。 在你的代码,删除beginUpdates()endUpdates()


0
投票

是否有按钮操作所设置的shouldCollapseSection变量和numberOfRowsInSection方法中使用的可变shouldCollapse之间的差?

这似乎是你没有设置你正在使用的数据源代表相同的变量。

© www.soinside.com 2019 - 2024. All rights reserved.