Swift 如何作为操作更改ViewController之间的数据?

Swift 如何作为操作更改ViewController之间的数据?,swift,xcode,uiviewcontroller,swift3,action,Swift,Xcode,Uiviewcontroller,Swift3,Action,我在ViewController之间作为操作传递数据时遇到问题。这意味着: ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ... final

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

ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ...
final class Singleton{
    private init(){ }

    static let shared = Singleton()

    var someInt: Int = Int()
}
ViewController1-导航控制器等-。。。 | | ViewController2----。。。 所以我有两个视图控制器。ViewController1有一个变量(比如var myName:String=“Joana”) 我想通过点击ViewController2中的一个按钮来改变它。 我的问题是:我如何做到这一点(我知道如何在通过segue直接连接但不与动作结合的VCs之间传递数据,这是我的问题)? 我听说过prepare(对于segue:UIStoryboardSegue,sender:Any?),但我认为它只有在两个风投之间(直接)存在segue时才有效。 总结如下:

VC2:按钮:操作->将VC1上的变量“myname”更改为“hello”,无直接序列。

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

看看它:

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

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

ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ...
final class Singleton{
    private init(){ }

    static let shared = Singleton()

    var someInt: Int = Int()
}
所以我宣布单身。 下一步:

第二个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")
            }

        }
}
我的故事板如下所示:

如果有任何错误,请告诉我,但它对我有效

我还找到了另一个帮助链接:


您可以通过代码创建一个序列返回到view controller 1并传递数据,或者您可以创建一个类并编辑一个类,因为类是引用类型,在一个位置更改它将在另一个位置更改它。如果按下按钮时ViewController1对象仍在内存中,您可以向它发送通知,并将数据附加为通知对象或用户信息字典。实际上,有很多方法可以做到这一点。你可以使用通知、委托、单例类……好的,谢谢大家,我会看一看,找到最佳解决方案后给你们回信。酷,谢谢,我没有得到第8行(viewController.someButtonTappedHandler={[weak self]'…),但我会试试!@t.Meyer“我没有得到第8行”-在第8行中,你是软弱的
self
。你不应该在块内使用强引用。好的-明白了;-)嗯,我必须使用什么样的序列?目前,总是有一个运行时错误,说由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u Wins.gameoptioncontroller startNewGame:]:无法识别的选择器已发送到实例0x7fceb663c530'MuravevThanks感谢您的帮助,我现在使用Singleton解决了此问题。在下面添加了我的答案。