Просмотр привязки модели в Swift

Я пытаюсь сделать двустороннюю привязку между моделью и представлением с использованием протоколов. Я сделал это, создав 3 протокола: BoundableView.swift

protocol BoundableView { var updater: ViewModelUpdater? {get set} } 

BoundableModel.swift

 protocol BoundableModel { var updater: ViewModelUpdater? {get set} } 

ViewModelUpdater.swift

 protocol ViewModelUpdater { func updateModel(view: BoundableView) func updateView(model: BoundableModel) } 

и затем согласовать эти протоколы в классах MVC

View.swift

 class View: UIView,BoundableView { var updater :ViewModelUpdater? = nil @IBOutlet var nameTextField: UITextField! @IBOutlet var valueTextField: UITextField! @IBAction func valueChanged(_ sender: AnyObject) { updater?.updateModel(view: self) } } 

Model.swift

 class Model : BoundableModel{ var updater: ViewModelUpdater? = nil var name:String { didSet { if let updater = updater{ updater.updateView(model: self) print(self) } } } var value:Int { didSet { if let updater = updater{ updater.updateView(model: self) print(self) } } } init(name:String,value:Int) { self.name = name self.value = value } } 

Controller.swift

 class Controller: UIViewController,ViewModelUpdater { var boundableModel = Model(name : "hello", value: 5) @IBOutlet var boundableView: View! override func viewDidLoad() { super.viewDidLoad() boundableModel.updater = self boundableView.updater = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func updateModel(view: BoundableView) { let view = view as! View boundableModel.name = view.nameTextField.text! boundableModel.value = Int(view.valueTextField.text!)! } func updateView(model: BoundableModel) { let model = model as! Model boundableView.nameTextField.text = model.name boundableView.valueTextField.text = String(model.value) } } 

Проблема возникает, когда я хочу привязать, например, ячейку таблицы к модели, потому что я не знаю, какая ячейка привязана к какой модели в массиве. Есть ли другой способ сделать это?

При работе с UITableViews вы можете держать массив viewModels / updaters для всех ячеек, даже тех, которые еще не видны.

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

Некоторый код, чтобы показать, что я имею в виду:

 class MyBindableCell: UITableViewCell, BoundableView { var updater: ViewModelUpdater? = nil //... } class Controller: UIViewController { var cellViewModels: [BoundableModel] var cellViewModelUpdaters: [ViewModelUpdater] override func viewDidLoad() { super.viewDidLoad() //... //initialize cellViewModels and viewModelUpdaters //... } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cellId", forIndexPath: indexPath) as! MyBindableCell cell.updater = viewModelUpdaters[indexPath.row] cell.updater?.updateView(cellViewModels[indexPath.row]) return cell } } 
  • iOS 11 UISearchBar в UINavigationBar
  • Импорт Канны на детскую площадку
  • Нарисуйте линию в реальном времени с помощью Swift 3.0
  • Как управлять кукисами с помощью UIWebView в Swift
  • Ошибка Xcode 6 'URLWithString' недоступна?
  • Представление коллекции UIKit, странное поведение (доступ к / прокрутка ячеек)
  • Поддержка iOS 8 - Swift
  • Динамически удалить нулевое значение из словаря swift, используя функцию
  • Клавиатура UITextfield с единственным алфавитом, без номеров, без колпачков, без пробела?
  • Усечение хвоста NSAttributedString в UILabel
  • Преобразовать __NSCFNumber в Int32 Swift
  • Interesting Posts

    Как установить CustomFrame на iCarousel в iphone?

    pushViewController не работает в iOS 5, но отлично работает в iOS6

    Разница между новыми и инициализацией массива

    Объекты, проведенные до конца приложения: нет Dealloc в порядке?

    Как определить, когда все изображения были загружены из набора в Swift?

    swift: как сделать снимок экрана AVPlayerLayer ()

    Как получить тип безопасности подключенной в настоящее время сети Wi-Fi, используя либо BSSID, либо SSID?

    FBSDKShareDialog отменяет, когда он должен опубликовать

    Панель состояния iOS 7, такая как iOS 6

    Как настроить чувствительность MKAnnotationView?

    Сохранение url записи в основных данных, но не работает, когда я пытаюсь использовать его позже

    Правильный способ сохранения и загрузки изображений

    Как сделать многострочную этикетку с Eureka

    Разделение строки CamelCase в словах, разделенных пробелами, в Swift

    Как изменить текст «Приложение хочет использовать ваше текущее местоположение?»

    Давайте будем гением компьютера.