2017-05-02 94 views
0

我已經在我的項目中使用了UIButton的子類。這些UIButton子類將具有根據用戶在設置中選擇的內容而改變的邊框顏色。該設置用UserDefaults保存。通過UserDefault設置更新子類UIButton的屬性

問題: 當我加載的應用程序的第一次,按鈕邊框是正確的顏色 - 但是,當我改變設置(以最終改變按鈕邊框) - 什麼也沒有發生。一旦我關閉了應用並重新打開,按鈕只會改變顏色。

我的代碼

class CustomSeasonButton: UIButton { 
var seasonCold = Bool() 
let nsDefaults = UserDefaults.standard 
var notification = Notification(name: Notification.Name(rawValue: "themeChanged")) 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     // ... 
     self.seasonCold = nsDefaults.bool(forKey: "savedSeasonDefault") 
     NotificationCenter.default.addObserver(self, selector: #selector(self.refreshButtonBorder), name: notification.name, object: nil) 

     refreshButtonBorder() 
    } 

func refreshButtonBorder() { 
    print("Notification Received") 
    if seasonCold { 
     seasonCold = false 
     self.layer.borderColor = UIColor.blue 
    } 
    else { 
     seasonCold = true 
     self.layer.borderColor = UIColor.red 
    } 
} 


} 

設置

class SettingsVC: UITableViewController { 
//... 
    var notification = Notification(name: Notification.Name(rawValue: "themeChanged")) 
//... 
} 

然後在賽季IBAction爲選擇 - 我有以下幾點:

NotificationCenter.default.post(notification) 

因此,您可能會從上面的代碼中看到,按鈕邊框顏色應該在藍色和紅色之間切換,具體取決於UserDefaults選擇的內容。

我可以改變邊框顏色的唯一方法就是關閉應用程序並重新打開它。

問題: 我怎樣才能確保UIButton的子類得到了邊框顏色更改每次設置(UserDefaults)更新時間?謝謝!

+0

你想改變現有的按鈕設置改變時? – rmaddy

+0

@rmaddy - 正確!用戶可以在設置視圖中更改季節設置。根據選擇哪個季節,其他(子類)UIButton的邊框顏色應相應更改。 – Joe

回答

1
seasonCold = false { 
    didSet { 
     refreshButtonBorder() 
    } 
} 


func refreshButtonBorder() { 
    if seasonCold { 
     self.layer.borderColor = UIColor.blue 
    } 
    else { 
     self.layer.borderColor = UIColor.red 
    } 
} 

,並設置seasonCold只要更改userdefaults「savedSeasonDefault」

對一對多呼叫使用通知中心,子類的按鈕的每個實例都應該有一個NotificationObserver,並張貼通知,每當UserDefaults改變

var notification = Notification(name: Notification.Name(rawValue: "seasonChanged")) 
清醒

從筆尖或您的初始化函數

NotificationCenter.default.addObserver(self, selector: #selector(self.refreshButtonBorder), name: notification.name, object: nil) 

每當季節變化寒冷灑通知灰塵

NotificationCenter.default.post(notification) 
+0

但是最難的部分就是你在答案中忽略了什麼 - 當設置改變時,爲每個現有的'UIButton'更新'seasonCold'。 – rmaddy

+0

編輯包括^ –

+0

@Gaston岡薩雷斯 - 感謝您在這裏的幫助。自從我與NSNotificationCenter合作以來,這已經太長時間了,所以我在這裏有點生疏。我編輯了我原來的帖子。 「收到Notifcation」正在打印(儘管每次更換按鈕時打印9次!) - 但是,邊框仍然沒有變化。任何提示都讚賞 – Joe

1

對於您的按鈕來即時更改,他們必須知道設置已更改。他們必須收聽某種類型的廣播消息,並在設置被修改時採取一些措施。一種方法可能是通過NSNotificationCenter - 創建它們時的所有按鈕都可以在默認通知中心收聽消息,然後當您注意到設置已更改時,您可以廣播消息。

至於上面的代碼,請注意您在init方法中設置邊框顏色。當按鈕被創建時,該方法只被調用一次。這就解釋了爲什麼你的按鈕的邊框顏色不會改變......他們的顏色是在創建時建立的。

最後,您可能會對您感興趣(如果您不知道),可以瞭解有關[UIAppearance][1]的更多信息以及它可以讓您一次影響整組控件的顏色和樣式。

+0

謝謝你的見解,斯科特!有其他方法可以使用嗎?像awakeFromNib? – Joe

+0

awakeFromNib在對象從nib文件「重組」之後被調用,只有在它們首次被創建時纔會被重新調用。您希望您的按鈕能夠即時更新,以便在應用程序運行時他們必須積極關注自己的命運。 –

+0

是否有必要刪除observer在deinit?這是針對ios 9+的嗎?我是否需要添加'deinitiment.default.removeObserver(self) }'? – Joe