我剛剛注意到在其IBAction中設置UISwitch的isOn
導致IBAction被再次調用。所以下面的代碼:設置UISwitch isOn以編程方式從IBAction再次調用IBAction
class ViewController: UIViewController {
var count = 0
@IBOutlet weak var mySwitch: UISwitch!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
mySwitch.isOn = false
}
@IBAction func buttonTapped(_ sender: UIButton) {
mySwitch.isOn = !mySwitch.isOn
}
@IBAction func switchChanged(_ sender: UISwitch) {
print("\(count) pre: \(mySwitch.isOn)")
mySwitch.isOn = !mySwitch.isOn
print("\(count) post: \(mySwitch.isOn)")
count += 1
}
}
打印當開關被導通一個時間以下:
0 pre: true
0 post: false
1 pre: false
1 post: true
- 開關在
viewDidLoad
- 開關關斷是由用戶 接通
- 當
switchChanged
(IBAction)被調用時,開關處於開啓狀態 0 pre: true
印刷- 開關被關斷以編程在
switchChanged
0 post: false
印刷switchChanged
由系統- 開關關斷現在
switchChanged
再次調用,並且1 pre: false
稱爲 - 開關被接通以編程方式
1 post: true
is printed
爲什麼系統第二次調用IBAction?例如,當一個人想要根據內部狀態否定用戶的行爲時,如何解決這個問題?我覺得我錯過了一些令人尷尬的顯而易見的東西,但我非常肯定類似的代碼用於工作。這是一個iOS錯誤?它被在iOS 10.2 iPhone 5S模擬器上運行時,Xcode版本8.2.1(8C1002)
有趣的是,當綁buttonTapped
按鈕被竊聽(調用同樣的方法),該交換機的IBAction爲不叫。
您可能已將開關事件處理程序連接到兩個不同的事件。 – gnasher729
我對它進行了測試,並看到了與之相同的行爲。只有通過點擊來改變開關,通過拖動來改變它只會導致被調用一次。 – dan
切換'switchChanged'中的開關沒有任何意義。如果你想讓開關關閉,明確地將其設置爲關閉,那麼再次調用該方法並不重要,因爲第二次它將關閉,並且將它設置爲關閉並且不會被調用再次。 – Paulw11