Проблема при передаче данных между несколькими контроллерами представления с помощью поп-навигации pu sh - PullRequest
1 голос
/ 11 февраля 2020

Моя работа - 1. Передача данных из первого контроллера представления -> второго контроллера представления с помощью pushViewController: Success

2. Передача данных из второго контроллера представления -> Первый контроллер представления с использованием popViewController: Success // используется делегат протокол для возврата данных

3. Передача данных из контроллера третьего вида -> Контроллер первого вида: Ошибка

Код: ViewController.swift

import UIKit

class ViewController: UIViewController,secondViewDelegate,thirddelegate {

    @IBOutlet var Firstoutput: UILabel!

    @IBOutlet var inputField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    func popdata(value: String) { //second view controller delegate protocol defintions
        Firstoutput.text = "\(value)"
    }
    func thirdView(datas:String) //third view controller delegate protocol definition
    {
        print(datas)
    }
    @IBAction func pushBtn(_ sender: Any) { //first view button action

      let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let vcFirst = storyboard.instantiateViewController(withIdentifier: "second") as! SecondViewController //secondview

        vcFirst.Secondtext = inputField.text

        vcFirst.delegate = self //second view delegate intiate

        let vcThird = storyboard.instantiateViewController(withIdentifier: "third") as! ThirdViewController //third view

        vcThird.thirddelegate = self //third view delegate intiate

        navigationController?.pushViewController(vcFirst, animated: true)
    }
}

SecondViewController.swift

import UIKit
//protocol for passing data when pop
protocol secondViewDelegate {
    func popdata(value:String)
}
class SecondViewController: UIViewController {

    @IBOutlet var secondOutputField: UILabel!

    @IBOutlet var secondInputField: UITextField!

    var Secondtext:String!

    var delegate:secondViewDelegate!
    override func viewDidLoad() {
        super.viewDidLoad()
        secondOutputField.text = Secondtext

    }
    //popping back to first view controller using data
    @IBAction func popBtn(_ sender: Any) {
        if delegate?.popdata != nil
        {
        delegate.popdata(value: secondInputField.text!)
        }
    navigationController?.popViewController(animated: true)
    }
    //pushing to third view controller
    @IBAction func thirdPageBtn(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vcThird = storyboard.instantiateViewController(withIdentifier: "third") as! ThirdViewController
        navigationController?.pushViewController(vcThird, animated: true)
    }

}

ThirdViewController.swift

import UIKit
protocol thirdviewDelegate //delegate to pass data from thirs view to first view
{
    func thirdView(datas:String)
}
class ThirdViewController: UIViewController {

    var thirddelegate:thirdviewDelegate!

    @IBOutlet var thirdTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad
    }


    @IBAction func thirdViewInvoke(_ sender: Any) {
        if thirddelegate?.thirdView != nil
        {
        thirddelegate.thirdView(datas: thirdTextField.text!)
        }
    }


}

Снимок экрана OutPut: Pushing data no problem Popping data no problem Pass data from Third to First view Controller but its not passing value

Не работает только передача данных с контроллера третьего вида на первый, помогите мне решить эту проблему ... Спасибо

Ответы [ 4 ]

2 голосов
/ 11 февраля 2020

Вы можете использовать NotificationCenter для получения данных.

По нажатию кнопки «Получить данные» в вашем ThirdViewController, опубликуйте свой notification.

let myDataToPass : [String: Any] = ["myData" : yourStringValue]
NotificationCenter.default.post(name: Notification.Name("getDataPressed"), object: myDataToPass)

В вашем FirstViewController, добавьте наблюдателя в viewDidLoad, который будет слушать notification:

override func viewDidLoad() {
    super.viewDidLoad()
      NotificationCenter.default.addObserver(self, selector: #selector(receiveInitialDetails(notification:)), name: Notification.Name("getDataPressed"), object: nil)
}

//once the notification is received, this function will be called and you can get the data that you passed in thirdVC using notification.userInfo
@objc func receiveInitialDetails(notification : Notification) {
     let data = notification.userInfo as! [String:Any]
     let yourStringValue = data["myData"] as! String
     // you have your data here. downcast it to your desired data type.
}
1 голос
/ 11 февраля 2020

Вы можете сохранить данные третьего вида контроллера в UserDefaults. Сначала получите данные из пользовательских настроек по умолчанию. Просмотреть контроллер:

`UserDefaults.standard.set(yourData, forKey: "yourDataKey")` // at third view controller

`UserDefaults.standart.string(forKey: "yourDataKey")` //first view controller

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

1 голос
/ 11 февраля 2020

вы можете реализовать это, используя notification center

ниже. Я приведу небольшой пример, как я передаю imageDataDict в моем проекте

  let imageDataDict:[String: UIImage] = ["image": image]

  // Post a notification
  NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict) 

// Register to receive notification in your class
 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil)

 // handle notification
 func showSpinningWheel(notification: NSNotification) {
  if let image = notification.userInfo?["image"] as? UIImage {
  // do something with your image   
  }
 }
0 голосов
/ 11 февраля 2020

Причина, по которой ваш код не работает: как только вы переходите на второй контроллер представления, ваш третий контроллер представления освобождается от памяти. Нижняя строка не имеет смысла в первом контроллере вида

let vcThird = storyboard.instantiateViewController(withIdentifier: "third") as! ThirdViewController //third view

    vcThird.thirddelegate = self

Вы переходите во второй контроллер вида, контроллер третьего вида установлен в ноль.

  1. Либо вы можете использовать NSNotificationCenter для перемещения данных с третьего на первое.
  2. Если вы хотите go с протоколами, сделайте следующее изменение кода.

Код: ViewController.swift Удалите код:

let vcThird = storyboard.instantiateViewController(withIdentifier: "third") as! ThirdViewController //third view

        vcThird.thirddelegate = self

ThirdViewController.swift

protocol thirdviewDelegate //delegate to pass data from thirs view to first view
{
    func thirdView(datas:String)
}
class ThirdViewController: UIViewController {

    var thirddelegate:thirdviewDelegate?

    @IBOutlet var thirdTextField: UITextField!

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


    @IBAction func thirdViewInvoke(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let firstView = storyboard.instantiateViewController(withIdentifier: "first") as! ViewController //third view

        self.thirddelegate = firstView
        self.thirddelegate?.thirdView(datas: thirdTextField.text ?? "default value")
        self.navigationController?.popToRootViewController(animated: true)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...