2016-07-02 81 views
1

我有一個字符串類型變量多數民衆贊成值通過PickerView更新,而當該值被更新時,然後更新按鈕的標題,比如:如何使用swift監聽變量中的值更改?

@IBOutlet weak var selectedCountry: UIButton! 

var pickedCountry: String? 

func checkForPickedCountry() { 
     if self.pickedCountry != nil { 
      selectedCountry.setTitle("\(pickedCountry!)", forState: .Normal); 
     } else { 
      selectedCountry.setTitle("Tap here pick a country", forState: .Normal); 
     } 

UPDATE

現在就像我提到的那樣,我使用pickerView來更新pickedCountry的值,並且當從pickerView中選擇一個國家時,它會顯示第二個按鈕,標題爲selectedFlag,它會拍攝另一個pickerView來選擇國旗。現在我想聽第一個pickedCountry變化的原因是我可以將selectedFlag按鈕的標題更改爲默認值。

因此,這裏是最後的代碼,我有:

@IBOutlet weak var selectedCountry: UIButton! 
@IBOutlet weak var selectedFlag: UIButton! 

var pickedCountry: String? 
var pickedFlag: String? 

func checkForPickedCountry() { 
     if self.pickedCountry != nil { 
      selectedCountry.setTitle("\(pickedCountry!)", forState: .Normal); 
      selectedFlag.hidden = false 
     } else { 
      selectedCountry.setTitle("Tap here pick a country", forState: .Normal); 
      selectedFlag.hidden = true 
     } 


     if self.pickedFlag != nil { 
      selectedFlag.setTitle("\(pickedCountry!)", forState: .Normal); 
     } else { 
      selectedFlag.setTitle("Tap here to pick a flag", forState: .Normal) 
     } 

現在我該怎樣設置selectedFlag的標題爲「點擊這裏picka標誌時PickedCountry的`值改變??

回答

1

您可以使用簡單的邏輯如下::

設置一個int變量var flag : Int = 0現在,在整個節目標誌具有值爲0。

再次在點擊按鈕通過self.flag在點擊它的值改爲1 = 1再次第二個使它通過self.flag = 0

0通過獲得該標誌的值變量你會聽的事件。

可以通過提供值2,3,4在變量調用你的函數每次當變量變化做相同了兩個多...要標誌變量

1

您可以實現willSet。你也可以修改你的函數來得到像這樣的新值:

var pickedCountry: String? { 
    willSet(newValue) { 
     guard let oldValue = str, new = newValue else { return } 
     if oldValue != new { //....Your value is changed } 
    } 
} 

func checkForPickedCountry(updatedValue: String) {...} 
+0

如果我不想修改已經存在的函數,但只是在值更改時觸發一個全新的函數,該怎麼辦?基本上說「如果pickCountry'的值改變了,改變uibutton藍色的背景顏色 –

+0

只要在willSet()中調用你的函數而不通過任何值 –

+0

即時通訊對不起,但我想我的問題太大,因爲你的方法kind've並沒有幫助我的情況,因爲我認爲這是,請檢查更新的問題.. –

0

你可以使用鍵值觀察者來監視它。

在是應該去尋找變化的類,請執行下列操作:

添加觀察者

func addObservers() { 
    let observerKeyLocation = "pickedConuntry" 
    classThatMonitors.addObserver(self, forKeyPath: observerKeyLocation, options: .New, context: nil) 
} 

然後,覆蓋observerValueForKeyPath功能:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    if keyPath == observerKeyLocation { 
     if self.pickedCountry != nil { 
      selectedCountry.setTitle("\(pickedCountry!)", forState: .Normal); 
     } else { 
      selectedCountry.setTitle("Tap here pick a country", forState: .Normal); 
     } 
    } 
} 

現在,無論何時該值被更改,您的觀察者都會立即更新,並可以調用您放置在其中的代碼。請記住,如果您決定觀察課程,您還必須移除觀察者以避免碰撞。

+0

即時通訊稍微拋出,你如何期待函數'observervalueForKeyPath ''知道'observeKeyLocation'是不是一個通用變量,並且被困在'func addObservers()'內部? –

+0

通過使'observerValueForKeyPath'通用,增加了'classThatMonitors.addObserver(self, forKeyPath:observerKeyLocation,options:.New,context:nil)'在我的'viewDidLoad'中,而不是我的應用程序墜毀.. –