如何将ViewControllers之间的数据更改为操作?

时间:2017-05-10 19:42:55

标签: swift xcode uiviewcontroller swift3 action

我遇到了在ViewControllers之间传递数据作为操作的问题。这意味着:

ViewController1 - NavigationControllers, etc. - ...
                                                 |
                                                 |
ViewController2    -     -    -    -    -   -   ...

所以我有两个ViewControllers。 ViewController1有一个变量(让我们说var myName:String =“Joana”) 我想通过单击ViewController2中的按钮来更改它。 我的问题是:我怎么能这样做(我知道如何在通过segue直接连接但不与动作结合的VC之间传递数据,这是我的问题)? 我听说过准备(对于segue:UIStoryboardSegue,发送者:Any?),但我认为只有在两个VC之间存在segue(直接)时它才有效。 总结:

VC2: Button: action -> change var 'myname' on VC1 to 'hello', no direct segue.

提前感谢您的帮助! : - )

2 个答案:

答案 0 :(得分:0)

看看它:

class FirstVC: UIViewController {
    var someAttribute: String = "ola!"

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let segueIdentifier = segue.identifier else { return }
        if segueIdentifier == "YourSegueIdentifierFromStoryBoard" {
            guard let viewController = segue.destination as? SecondVC else { return }
            // someAttribute == "ola!"
            viewController.someButtonTappedHandler = { [weak self] (newValue) in
                guard let strongSelf = self else { return }
                strongSelf.someAttribute = newValue
                // someAttribute == "Bla Bla Bla!"
            }
        }
    }
}

class SecondVC: UIViewController {
    var someButtonTappedHandler: ((String) -> Void)?

    @IBAction func someButtonTapped() {
        if let handler = someButtonTappedHandler {
            handler("Bla Bla Bla!")
        }
    }
}

答案 1 :(得分:0)

我现在解决了我的问题如下:

final class Singleton{
    private init(){ }

    static let shared = Singleton()

    var someInt: Int = Int()
}

所以我宣布一个单身人士。 下一步:

class ViewControllerOne: UIViewController{
    [Outlets,...]
    override func viewDidLoad() {
        super.viewDidLoad()

        let integer = Singleton.shared.someInt
        print("We're in Class: ViewController and Singleton.shared.someInt = \(integer).\n")
        Singleton.shared.someInt = integer
        myLabel.text = "\(Singleton.shared.someInt)"
    }
}

第二个VC:

class ViewControllerTwo: UIViewController{
    [...]
    override func viewDidLoad() {
            super.viewDidLoad()

            let integer = Singleton.shared.someInt
            print("We're in Class: SecondVC and Singleton.shared.someInt = \(integer).\n")
            Singleton.shared.someInt = 5
            if Singleton.shared.someInt == 5{
                print("Singleton.shared.someInt changed to 5 in Class SecondVC.\n")
            }

        }
}

我的故事板看起来像这样:

The storyboard

让我知道是否有任何错误,但它对我有用。

我也找到帮助的另一个链接:

Help