2017-01-11 1 views
0

Фон У меня есть приложение IOS, которое может получать поток данных в реальном времени. Я реализовал пользовательские объекты значений для хранения/записи этих данных из прямого потока. Теперь мне нужно привязать свои пользовательские объекты данных к пользовательскому интерфейсу (в основном использовать табличные представления и пользовательские ячейки, которые вызывают эти значения пользовательских объектов).Как связать массив пользовательских объектов с помощью Swift 3, ReativeKit и Bond

Вопрос Как я могу связать массив пользовательских значений объектов в мой UI с помощью Bond, ReactiveKit или другие рамки в Swift 3?

Пример кода

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! 
} 

ответ

0

Вы можете использовать шаблон делегата, который уже установлен на многих элементов UIKit включая UITableView.

UITableView имеет два свойства, которые могут быть любой объект, соответствующий двум протоколам, конкретно

var dataSource: UITableViewDataSource? 
var delegate: UITableViewDelegate? 

Так что для вашего UITableView, вы назначаете объект действовать в качестве DataSource и делегат. Часто, но не всегда, можно было бы сделать содержащий ViewController как dataSource, так и делегировать.

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

Однако, в первую очередь, необходимо, чтобы ViewController соответствовал этим протоколам.

public class CustomViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

Command нажмите на две декларации соответствия и вы будете иметь возможность увидеть методы, которые вы должны добавить в ваш контроллер представления, чтобы соответствовать. Они довольно очевидны, что делают, и вы, вероятно, сможете понять это оттуда.

Но вам нужно добавить числоOfRows, 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(), когда он есть.

+0

У меня уже есть делегаты, кодированные/реализованные очень похожие на код, который вы предложили. Этот метод работает хорошо, когда я вызываю REST API и заполняю свой массив настраиваемых объектов (которые присваиваются ячейке таблицы). Проблема в том, что теперь у меня есть канал в реальном времени, который транслируется в мое приложение, которое, в свою очередь, я обновляю эти пользовательские объекты внутри моего массива, но мои ячейки таблицы не знают, когда изменяются значения пользовательских объектов, m глядя на ReactiveKit/Bond/другую структуру для привязки значений данных к компонентам пользовательского интерфейса – Cameron

Смежные вопросы