ios - 在 Swift 中使用协议(protocol)和委托(delegate)将数据从 UITableViewDataSource 传递到 UIViewController

标签 ios uitableview swift delegates protocols

我试图在选择表格行时将数据从 UITableViewDataSource 传递到 UIViewController。我想我已经很接近了。

协议(protocol)

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)!")

    }

}

View Controller - 缩写

class ViewController: UIViewController, MKMapViewDelegate, BusDataDelegate {

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

}

最佳答案

问题是您只声明了 busDataDelegate 对象,没有给它分配任何东西或没有分配它。

你是这样声明的:

var busDataDelegate: BusDataDelegate?

像这样使用它:

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

但从来没有为该对象分配任何东西或分配它,这就是问题所在。

关于ios - 在 Swift 中使用协议(protocol)和委托(delegate)将数据从 UITableViewDataSource 传递到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27752539/

相关文章:

ios - 如何将 NSData 编码为字符串

ios - 如何快速卡住 tableView 单元格?

ios - 如何在 iOS 中的 soap 请求后刷新 tableview

swift - 识别是否用鼠标右键快速按下 nsbutton

ios - 核心数据 : load data in background and save

ios - swift |强制取消执行代码

ios - 只有当核心数据和 NSFetchedResultsController 满足某些条件时,才在 UITableViewCell 中实现 UIImageView

ios - 在应用程序上加载 Webview 启动 IOS

swift - 使用 Swift 的私有(private) Cocoapod

ios - TableView 的嵌套 Firebase 数据