【问题标题】:Change variable and send it to second view controller更改变量并将其发送到第二个视图控制器
【发布时间】:2016-10-22 13:24:38
【问题描述】:

我正在为我的游戏创建一个商店屏幕。例如,您可以在哪里购买角色。当在商店视图上按下按钮时,我需要一个变量来更改,然后将其发送到下一个视图控制器。然后,第二个视图控制器将根据变量的值选择正确的播放器,我为商店视图控制器提供以下代码:

import Foundation
import UIKit

class Shop: UIViewController {

    @IBAction func buttonPressed(_ sender: AnyObject){
        var x = 1
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "segue") {
            let dest = segue.destination as! GameViewController
            dest.x = x
        }
    }
}

但是变量不是全局的,所以我该怎么做。任何建议将不胜感激。

【问题讨论】:

    标签: ios swift function uiviewcontroller


    【解决方案1】:

    根据您的要求,我认为全局 Singleton 对象是您的最佳选择。

    全局单例允许您跨控制器访问商店数据。

    例如

    class ShopManager {
        static let sharedInstance = ShopManager()
    
        var x = 0 // some initial value
    
        private init() {} //Ensures singleton is unique
    } 
    

    现在您可以在任何地方获取/设置ShopManager.sharedInstance.x(或在单例类中声明的任何其他变量/对象),而无需在控制器之间传递数据。

    import Foundation
    import UIKit
    
    class Shop: UIViewController {
    
        @IBAction func buttonPressed(_ sender: AnyObject){
            ShopManager.sharedInstance.x = 1
        }
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if (segue.identifier == "segue") {
                let dest = segue.destination as! GameViewController
                //no need to set dest.x here. just access ShopManager.sharedInstance.x from the destination controller!
            }
        }
    }
    
    class ShopManager {
        static let sharedInstance = ShopManager()
    
        var x = 0 // some initial value
    
        private init() {} //Ensures singleton is unique
    } 
    

    【讨论】:

    • 请注意,使用这种方法,prepare for segue 方法中根本不需要(假设您不需要传递任何其他内容)
    • 等一下我如何访问其他视图中的变量
    • @ArthurMacpherson 刚刚使用了ShopManager.sharedInstance.x。您需要在var x 之前删除static 关键字,因为它应该是一个实例变量
    • hmm 我不需要更改任何上述代码即可访问项目中任何视图/类中的变量。 ShopManager.x 应该可以从任何类/视图访问
    • @Danoram:是的,你可以,但你应该吗?如果你使用静态变量,单例sharedInstance 有什么意义?
    【解决方案2】:
    1. 您可以将x作为变量存储在ShopViewController中:

    var x: Int?
    
    @IBAction func buttonPressed(_ sender: AnyObject){
        x = 1
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "segueId") {
            let dest = segue.destination as! GameViewController
            dest.x = x
        }
    }
    
    1. 您可以add a segue from one controller to another 而不是一个确切的按钮,并从您的回调中执行它:

    @IBAction func buttonPressed(_ sender: AnyObject){
        performSegue(withIdentifier: "segueId", sender: 1)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "segueId") {
            let dest = segue.destination as! GameViewController
            dest.x = sender as! Int
        }
    }
    

    【讨论】:

    • 是的,单例在你的情况下是有意义的。但是,如果除了这两个控制器之外,该值不会在任何地方使用,那么不全局公开它可能是一个更好的选择。因此,这取决于在特定情况下哪种方法更合适。
    猜你喜欢
    • 2012-07-11
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多