ios - 在 Swift 中从 View Controller 传回对象

标签 ios swift object initialization segue

我有三个 View Controller - OneVC、TwoVC 和 ThreeVC - 使用 push segues。在 OneVC 上,创建了一个名为 firstObject 的对象,它的值在用户填写文本字段时设置。除了创建的对象称为 secondObject 之外,TwoVC 也发生类似情况。对象通过 prepareForSegue() 传递给下一个 View Controller 。

当从 ThreeVC -> TwoVC 移动“后退”时,文本字段保持填充状态。

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

两个VC:

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

三个VC:

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

Source code

最佳答案

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

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

protocol writeValueBackDelegate {
    func writeValueBack(value: String)
}

在您的第一个 ViewController 上,在加载第二个 VC 时设置您的委托(delegate)。现在您可以从第二个开始将对象保存在第一个 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
}
}

两个VC:

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

关于ios - 在 Swift 中从 View Controller 传回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34799680/

相关文章:

ios - cellForRowAtIndexPath : UILabel overlaps after scroll

ios - ARKit - 最初将对象以相机的特定航向/角度放置在 ARSKView 中

ios - Swift 中的 PureLayout 与 Cocoapods

ios - 如何在 Today 扩展中调整 UITableView 的大小

javascript - knockout : Iterate over object and show value in dropdown

javascript - 难以理解 JavaScript 中的基本对象工作原理

javascript绑定(bind)对象的原型(prototype)函数

iphone - UIViewController 中的继承

ios - 自定义 View 上的 AirPlay 按钮 - 问题

ios - 什么是 NSNumberFormatter 默认 roundingMode