Есть ли способ передать данные обратно в контроллер представления, проводя вниз, чтобы закрыть другой контроллер представления? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть контроллер представления, давайте назовем его vc1, который передает некоторые данные другому (vc2), используя подготовку к segue, а затем вызывая executeSegue.

Есть ли способ передать некоторые данные обратно из vc2 к vc1, когда vc2 отклоняется, проводя вниз?

Спасибо,

Редактировать -

Извинения за недостаток информации, очень новый, чтобы быстро ответить, так что неуверен в правильном вопросе спросить в этой ситуации.

Чтобы уточнить, проблема root на данный момент заключается в том, что vc2 не отклоняется программно. ie в данный момент функция не вызывается, она просто отклоняется пользователем, проводящим вниз.

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

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

Снова прошу прощения, и я ценю всю помощь, уже оказанную!

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Попробуйте

class VCOne: UIViewController {

//Create a shared instance of VCOne

 static var sharedInstance:VCOne?

 //Let the data to be passed back to VCOne is of type string

  var dataToBePassedBack:String?

  override func viewDidLoad() {
    super.viewDidLoad()

   //set the sharedInstance to self
    VCOne.sharedInstance = self

    }

}

Class VCTwo:UIViewController{

 //function in which you are dismissing your current VC you can use the shared 
 instance to pass the data back

func dismissVC(){

  //before dismissing the VCTwo you can set the value for VCOne

VCOne.sharedInstance?.dataToBePassedBack = "data" 

}


}
0 голосов
/ 14 апреля 2020
  • Использование протокола и делегата, который вы делаете, или другой вариант - NSotificationcenter.
0 голосов
/ 14 апреля 2020

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

     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)"
    }
}

Надеюсь, это поможет!

...