切换视图后,单例变量变为空

时间:2020-06-04 09:34:46

标签: swift singleton

我创建了一个单例课程,可以从任何其他课程访问用户的电子邮件,以便轻松将数据上传到云。我可以在第一个视图中打印电子邮件,但是当我尝试在其他视图中访问电子邮件或返回该视图时,它显示为空。

class SingletonAccount: NSObject {

static var shared: SingletonAccount = SingletonAccount()
var userEmail: String = "ABCD"

}

我还将单例设置为仅在appDelegate中初始化,以便可以在所有其他类之间共享。

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var userAccount: SingletonAccount?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        userAccount = SingletonAccount.shared
        return true
    }

下面是启动时出现的第一个视图控制器

weak var userAccount: SingletonAccount?


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.isHidden = true

        print(userAccount!.userEmail)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: #selector(LoginViewController.tapRegister))
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        userAccount = appDelegate.userAccount
        self.registerLbl.addGestureRecognizer(tap)
        // Do any additional setup after loading the view.
    }

2 个答案:

答案 0 :(得分:0)

您要在视图控制器中声明userAccount的新实例。如果您必须在appDelegate中使用var

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let aVariable = appDelegate.userAccount

我只会一直使用SingletonAccount.shared。或在SingletonAccount类之外

全局定义您的singleton
let gSingletonAccount: SingletonAccount = SingletonAccount()
class SingletonAccount: NSObject {
var userEmail: String = "ABCD"
}

答案 1 :(得分:0)

单例的好处是可以从任何地方访问同一实例。

AppDelegate中声明属性是没有意义的。只需使用

获取邮件地址
let email = SingletonAccount.shared.userEmail

并声明shared为常量。描述 Singleton 表示一个常数。

static let shared = SingletonAccount()

该类不必从NSObject继承,甚至单例也不必是一个类。