2016-07-02 50 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'中,而不是我的应用程序坠毁.. –