2017-05-31 34 views
2

大家好我想要在Singleton類中的一個字符串屬性上實現KVO。當我嘗試添加觀察者時,我正遇到一些錯誤,並希望有人能告訴我我做錯了什麼。 下面顯示了我的單身人士課程。單身屬性的KVO?

class User: NSObject { 

    static let currentUser = User() 
    private override init() {} 

    var pictureString: String? 
} 

在單獨的ViewController的viewDidLoad中,我試圖添加一個觀察者到像這樣的pictureString變量。

self.addObserver(self, forKeyPath: #keyPath(User.currentUser.pictureString), options: [.old, .new, .initial], context: nil) 

我現在正在處理的問題是,它指出currentUser不符合KVC。我目前正在獲取下面的錯誤。

addObserver: forKeyPath:@"currentUser.pictureString" options:7 context:0x0] was sent to an object that is not KVC-compliant for the "currentUser" property.' 

我很感激任何幫助謝謝。

+1

是因爲'profilePic'屬性在'User'類中不存在嗎? – Rishab

+0

我想你想使用'pictureString',而不是'profilePic' – Tj3n

+0

oops editted。我仍然有同樣的錯誤,無論 – victorydub

回答

5

this answer

至於現在,斯威夫特不能觀察到的類屬性。

如果你真的想用一個單身,你可以用一個正常的財產,然後也可以KVO'd ......像這樣把它轉換成非靜態單:

class UserManager: NSObject { 
    private override init() {} 
    static var instance = UserManager() 
    var currentUser = User() 
} 

class User: NSObject { 
    dynamic var pictureString: String? 
} 

注意變量聲明中的dynamic關鍵字 - 這是使KVO在Swift中工作所必需的(動態分派被解釋爲here)。

然後在你的VC的viewDidLoad你可以用這個修改註冊:

UserManager.instance.addObserver(self, forKeyPath: #keyPath(UserManager.currentUser.pictureString), options: [.old, .new, .initial], context: nil) 
+0

gotcha感謝信息 – victorydub

+0

不知道#keyPath(),非常有幫助謝謝你! – nickromano

0
class Viewcontroller: UIViewController { 

    let user = User.currentUser 

    override viewDidLoad() { 
    super.viewDidLoad() 
    addObserver(self, forKeyPath: #keyPath(user.pictureString), options: [.old, .new], context: nil) 
    } 
} 

你可以宣佈你的單,並利用它來進行#keyPath。否則,您將引發異常。