繁体   English   中英

在Swift中从视图控制器传回对象

[英]Passing objects back from view controllers in Swift

我有三个使用推式选择器的视图控制器-OneVC,TwoVC和ThreeVC。 在OneVC上,将创建一个名为firstObject的对象,并在用户填写文本字段时设置其值。 除了创建的对象称为secondObject以外,TwoVC上也会发生类似的情况。 这些对象通过prepareForSegue()传递给下一个视图控制器。

从ThreeVC-> TwoVC中移动“返回”时,textFields保持填充。

TwoVC-> OneVC,仍然填写文本字段。

我要修复的是从OneVC-> TwoVC再次前进时,TwoVC中的文本字段已清除,但我希望它保留以前填写的内容,并在第一次时设置为secondBrand.someValue。 我猜想这与我如何在TwoVC中初始化secondObject有关。 我应该在这里做什么?

这是我的代码:

对象自定义类:

class Object {
    var someValue: String = ""
}

OneVC:

class OneVC: UIViewController {

    var firstObject: Object!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.firstObject = Object()
    }

    @IBAction func textFieldDidChange(textField: UITextField) {
        firstObject.someValue = textField.text!
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "OneToTwoSegue" {
            let twoVC = segue.destinationViewController as! TwoVC
            twoVC.firstObject = firstObject
        }
    }
}

TwoVC:

class TwoVC: UIViewController {

    var firstObject: Object!
    var secondObject: Object!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.secondObject = Object()
    }

    @IBAction func textFieldDidChange(textField: UITextField) {
        secondObject.someValue = textField.text!
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "TwoToThreeSegue" {
            let threeVC = segue.destinationViewController as! ThreeVC
            threeVC.firstObject = firstObject
            threeVC.secondObject = secondObject
        }
    }
}

ThreeVC:

class ThreeVC: UIViewController {
    @IBOutlet weak var firstObjectLabel: UILabel!
    @IBOutlet weak var secondObjectLabel: UILabel!

    var firstObject: Object!
    var secondObject: Object!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        firstObjectLabel.text = "firstObject.someValue = \(firstObject.someValue)"
        secondObjectLabel.text = "secondObject.someValue = \(secondObject.someValue)"
    }
}

源代码

听起来好像您想在释放对象之前将对象从第二个ViewController传回到第一个ViewController,然后再次将其传递到第二个ViewController并在文本字段中显示。

为了将对象传回,请创建委托协议。 例如,创建一个名为“ Protocol.swift”的文件:

protocol writeValueBackDelegate {
    func writeValueBack(value: String)
}

在第一个ViewController上,在加载第二个VC时设置委托。 现在,您可以在第二个ViewController中保存对象。

最终代码如下所示:

class Object {
    var someValue: String = ""
}

OneVC:

class OneVC: UIViewController, writeValueBackDelegate {

var firstObject: Object!
var secondObject: Object!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.firstObject = Object()
    self.secondObject = Object()
}

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

@IBAction func textFieldDidChange(textField: UITextField) {
    firstObject.someValue = textField.text!
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "OneToTwoSegue" {
        let twoVC = segue.destinationViewController as! TwoVC
        //set OneVC to be a delegate for a TwoVC
        twoVC.delegate = self

        twoVC.firstObject = firstObject
        twoVC.secondObject = secondObject
    }
}

func writeValueBack(value: String) {
    // This is my value from my second View Controller
    print("first:" + value)
    self.secondObject.someValue = value
}
}

TwoVC:

class TwoVC: UIViewController {

var delegate: writeValueBackDelegate?


@IBOutlet weak var inputField: UITextField!
var firstObject: Object!
var secondObject: Object!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    inputField.text = secondObject.someValue

}

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

@IBAction func textFieldDidChange(textField: UITextField) {
    secondObject.someValue = textField.text!
    // Save the value in the delegate
    delegate?.writeValueBack(secondObject.someValue)
}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "TwoToThreeSegue" {
        let threeVC = segue.destinationViewController as! ThreeVC
        threeVC.firstObject = firstObject
        threeVC.secondObject = secondObject
    }
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM