使用uitableviewdatasource的swift协议

时间:2016-05-30 09:35:26

标签: ios swift

我想重复使用下面的代码

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell()
}

我定义了一个协议:

protocol ConfigDetail: class, UITableViewDataSource{}

extension ConfigDetail{

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell()
}

}

但是当我使用UIViewController的协议时,它总是告诉我我不符合协议UITableViewDataSource,或者我必须在我的协议之前添加@objc。但我在我的协议中定义了结构变量,@ objc可能无济于事。任何解决方案?

1 个答案:

答案 0 :(得分:2)

如果要实现这些数据源方法并重用它们,只需定义实现它们的数据源类即可。然后,而不是在视图控制器中实现委托方法,实例化数据源对象,保持对它的强引用,并将其指定为表视图的数据源。

例如:

class DataSource: NSObject, UITableViewDataSource {

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        // configure cell here
        return cell
    }
}

class ViewController: UITableViewController {

    let dataSource = DataSource()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = dataSource
    }

}