Как я могу создать экземпляр пользовательской модели с несколькими контроллерами представления в XCode с Swift 4? - PullRequest
0 голосов
/ 12 мая 2018

Я новичок в Swift, и я уверен, что этот вопрос довольно простой, его уже задавали и отвечали ранее.

Я не использую storyBoard.Мой основной viewController создается из AppDelegate с помощью кода.

У меня есть:

  • пользовательский класс, определенный в файле model.swift
  • основнойviewController (из AppDelegate), который я использую в качестве контейнера
  • 3 дополнительных контроллера представления в качестве подпредставлений основного (не друг друга)
  • все 3 подпредставления отображаются одновременно, каждый из которых покрывает 1/ 3 экрана (без переходов)
  • каждый viewcontroller находится в отдельном файле .swift

Я хочу создать экземпляр моего пользовательского класса в главном viewController и иметь все 3 подпредставления, которые могут ссылаться на этот экземпляр.

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

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

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

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вот как я бы это сделал:

  1. Создайте одноэлементный класс.
  2. Настройте свойства синглтона в главном ViewController.
  3. Используйте didSet для публикации Уведомления.
  4. Добавьте прослушиватель для этого Уведомления в ваших дополнительных ViewControllers.
0 голосов
/ 12 мая 2018

Вы можете использовать шаблон делегата.В приведенном ниже коде предполагается, что вы используете шаблон MVVM.(Это очень похоже на VIPER / ReSwift шаблоны также)

protocol DataChangedDelegate {
  func refreshData()
}

// ViewModel for FirstViewController
class FirstViewModel {
   var delegate: DataChangedDelegate?

   var data: Any {
     didSet {
       delegate?.refreshData()
     }
  }
  //rest of the things
}

//similarly other two view models will have a delegate and on data change will call the refresh method

И ваши контроллеры представления должны принять этот протокол

class FirstViewController: UIViewController, DataChangedDelegate {
  //view controller code

  //delegate code
  func refreshDate() {
    //tableView.reloadDate()
    //collectionView.reloadDate()
    //lableView.text = viewModel.data()
  }
}

И где бы вы ни создавали viewControllers идобавить в качестве subView, вы должны установить делегат viewModel.

let firstViewController: FirstViewController = createFirstViewController()
let firstViewModel = FirstViewModel()
firstViewModel.delegate = firstViewController
firstViewController.viewModel = firstViewModel
mainViewController.addSubView(firstViewController.view)

Аналогично для всех других контроллеров представления.

...