繁体   English   中英

无效的更新:尝试展开和折叠UITableView节时,第0节中的行数无效

[英]Invalid update: invalid number of rows in section 0 when trying to expand and collapse UITableView sections

调试时,我发现在我的numberOfRowInSection中,它总是返回计数并跳过if !DealsDataService.instance.getKellysDeals()[section].isExpanded条件,这将导致以下错误,因为它不会返回0。

是否有任何理由会导致跳过该条件?

错误: 由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第0节中的行数无效。更新(2)后现有节中包含的行数必须等于包含的行数在更新(2)之前的那个部分中,加上或减去从该部分中插入或删除的行数(已插入0,已删除2),以及加上或减去移入或移出该部分的行数(移入0, 0移出)。

ViewController正在处理tableview以及展开和折叠部分

@IBOutlet weak var daysTable: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()


    daysTable.dataSource = self
    daysTable.delegate = self 
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{

    let view = UIView()
    view.backgroundColor = .black

    let headerLabel = UILabel()
    let button = UIButton(type: .system)

    let headerList = DaysService.instance.getHeader()
    headerLabel.textColor = .yellow
    headerLabel.font = UIFont.boldSystemFont(ofSize: 20)
    headerLabel.backgroundColor = .black
    headerLabel.text = headerList[section]

    button.setTitle("Close", for: .normal)
    button.setTitleColor(.yellow, for: .normal)
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
    button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside)
    button.tag = section

    headerLabel.frame = CGRect(x: 5, y: 7.5, width: 150, height: 25)
    button.frame = CGRect(x: 150, y: 7.5, width: 150, height: 25)


    view.addSubview(headerLabel)
    view.addSubview(button)

    return view
}

@objc func handleOpenClose(button: UIButton)
{
    print("trying to expand....")
    let section = button.tag
    var dealsArray = DealsDataService.instance.getKellysDeals()

    var indexPaths = [IndexPath]()

    for deals in dealsArray[section].deals.indices
    {
        print(0, deals)

        let indexPath = IndexPath(row: deals, section: section)
        indexPaths.append(indexPath)
    }

    let isExpanded = dealsArray[section].isExpanded
    dealsArray[section].isExpanded = !isExpanded

    button.setTitle(isExpanded ? "Open" : "Close", for: .normal)

    //still having problem expanding and closing

    if isExpanded
    {
        dealsArray[section].deals.removeAll()
        daysTable.deleteRows(at: indexPaths, with: .fade)
    }
    else
    {
        self.daysTable.insertRows(at: indexPaths, with: .fade)
    }

}

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if !DealsDataService.instance.getKellysDeals()[section].isExpanded 
    {
        return 0
    }
    return DealsDataService.instance.getKellysDeals()[section].deals.count

}

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

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "DaysCell", for: indexPath)
    let deals = DealsDataService.instance.getKellysDeals()[indexPath.section].deals[indexPath.row]
    cell.textLabel?.text = deals
    return cell

}

返回交易数组的数据服务:

static let instance = DealsDataService()
private(set) public var barNames = [Bars]()

public var kellysDeals = [

    ExpandableDeals(isExpanded: true, deals:["$2 Bud Lights", "$1 Tacos"]),//Monday
    ExpandableDeals(isExpanded: true, deals:["$2 Budweiser","$2 Burgers"]),//Tuesday
    ExpandableDeals(isExpanded: true, deals:["$3 Drafts","50 cent wings"]),//Wednesday
    ExpandableDeals(isExpanded: true, deals:["$8 Coors pitchers","$5 Sandwiches"]),//Thursday
    ExpandableDeals(isExpanded: true, deals:["No Deal"]),//Friday
    ExpandableDeals(isExpanded: true, deals:["No Deal"]),//Saturday
    ExpandableDeals(isExpanded: true, deals:["No Deal"])//Sunday
]

func getKellysDeals() -> [ExpandableDeals]
{
    return kellysDeals
}

}

在handleOpenClose中,当我应该声明一个全局数组变量,然后在handleOpenClose函数中使用它时,我正在调用DataService。

var barDeals: [ExpandableDeals] = []

@IBOutlet weak var daysTable: UITableView!

override func viewDidLoad()
{
    super.viewDidLoad()

    daysTable.dataSource = self
    daysTable.delegate = self

}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{

    let view = UIView()
    view.backgroundColor = .black

    let headerLabel = UILabel()
    let button = UIButton(type: .system)

    let headerList = DaysService.instance.getHeader()
    headerLabel.textColor = .white
    headerLabel.font = UIFont.boldSystemFont(ofSize: 20)
    headerLabel.text = headerList[section]

    button.setTitle("Open", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
    button.addTarget(self, action: #selector(handleOpenClose), for: .touchUpInside)
    button.tag = section

    headerLabel.frame = CGRect(x: 5, y: 7.5, width: 150, height: 25)
    button.frame = CGRect(x: 150, y: 7.5, width: 150, height: 25)


    view.addSubview(headerLabel)
    view.addSubview(button)

    return view
}

@objc func handleOpenClose(button: UIButton)
{
    let section = button.tag

    self.daysTable.beginUpdates()
    var indexPaths = [IndexPath]()

    for deals in self.barDeals[section].deals.indices
    {
        let indexPath = IndexPath(row: deals, section: section)
        indexPaths.append(indexPath)
    }

    let isExpanded = self.barDeals[section].isExpanded
    self.barDeals[section].isExpanded = !isExpanded

    button.setTitle(!isExpanded ? "Close" : "Open", for: .normal)

    if isExpanded
    {
        daysTable.deleteRows(at: indexPaths, with: .fade)
    }
    else
    {
        daysTable.insertRows(at: indexPaths, with: .fade)
    }

    self.daysTable.endUpdates()

}

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

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

    if self.barDeals[section].isExpanded == false
    {
        return 0
    }
    return self.barDeals[section].deals.count
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM