使用Swift中的协议和委托将数据从UITableViewDataSource传递到UIViewController

时间:2015-01-03 06:56:52

标签: ios uitableview swift delegates protocols

我正在尝试在选择表格行时将数据从UITableViewDataSource传递到UIViewController。我觉得我很亲密。

协定

protocol BusDataDelegate {
    func didSelectRow(row: NSIndexPath, data: Route)
}

数据来源

class BusUITableView: NSObject, UITableViewDelegate, UITableViewDataSource {

    var busDataDelegate: BusDataDelegate?

    var routeService: RouteService = RouteService()

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

        var busRoutes: [Route] = routeService.retrieve()
        return busRoutes.count
    }

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

        var cell:BusUITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as BusUITableViewCell

        var busRoutes: [Route] = routeService.retrieve()

        cell.routeName.text = busRoutes[indexPath.row].name
        cell.routeNumber.text = busRoutes[indexPath.row].id
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        var busRoutes: [Route] = routeService.retrieve()

        busDataDelegate?.didSelectRow(indexPath, data: busRoutes[indexPath.row])
        println("You selected cell #\(indexPath.row)!")

    }

}

查看控制器 - 缩写

class ViewController: UIViewController, MKMapViewDelegate, BusDataDelegate {

    func didSelectRow(row: NSIndexPath, data: Route) {
        println("Row: \(row) Data: \(data)")
    }

}

1 个答案:

答案 0 :(得分:0)

问题是您只声明了busDataDelegate对象,没有为其分配任何内容或未分配它。

你宣布它是这样的:

var busDataDelegate: BusDataDelegate?

使用它像:

busDataDelegate?.didSelectRow(indexPath, data: busRoutes[indexPath.row])

但从未向该对象分配任何东西或分配它,这就是问题所在。