Один из способов сделать это - создать другой файл, которым он будет управлять, и затем иметь делегата, который всегда уведомляет контроллеры представления о появлении новых изменений. Я расскажу об этом.
protocol HeadControllerDelegate {
// Create a function that sends out the data to the delegates when it is called
// You can use your custom struct here to pass more data easly
func didReciveNewData(myData: String?)
}
struct HeadController {
// Create a shared instance so that the viewcontroller that conforms to the view as well as when we sends out the data the delegate is correct
static var shared = HeadController()
// Creates the delegate, every view can asign it to
public var delegate: HeadControllerDelegate?
// Add all your values here you want to pass back
var myValue: String? {
// The didSet gets called every time this value is set, and then is it time to call the delegate method
didSet {
// Calls the delegates didReciveMethod to notify the delegates that new data exsists
delegate?.didReciveNewData(myData: myValue)
}
}
}
Теперь в вашем классе viewcontroller, где вы хотите, чтобы данные были доступны (как вы сказали, когда проводите пальцем вниз)
class ViewController: UIViewController {
// Here you create a property of the shared instance
let headController = HeadController.shared
override func viewDidLoad() {
super.viewDidLoad()
// Set yourself as the delegate for the headController delegate to recive data
headController.delegate = self
}
}
extension ViewController: HeadControllerDelegate {
// here will the data be recived
func didReciveNewData(myData: String?) {
// handle the data here, you have now got newData
print(myData)
}
}
В классе где вы хотите передать данные, вы просто делаете это так. Прелесть этого в том, что у вас может быть несколько классов или структур, которые записывают данные в контроллеры головы (просто убедитесь, что вы делаете это с помощью общего экземпляра). Мы также считаем целесообразным использовать шаблон делегата.
class Sender {
var headController = HeadController.shared
func sendData(data: String) {
// Here you change the data of the headcontroller wich will send the data to all the delegates
headController.myValue = data
}
}
Надеюсь, этот ответ поможет. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.
ОБНОВЛЕНИЕ - ЛЕГКОЕ РЕШЕНИЕ
Вот более простое решение, но, по моему мнению, оно менее масштабируемое, чем предыдущее.
В prepareForSegue просто передайте свой текущий viewContorller как поле в целевом контроллере представления. Затем, когда viewDidDissapear в новом контроллере представления вы можете просто передать обратно данные. Не волнуйтесь, я покажу вам!
В подготовке к Segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let dc = segue.destination as? SecondViewController {
dc.viewController = self
}
}
И объявите secondViewContorller следующим образом. Метод ViewDidDisappear будет вызван после закрытия представления, и, следовательно, вы можете передать данные в контроллер представления, который вы установили перед использованием метода подготовки к переходу.
class SecondViewController: UIViewController {
var viewController: UIViewController?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidDisappear(_ animated: Bool) {
(viewController as? ViewController)?.value = 2
}
}
Затем вы можете обновить пользовательский интерфейс, используя didSet, который просто будет вызываться при установке свойства, что будет сделано в методе вида исчезли.
var value: Int = 0 {
didSet {
print(value)
text?.text = "\(value)"
}
}
Надеюсь, это поможет!