所以这真令人沮丧。我尝试使用单例来传递字符串变量,但它没有在第二个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)
转到下一个视图。我不知道这与它有什么关系。
我不明白覆盖功能prepareForSegue是如何工作的,或者它是否有用。
答案 0 :(得分:4)
您确定在>>之后阅读了这个值吗?
请检查它是否添加断点。
这是您可以将阅读从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
。