【问题标题】:Swift - Using a singleton to share variables - Not passing overSwift - 使用单例共享变量 - 不传递
【发布时间】:2016-04-11 02:08:10
【问题描述】:

所以这真的很令人沮丧。我正在尝试使用单例来传递字符串变量,但它没有在第二个 UIViewController 上传递。

Singleton.swift

class CardName {

var cardName : String = ""

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

var returnedCardName : String {
    get{
        return self.cardName
    }

    set {
        self.cardName = newValue
    }
}}

查看 1:

CardName.sharedInstance.returnedCardName = "Single pass test"

print("Shared instance name set: \(CardName.sharedInstance.returnedCardName)")

print() 成功显示正确设置的字符串。

查看 2:

let card_name_shared = CardName.sharedInstance

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

    card_Name = card_name_shared.returnedCardName
    print("Passed Card Name: \(self.card_name_shared.returnedCardName)")

}

查看 2 个 print() 结果:

Passed Card Name:

我有这个设置与其他一些视图完全相同的方式,但我不知道为什么它不起作用。

我用

self.performSegueWithIdentifier("segue", sender: nil)

移动到下一个视图。不知道跟这个有没有关系。

我不明白 override func prepareForSegue 是如何工作的,或者它是否有帮助。

【问题讨论】:

  • 在你的印刷品中简单地使用 card_Name (没有 self. )。静态并不意味着恒常。可能您的 card_name_shared constance 是在 .returnedCardName 设置为您的字符串之前创建的
  • 您可以只在prepareForSegue 中传递您提到的数据,而不是使用全局单例。下面是它如何工作的示例:stackoverflow.com/a/29360924/215400

标签: swift singleton segue


【解决方案1】:

回答

您确定要在 写入后读取值吗?

请检查是否添加断点。

这就是您可以将读数从viewDidLoad 移动到viewDidAppear 的问题。

少即是多

您的Singleton 工作正常

// from my Playground
CardName.sharedInstance.returnedCardName = "123"
CardName.sharedInstance.returnedCardName // "123"

但是确实包含许多无用和冗余的代码:D

这是一个更好的版本

class CardName {
    static var sharedInstance = CardName()
    private init() {}

    var cardName: String?
}

请使用

CardName.sharedInstance.cardName = "something"

保存一个值。

CardName.sharedInstance.cardName

读取该值。

可选属性

如您所见,新属性声明为Optional String。这意味着它可以包含nil。与您使用的空 String 相比,这是表示缺少值的更好方法。

【讨论】:

  • 那行不通。当我将共享实例变量分配给本地字符串变量时,它使我使用 ! 解包它。运行应用程序时,它会崩溃。如果我将共享实例变量直接分配给 label.text,它会显示为空白。
  • 它在展开它时发现了 nil 值,这意味着它仍然没有设置任何值,但是当我打印出在视图 1 上设置为共享实例的值时,它可以工作。跨度>
  • 我会尝试 viewDidAppear() 代替。
  • 是的,我怀疑您在 写入它之前正在读取该值;)
  • 太棒了,成功了。我还是 Swift 的新手,能否解释一下使用 viewDidAppear() 编写它的含义或有一个我可以阅读的资源链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2013-03-21
  • 2016-05-07
相关资源
最近更新 更多