如何使用Swift 3,ReativeKit和Bond绑定自定义对象数组

时间:2017-01-11 00:27:21

标签: ios swift reactivekit

背景 我有一个可以接收实时数据流的IOS应用程序。我已经实现了自定义值对象来存储/捕获实时流中的这些数据。我现在需要将自定义数据对象绑定到UI(主要使用调用这些自定义对象值的tableviews和自定义单元格)。

问题 如何使用Swift 3中的Bond,ReactiveKit或其他框架将自定义对象值数组绑定到我的UI?

示例代码

public class Device {
    var name: String
    var status: String
}
public class DeviceController {
    var devices = Array<Device>()
    // more code to init/populate array of custom Device classes
}
public class CustomViewController: ... {
    var deviceController = DeviceController()
    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // more code to register custom cell
}
public class CustomCell:UITableviewCell {
    @IBOutlet weak var deviceName: UILabel!
    @IBOutlet weak var deviceStatus: UILabel!
}

1 个答案:

答案 0 :(得分:0)

您使用委托模式,该模式已经为许多UIKit元素设置,包括UITableView。

UITableView有两个属性,可以是符合两个协议的任何对象,特别是

var dataSource: UITableViewDataSource?
var delegate: UITableViewDelegate?

因此,对于您的UITableView,您可以指定一个对象作为dataSource和delegate。通常,但并非总是如此,可以使包含ViewController的数据源和委托。

override func viewDidLoad() {
    tableView.dataSource = self
    tableView.delegate = self
    ...
}

但是,首先必须使ViewController符合这些协议。

public class CustomViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

命令单击两个一致性声明,您将能够看到必须添加到视图控制器以符合的方法。他们很明显他们做了什么,你可能会从那里弄清楚。

但具体来说你需要添加numberOfRows,numberOfSections和这个方法,我认为这是你要问的那个。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // dequeue a cell for reuse
    // type cast the cell to your UITableViewCell subclass
    // set the device name and device status labels like so..

    cell.deviceName = deviceController.devices[indexPath.row].name
    cell.deviceStatus = deviceController.devices[indexPath.row].status
    return cell
}

从那里,tableView将在布局子视图时自动请求数据。如果您的数据没有立即全部可用,您可以调用tableView.reloadData()。