Swift中使用NSSelectorFromString调用其他视图控制器函数崩溃求助
解决Swift中使用NSSelectorFromString调用视图控制器方法崩溃的问题
兄弟,我来帮你拆解下你遇到的崩溃问题,主要有几个常见原因,对应解决方法也给你列出来:
最可能的崩溃原因
- 你调用的是全新的视图控制器实例:
MainScreenViewController()会创建一个完全新的实例,这个实例并没有被加入到App的视图层级中,甚至可能连viewDidLoad都没执行过,调用它的方法自然会出问题。你需要的是获取当前已经存在于导航栈/视图结构中的那个MainScreenViewController实例。 - 目标方法未暴露给Objective-C Runtime:
NSSelectorFromString是依赖Objective-C runtime的特性,Swift中的方法默认不会被Objective-C识别,找不到对应的selector就会直接崩溃。 - Selector拼写错误或方法签名不匹配:比如你写的
"function"和实际方法名拼写不一致,或者方法有参数但你调用时没传,也会导致崩溃。
对应的解决方案
1. 获取正确的视图控制器实例
不要新建实例,而是从当前的视图层级中找到已存在的MainScreenViewController。举个例子,如果它在导航栈里:
// 假设当前你在某个子视图控制器中 if let mainVC = navigationController?.viewControllers.first(where: { $0 is MainScreenViewController }) as? MainScreenViewController { // 这里调用方法才是正确的 mainVC.perform(NSSelectorFromString("function")) }
如果是通过present方式呈现的,你可以根据实际的视图层级关系,从presentingViewController或presentedViewController中查找对应的实例。
2. 确保目标方法被Objective-C识别
在MainScreenViewController的方法前加上@objc标记,让方法暴露给Objective-C runtime:
class MainScreenViewController: UIViewController { // 必须添加@objc,否则NSSelectorFromString找不到这个方法 @objc func function() { // 你的方法逻辑 print("方法被调用了") } }
3. 更安全的Selector使用方式
尽量避免直接用字符串写Selector,推荐用#selector语法,这样编译期就能检查方法是否存在,避免拼写错误:
// 用#selector替代NSSelectorFromString,更安全 mainVC.perform(#selector(MainScreenViewController.function))
如果可以的话,直接调用方法是最安全的,完全不会有Selector相关的问题:
mainVC.function()
内容的提问来源于stack exchange,提问作者user9239212
相关产品推荐
相关产品推荐

