【问题标题】:How can I change the data between ViewControllers as an action?如何将 ViewController 之间的数据作为操作更改?
【发布时间】:2017-10-09 15:09:07
【问题描述】:

我在将 ViewController 之间的数据作为操作传递时遇到问题。这意味着以下内容:

ViewController1 - NavigationControllers 等 - ...
                                                 |
                                                 |
ViewController2 - - - - - - ...

所以我有两个 ViewController。 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.

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

【问题讨论】:

  • 您可以通过代码创建一个 segue 以返回到视图控制器 1 并传递数据,或者您可以拥有一个类并编辑一个类,并且由于类是引用类型,因此将其更改为一个place 将在另一个地方更改它。
  • 如果按下按钮时 ViewController1 对象仍在内存中,您可以向其发送通知并附加数据作为通知对象或用户信息字典。
  • 其实有很多方法可以做到这一点。你可以使用通知、委托、单例类...
  • 好的,谢谢大家,等我找到最佳解决方案后再给您回信????????

标签: swift xcode uiviewcontroller swift3 action


【解决方案1】:

看看吧:

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

【讨论】:

  • 酷,谢谢,我没有得到第 8 行 (viewController.someButtonTappedHandler = { [weak self]'...),但我会试试这个!
  • @T.Meyer "我没有得到第 8 行" - 在第 8 行中,你弱化了self。永远不要在块内使用强引用。
  • 好的 - 明白了 ;-)
  • 嗯,我必须使用什么样的segue?目前,总是有一个运行时错误说 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_Wins.GameOptionsController startNewGame:]: unrecognized selector sent to instance 0x7fceb663c530'
  • Muravev 谢谢你的帮助,我现在用 Singletons 解决了。在下面添加了我的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多