【问题标题】:Swift Passing data from appDelegate to another classSwift将数据从appDelegate传递到另一个类
【发布时间】:2014-12-30 04:58:23
【问题描述】:

我需要将一个变量从 AppDelegate 传递给我创建的另一个类来保存项目的全局变量,但我无法找到使其工作的方法。

这是 AppDelegate 中的代码:

func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
    println("Device's token is: \(deviceToken)")

    //Global Variables Class Instance
    let globals:Globals = Globals()

    globals.setDeviceToken("test1") //method1 not working
    globals.deviceToken = "test2"   //method2 not working
}

这是我的全局类:

public class Globals {
    var deviceToken = String()

    init() {
        //nothing
    }

    func setDeviceToken(s:String){
        deviceToken = s
    }

    func getDeviceToken() -> String {
        return deviceToken
    }
}

如果我尝试从项目的其他文件中打印该值,我无法得到任何东西,只是一个空字符串。

class ViewController: UIViewController {

    //Global Variables Class Instance
    let globals:Globals = Globals()

    override func viewDidLoad() {
        println(globals.getDeviceToken())  //return empty string
        println(globals.deviceToken)       //return empty string

【问题讨论】:

  • 应用委托中应该保存多少数据?没有!曾经!不要这样做。这不是应用程序委托的用途。
  • 没有必要生气,我只是一个初学者,我正在努力学习。 @雾迈斯特

标签: ios swift parameter-passing appdelegate


【解决方案1】:

您可以使用多种模式来实现您想要的效果

  1. 您可以通过 UIApplication 访问 AppDelegate:

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate
    let deviceToken = delegate.deviceToken
    
  2. 查看单身人士。在谷歌上快速搜索“Swift singleton”会让你走得很远。第一个结果:

    class SingletonB {
    
            class var sharedInstance : SingletonB {
            struct Static {
                static let instance : SingletonB = SingletonB()
            }
            return Static.instance
        }
    }
    

然后使用sharedInstance 在任何地方实例化单例并访问相同的变量。

第一个既快又脏,所以对于更严肃的项目,我会推荐单例模式。

可能有一百万种方法可以做到这一点,但这应该让你开始

(更多内容请参见此链接,其中探讨了实现单例的几种方法:https://github.com/hpique/SwiftSingleton

【讨论】:

  • 感谢您的回复。我从来没有使用过单例,需要阅读一些关于它的文档。但是代码看起来与我用于 Globals 的代码非常相似。 @鲍勃沃克
  • 如链接到文章中所述,如果您使用的是 Swift 1.2 或更高版本,则不需要上述相当复杂的创建单例的方法。
【解决方案2】:

我只是使用 NSUserDefaults 解决了我的问题

在 AppDelegate 中:

NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "deviceToken")
NSUserDefaults.standardUserDefaults().synchronize()

来自其他类:

NSUserDefaults.standardUserDefaults().objectForKey("deviceToken")

老实说,我不知道这是否是一个好方法,但它正在工作

【讨论】:

  • 嗨!我想知道为什么不建议使用 NSUserDefaults ?
  • mattyU 你需要在这里问@Fogmeister,因为他评论了我的问题
  • NSUserdefaults 存储数据需要时间,而且你不能毫无问题地存储任何类型的数据。 NSUserdefaults 应该只用于在会话之间保存数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多