将数据从detailViewController传递回masterViewController

时间:2016-11-30 08:17:43

标签: ios swift uinavigationcontroller

我正在尝试从第二个viewController传回数据。 没有NavigationController,我可以做到这一点。但现在我需要使用NavigationController。然后我的代码像以前一样工作。数据不会通过。 这是简单的代码: 在第一个viewController中

class ViewController: UIViewController, backfromSecond {

    @IBOutlet weak var text: UILabel!

    var string : String?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.string = "Start here"
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.text.text = self.string
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationViewController = segue.destination as? secondViewController{
            destinationViewController.delegate = self
        }
    }

    func back(text: String) {
        self.string = text
        print(text)
    }
}

第二个viewController:

    protocol backfromSecond {
    func back(text: String)
    } 
    class secondViewController: UIViewController {
    var string : String = "nothing here"
    var delegate : backfromSecond?
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate?.back(text: string)
        // Do any additional setup after loading the view.
    }
}

这里有什么问题?

4 个答案:

答案 0 :(得分:0)

我认为你的问题在于准备segue方法。如果视图控制器在导航堆栈上,我认为您的代码应该类似于

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destination as? UINavigationController).topViewController as! secondViewController{
        destinationViewController.delegate = self
    }
}

答案 1 :(得分:0)

这对我有用。

第一次VC

class ViewController: UIViewController, backfromSecond {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
  @IBAction func Passingfrom1stVCTo2ndVC(_ sender: AnyObject) {
        if let vc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController3") as? ViewController3{
            vc.dataFrom1StVC = "message send from 1st VC"
            vc.delegate = self
           self.navigationController?.pushViewController(vc, animated: true)
        }
    }
    func back(text: String) {
        print("data\(text)")
    }
    }

第二个VC。

protocol backfromSecond: class {
    func back(text: String)
}

class ViewController3: UIViewController {

    var dataFrom1StVC : String? = nil
    week var delegate : backfromSecond?
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func DataSendFrom2ndVCTo1stVC(_ sender: AnyObject) {
        self.delegate?.back(text: "Message Send From 2nd vc to 1st VC")
        self.navigationController?.popViewController(animated: true)
    }
}

我希望它会对你有用。如果有任何问题,请问我,我会帮助你。

答案 2 :(得分:0)

您可以使用展开segue来传回数据。 这是一个教程 https://spin.atomicobject.com/2014/10/25/ios-unwind-segues/

答案 3 :(得分:0)

假设A& B是两个控制器,您首先使用一些数据从A导航到B.现在你想用一些数据从B到A进行POP。

Unwind Segues是最好的推荐方式。 以下是步骤。

  1. 打开A.m
  2. 定义以下方法

    @IBAction func unwindSegueFromBtoA(segue:UIStoryNoardSegue){

    }

  3. 打开故事板

  4. 选择B ViewController并单击ViewController outlet。按下控制键并拖动到“退出”键。插座,让鼠标留在这里。在下图中,所选图标为ViewController插座,最后一个带退出标志的图标为Exit Outlet。

  5. 您将看到“unwindSegueFromBtoA'弹出窗口中的方法。选择此方法。

  6. 现在,您将在左侧的视图控制器层次结构中看到一个segue。您将在下面的图片中看到您在StoryBoard Entry Piont附近创建的segue。

  7. You View Hierarchy

    1. 选择此项并为其设置标识符。 (建议设置与方法相同的名称 - unwindSegueFromBtoA)

    2. 开放B.m.现在,无论您想要弹出哪个A.使用

      self.performSegueWithIdentifier(" unwindSegueFromBtoA",sender:dataToSend)

    3. 现在,当您弹出' A',' unwindSegueFromBtoA'方法将被调用。在' A'的unwindSegueFromBtoA中您可以访问' B'

    4. 的任何对象
    5. 那就是......!