在Table View中实现委托方法

时间:2017-12-24 08:17:28

标签: swift uitableview delegates

我有一个带有自定义单元格的表格视图。在这个单元格中,我有两个用于计数的按钮。一个按钮,一个减号按钮。这些按钮应增加和减少counterLabel与1.
我在很久以前的一个项目中完成了这个,但后来我使用了扩展,我在这个项目中没做过。我的问题是我无法弄清楚如何实现我在上一个项目中使用的委托方法 我将展示我正在尝试的代码,作为扩展。这给出了错误“对成员的不明确的引用'tableView(_:numberOfRowsInSection :)'”。 我该如何正确实现委托?

主视图控制器     导入UIKit

    class MainViewController: UIViewController, UITableViewDelegate {

        let staticList: [ListItem] =
        [
            ListItem(item1: "item1", item2: "item2", item3: "item3")]



        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return staticList.count
            }


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

                let cell: UITableViewCell
                cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath)

                if let customCell = cell as? MenuCell
                {
                    let itemIndex = indexPath.row
                    let listItem = staticList[itemIndex]

                    customCell.item1Label.text = listItem.item1
                    customCell.item2Label.text = listItem.item2
                    customCell.item3Label.text = listItem.item3
                    customCell.counterLabel.text = "\(listItem.count)"


                }
                return cell

            }
        }
        @IBOutlet weak var mainTableView: UITableView!
    }

    extension MainViewController: CountDelegate {
        func didAddItemCell(cell: MainCell) {
            let indexPath = tableView.indexPath(for: cell)!

            staticList[indexPath.row].count += 1

            cell.countLabel.text = "\(staticList[indexPath.row].count)"
        }

        func didSubtractItemCell(cell: MenuCell) {
            let indexPath = tableView.indexPath(for: cell)!

            if staticList[indexPath.row].count > 0 {
                staticList[indexPath.row].count -= 1

                cell.countLabel.text = "\(staticList[indexPath.row].count)"
            }
        }
    }    

表视图单元格文件

import Foundation
import UIKit

protocol CountDelegate: NSObjectProtocol {
    func didAddItemCell(cell: MainCell)
    func didSubtractItemCell(cell: MainCell)
}

class MenuCell : UITableViewCell
{

    @IBOutlet weak var item1Label: UILabel!

    @IBOutlet weak var item2Label: UILabel!

    @IBOutlet weak var item3Label: UILabel!

    @IBOutlet weak var counterLabel: UILabel!
    @IBOutlet weak var minusButton: UIButton!
    @IBOutlet weak var plusButton: UIButton!

    weak var delegate: CountDelegate?


    @IBAction func minusButton(_ sender: UIButton)
    {
        delegate?.didAddItemCell(cell: self)

    }
    @IBAction func plusButton(_ sender: UIButton)
    {
        delegate?.didSubtractItemCell(cell: self)

    }

}

1 个答案:

答案 0 :(得分:1)

numberOfRowsInSectioncellForRowAt方法不是UITableViewDelegate协议的一部分,而是UITableViewDataSource协议的一部分。因此,您需要更改添加该协议,如下所示:

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

您还需要实现这一点:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1 // Or whatever it should be
}