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

Swift百天计划项目13挑战:unrecognized selector错误求助

问题分析与解决方案

错误根源

你遇到的unrecognized selector sent to instance错误,核心原因是UIAlertAction的handler函数签名不匹配。

系统给UIAlertAction的handler默认提供的签名是(UIAlertAction?) -> Void,也就是参数是可选类型的UIAlertAction。如果你的自定义函数参数写成了非可选的UIAlertAction,UIKit底层依赖的Objective-C运行时找不到对应的方法,就会抛出这个错误。

修复步骤

1. 修正handler函数的参数类型

把自定义函数的参数从UIAlertAction改为UIAlertAction?:

func updateFilterButton(_ action: UIAlertAction?) {
    // 后续逻辑
}

2. 安全获取并更新滤镜名称

在函数内部通过可选绑定安全解包action的title,再更新按钮标题:

func updateFilterButton(_ action: UIAlertAction?) {
    guard let selectedFilter = action?.title else { return }
    // 假设你的按钮变量名为filterButton
    filterButton.setTitle(selectedFilter, for: .normal)
}

3. 正确关联handler到UIAlertAction

创建弹窗选项时,直接将修正后的函数传给handler:

let monoAction = UIAlertAction(title: "黑白滤镜", style: .default, handler: updateFilterButton)
alertController.addAction(monoAction)

或者用更简洁的闭包写法(彻底避免选择器匹配问题):

let monoAction = UIAlertAction(title: "黑白滤镜", style: .default) { [weak self] action in
    guard let self = self, let filterName = action.title else { return }
    self.filterButton.setTitle(filterName, for: .normal)
}
alertController.addAction(monoAction)

额外说明

你之前尝试的switch/for-in没用,是因为错误出在函数调用环节——系统根本没成功执行到你的逻辑代码。先解决函数签名匹配问题,再处理滤镜名称的更新逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:10:18