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
相关产品推荐
相关产品推荐

