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

Swift与Objective-C混合开发中UIGestureRecognizer失效求助

解决Swift视图中添加Objective-C UIViewController视图后手势失效的问题

我之前也碰到过一模一样的情况,大概率是你的Objective-C ViewController实例没被Swift侧正确持有,导致ARC把它回收了——手势的target变成nil,自然触发不了对应的方法。下面是具体的解决思路和排查步骤:

1. 确保持有Objective-C ViewController的强引用

在你的Swift视图控制器里,把Objective-C的VC实例声明为类属性(而不是局部变量),这样ARC会保持它的引用,同时要遵循子控制器添加的标准流程:

// Swift视图控制器中
class YourSwiftVC: UIViewController {
    // 声明为类属性,强引用持有
    private let myObjcVC = MyObjcViewController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 必须调用这几个方法,保证子VC生命周期正常
        addChild(myObjcVC)
        // 根据需求设置子视图的frame
        myObjcVC.view.frame = view.bounds
        view.addSubview(myObjcVC.view)
        myObjcVC.didMove(toParent: self)
    }
}

之前只加view.addSubview的方式,相当于只把视图挂到了Swift视图上,但Objective-C VC本身没有被父控制器持有,很容易被ARC释放,手势的target就成了空对象,自然无法响应。

2. 排查手势相关的基础配置

如果上面的方法没用,再检查以下几点:

  • 确认Objective-C VC的view.userInteractionEnabled是YES(默认是YES,但如果被手动修改过就会出问题):
    self.view.userInteractionEnabled = YES;
    
  • 验证手势的方向是否和测试操作匹配:你设置的是UISwipeGestureRecognizerDirectionUp,测试时要确保是向上的滑动动作。
  • 检查是否有上层视图或其他手势拦截了事件:比如父视图的gestureRecognizerShouldBegin:方法是否返回了NO,或者有其他手势的优先级更高。

3. 验证VC是否被提前释放

可以在Objective-C VC的dealloc方法里加日志,确认VC是不是被提前回收了:

- (void)dealloc {
    NSLog(@"MyObjcViewController 被释放了");
}

如果运行时看到这条日志,说明VC确实被ARC回收了,回到第一步确保Swift侧持有强引用即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:33