ViewController Перемещение Swift с одного ВК на другой и возвращение обратно - PullRequest
0 голосов
/ 05 октября 2018

Рассмотрим два контроллера вида Controller1 и Controller2, я создал форму многих UITextField в контроллере 1, в которой, когда пользователь щелкает конкретный UITextField, он перемещается в контроллер2 и выбирает там данные.,

После выбора данных в Controller2 они автоматически перемещаются в Controller1, при возврате из контроллера2 в контроллер1 другие данные UITextfield очищаются и обнаруживаются только выбранные данные из контроллера2.Мне нужно, чтобы все данные были найдены в UITextfield после выбора.

Вот код возврата с Controller2 на Controller1

 if(Constants.SelectedComplexName != nil)
  {
      let storyBoard: UIStoryboard = UIStoryboard(name: "NewUserLogin", bundle: nil)
      let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewUser") as! NewUserRegistrationViewController
      self.present(newViewController, animated: true, completion: nil)
   }

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Для передачи сообщений необходимо реализовать Delegate.

protocol SecondViewControllerDelegate: NSObjectProtocol {
    func didUpdateData(controller: SecondViewController, data: YourDataModel)
}
//This is your Data Model and suppose it contain 'name', 'email', 'phoneNumber'
class YourDataModel: NSObject {
    var name: String? //
    var phoneNumber: String?
    var email: String?
}
class FirstViewController: UIViewController, SecondViewControllerDelegate {
    var data: YourDataModel?
    var nameTextField: UITextField?
    var phoneNumberTextField: UITextField?
    var emailTextField: UITextField?

    override func viewDidLoad() {
        super.viewDidLoad()
        callWebApi()
    }

    func callWebApi() {
        //After Success Fully Getting Data From Api
        //Set this data to your global object and then call setDataToTextField()
        //self.data = apiResponseData
        self.setDataToTextField()
    }

    func setDataToTextField() {
        self.nameTextField?.text = data?.name
        self.phoneNumberTextField?.text = data?.phoneNumber
        self.emailTextField?.text = data?.email
    }

    func openNextScreen() {
        let vc2 = SecondViewController()//Or initialize it from storyboard.instantiate method
        vc2.delegate = self//tell second vc to call didUpdateData of this class.
        self.navigationController?.pushViewController(vc2, animated: true)
    }

    //This didUpdateData method will call automatically from second view controller when the data is change
    func didUpdateData(controller: SecondViewController, data: YourDataModel) {

    }
}
class SecondViewController: UIViewController {
    var delegate: SecondViewControllerDelegate?

    func setThisData(d: YourDataModel) {
        self.navigationController?.popViewController(animated: true)
        //Right After Going Back tell your previous screen that data is updated.
        //To do this you need to call didUpdate method from the delegate object.
        if let del = self.delegate {
            del.didUpdateData(controller: self, data: d)
        }
    }
}
0 голосов
/ 05 октября 2018

Есть несколько способов сделать это, но обычно это зависит от того, как вы переходите с VC # 1 на VC # 2 и обратно.

(1) Код, который вы опубликовали, подразумевает, что у вас есть раскадровкаоба вида контроллеров.В этом случае создайте переход от VC # 1 к VC # 2 и выполните «раскрутку» обратно.Оба довольно легко сделать.Ссылка , предоставленная в комментариях, хорошо показывает вас, но, в зависимости от (1) того, сколько данных вы хотите передать обратно в VC # 1 и (2), если вы хотите выполнить функциюна VC # 2 вы также можете сделать это:

VC # 1:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowVC2" {
        if let vc = segue.destination as? VC2ViewController {
            vc.VC1 = self
        }
    }
}

VC # 2:

weak var VC1:VC1ViewController!

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if isMovingFromParentViewController {
        VC1.executeSomeFunction()
    }
}

В основном вы передаете весь экземпляр VC1 и, следовательно, имеет доступ ко всему, что не отмечено private.

(2) Если вы представляете / исключаете VC # 2 из VC # 1, используйте delegate стиль, описанный в одном из ответов.

VC # 1:

var VC2 = VC2ViewController()

extension VC1ViewController: VC2ControlllerDelegate {
    func showVC2() {
        VC2.delegate = self
        VC2.someData = someData
        present(VC2, animated: true, completion: nil)
    }
    function somethingChanged(sender: VC2ViewController) {
        // you'll find your data in sender.someData, do what you need
    }
}

VC # 2:

protocol VC2Delegate {
    func somethingChanged(sender: VC2ViewController) {
        delegate.somethingChanged(sender: self)
    }
}
class DefineViewController: UIViewController {

    var delegate:DefineVCDelegate! = nil
    var someData:Any!

    func dismissMe() {
        delegate.somethingChanged(sender: self)
        dismiss(animated: true, completion: nil)
    }
}

}

В основномвы делаете VC # 1 делегатом VC2.Я предпочитаю синтаксис объявления в VC # 2 для `делегата, потому что, если вы забудете установить VC # 1 в качестве делегата для VC # 2, во время выполнения вы вызовете ошибку.

0 голосов
/ 05 октября 2018
push your view controller instead of a present like this  


if(Constants.SelectedComplexName != nil)
 {
    let storyBoard: UIStoryboard = UIStoryboard(name: "NewUserLogin", bundle: nil)
    let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewUser") as! NewUserRegistrationViewController
    self.navigationController?.pushViewController(newViewController, animated: true)
 }

, а затем выскочит после выбора данных из vc2 следующим образом

self.navigationController?.popViewController(animated: true)

, и если вы не используете контроллер навигации, то вы можете просто вызвать Dismiss метод

self.dismiss(animated: true) {
    print("updaae your data")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...