You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    }
}

问题解答

  1. 该关联的本质:
    这是一个绑定到UISwitch的Value Changed事件的无效Action关联——系统预期当开关状态变化时,调用ViewController的rightSwitch:方法,但你的代码中根本没有实现这个方法,因此触发“未识别选择器”的崩溃。

  2. 为何会自动出现:
    通常是操作Storyboard时的误操作或Xcode的小问题导致:

  • 拖拽创建Outlet时,不小心将连线拖到了事件绑定区域(比如右键UISwitch弹出菜单的Action栏)
  • 曾经尝试创建名为rightSwitch的Action方法,后来删除了代码但没同步清理Storyboard里的关联
  • Xcode偶发的界面同步bug,自动生成了错误的事件绑定
  1. 解决逻辑:
    删除该无效关联后,UISwitch的Value Changed事件会正确绑定到你实现的onSwitchChanged:方法,开关状态变化时能正常触发联动逻辑,因此崩溃消失。

内容的提问来源于stack exchange,提问作者ge1mina023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:45:40