所以这真令人沮丧。我正在尝试使用单例传递字符串变量,但它没有在第二个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)
移至下一个视图。我不知道这是否与它有关。
我不了解覆写func prepareForSegue的工作原理或是否有帮助。
您确定要在写入值后读取它吗?
请检查添加断点。
它这是你可以在阅读从移动问题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
您使用的空值相比,这是一种更好的表示缺少价值的方法。