替换UIViewController默认View后tvOS按钮无响应问题咨询
这是tvOS的预期行为,并非Bug
tvOS的交互核心是焦点机制,和iOS的触摸交互逻辑存在本质差异,你遇到的这种表现是系统设计的预期结果:
- UIViewController默认生成的视图是
UILayoutContainerView(UIView的子类),它的allowsFocus属性默认被设置为true,可以正常将焦点传递给子视图(比如你添加的按钮)。 - 而你手动创建的普通
UIView实例,在tvOS中allowsFocus的默认值是false,这会阻断焦点向下传递,子视图无法获取焦点,自然触发不了交互事件。
解决方法
只需要在替换视图前,手动开启自定义视图的焦点允许即可:
let viewcontroller = UIViewController() let rootview = UIView(frame: viewcontroller.view.bounds) rootview.allowsFocus = true // 关键:开启焦点支持 viewcontroller.view = rootview // 后续添加按钮的代码不变 let button = UIButton(type: .system) button.setTitle("Tap Me", for: .normal) button.titleLabel?.font = UIFont.systemFont(ofSize: 18) button.addTarget(self, action: #selector(buttonTapped), for: .allEvents) viewcontroller.view.addSubview(button)
添加这行代码后,按钮就能正常响应tvOS的遥控器选择事件了。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

