iOS开发中UISwitch触发unrecognized selector报错问题咨询
iOS开发UISwitch联动报错:未识别选择器问题解析
报错信息
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[controlFun.ViewController rightSwitch:]: unrecognized selector sent to instance 0x14a508110' terminating with uncaught exception of type NSException CoreSimulator 802.6 - Device: iPhone 13 mini (D69A2208-197A-44A5-8CEF-BD9CBDA18565) - Runtime: iOS 15.4 (19E240) - DeviceType: iPhone 13 mini
问题场景
在实现两个UISwitch状态联动功能时触发上述报错,排查后删除Storyboard中rightSwitch的Value Changed事件与ViewController rightSwitch:的关联,问题解决。疑惑该关联的来源及本质。
相关代码
import UIKit class ViewController: UIViewController { @IBOutlet weak var numberField: UITextField! @IBOutlet weak var nameField: UITextField! @IBOutlet weak var sliderLabel: UILabel! @IBOutlet weak var doSomethingButton: UIButton! @IBOutlet weak var rightSwitch: UISwitch! @IBOutlet weak var leftSwitch: UISwitch! override func viewDidLoad() { sliderLabel.text = "50" super.viewDidLoad() } @IBAction func textFieldDoneEditing(sender: UITextField) { sender.resignFirstResponder() } @IBAction func onTapGestureRecognized(_ sender: Any) { nameField.resignFirstResponder() numberField.resignFirstResponder() } @IBAction func sliderChanged(_ sender: UISlider) { sliderLabel.text = "\(lroundf(sender.value))" } @IBAction func toggleControls(_ sender: UISegmentedControl) { if sender.selectedSegmentIndex == 0 { leftSwitch.isHidden = false rightSwitch.isHidden = false doSomethingButton.isHidden = true }else{ leftSwitch.isHidden = true rightSwitch.isHidden = true doSomethingButton.isHidden = false } } @IBAction func onButtonPressed(_ sender: UIButton) { } @IBAction func onSwitchChanged(_ sender: UISwitch) { let setting = sender.isOn leftSwitch.setOn(setting, animated: true) rightSwitch.setOn(setting, animated: true) } }
问题解答
该关联的本质:
这是一个绑定到UISwitch的Value Changed事件的无效Action关联——系统预期当开关状态变化时,调用ViewController的rightSwitch:方法,但你的代码中根本没有实现这个方法,因此触发“未识别选择器”的崩溃。为何会自动出现:
通常是操作Storyboard时的误操作或Xcode的小问题导致:
- 拖拽创建Outlet时,不小心将连线拖到了事件绑定区域(比如右键UISwitch弹出菜单的Action栏)
- 曾经尝试创建名为
rightSwitch的Action方法,后来删除了代码但没同步清理Storyboard里的关联 - Xcode偶发的界面同步bug,自动生成了错误的事件绑定
- 解决逻辑:
删除该无效关联后,UISwitch的Value Changed事件会正确绑定到你实现的onSwitchChanged:方法,开关状态变化时能正常触发联动逻辑,因此崩溃消失。
内容的提问来源于stack exchange,提问作者ge1mina023
相关产品推荐
相关产品推荐

