1

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

问题 如何在 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!
}
4

1 回答 1

0

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

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

var dataSource: UITableViewDataSource?
var delegate: UITableViewDelegate?

因此,对于您的 UITableView,您分配一个对象作为数据源和委托。通常,但并非总是如此,将包含 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()。

于 2017-01-11T01:11:43.667 回答