swift中UITableView的动态数据源/委托

时间:2015-09-27 09:25:24

标签: swift swift2

我需要根据某些条件设置不同的对象作为数据源&表视图的委托。

但我无法分配tableview的数据源/委托,因为它会抛出一些错误。

  

无法指定NSObject类型的值?到UITableViewDelegate类型的值?

我确实检查了this Q& A但这不起作用。

var dataSourceDelegate:NSObject?
class RootViewController: UIViewController {
...
override func viewDidLoad() {
        dataSourceDelegate = TableDataSourceDelegate()
        // Table View
        tableView = UITableView()
        tableView!.setTranslatesAutoresizingMaskIntoConstraints(false)
        tableView!.dataSource = dataSourceDelegate 
        // Cannot assign a value of type NSObject? to a value of type UITableViewDataSource?
        tableView!.delegate = dataSourceDelegate
        // Cannot assign a value of type NSObject? to a value of type UITableViewDelegate?
        view.addSubview(tableView!)

        // Constraints
        var views:[String:UIView] = ["table":tableView!]
        var hTableConstraint = "H:|[table]|"
        var vConstraint = "V:|[table]|"
        view.addConstraintsToView([hTableConstraint, vConstraint], view: view, viewVariables: views)
    }
...
}

这是数据源/委托类

class TableDataSourceDelegate:NSObject, UITableViewDataSource, UITableViewDelegate {
    // MARK: Datasource

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

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

    // MARK: Delegates
}

2 个答案:

答案 0 :(得分:3)

NSObject的?不符合UITableViewDelegate,也不符合UITableViewDataSource。您应该创建像

这样的协议
protocol GeneralDataSource: UITableViewDataSource, UITableViewDelegate {}

然后所有数据源都应符合该协议。

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

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

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

然后你可以像这样使用它

var myDataSource: GeneralDataSource?

override func viewDidLoad() {
    super.viewDidLoad()

    self.myDataSource = MyDataSource()
    self.tableView.delegate = self.myDataSource
}

答案 1 :(得分:1)

这就是TableDataSourceDelegate应该是这样的:

import UIKit

class TableDataSourceDelegate: NSObject {
}

extension TableDataSourceDelegate: UITableViewDataSource {
    @objc func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }

    @objc func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "defaultCell")
        cell.textLabel?.text = "test"
        return cell
    }
}

extension TableDataSourceDelegate: UITableViewDelegate {
    // your delegate implementation here
}

查看控制器实现

import UIKit

// The typealias definition
typealias TVDataSourceDelegate = protocol<UITableViewDataSource, UITableViewDelegate>

class ViewController: UIViewController {

    var dataSourceDelegate: TVDataSourceDelegate?
    var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()

        dataSourceDelegate = TableDataSourceDelegate()
        // Table View
        tableView = UITableView()
        tableView!.translatesAutoresizingMaskIntoConstraints = false
        tableView!.dataSource = dataSourceDelegate
        tableView!.delegate = dataSourceDelegate
        view.addSubview(tableView!)

        // other code ...
    }

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

虽然,我建议将dataSource和委托对象分开(例如,将代理协议符合代码放入视图控制器的代码中。