iPadOS18下UITabBarController设.tabBar模式仍拦截触摸事件求助
iPadOS 18下Toga OptionContainer(基于UITabBarController)触摸事件无响应问题
我用Toga 0.5.x(搭配Briefcase 0.3.16)开发Python iOS应用,其中toga.OptionContainer底层基于UITabBarController实现。应用在iPhone上运行正常,但在iPad Pro(M5,iOS 18模拟器)中,登录后主界面完全无响应——触摸事件无法传递至Python处理函数。
正常工作的功能
- 登录功能(点击登录按钮可正常触发)
- Toga详情列表可正常渲染并显示
- 顶部Tab Bar可见
无法正常工作的功能
- 点击详情列表的任意行:通过
UITableViewDelegate实现的tableView:didSelectRowAtIndexPath:从未触发 - 点击
UIBarButtonItem无响应 - 点击Tab Bar项无响应
已做的诊断
我在创建UITabBarController后、添加到任何窗口前,通过rubicon-objc调用Objective-C选择器,将UITabBarController.mode设置为.tabBar(对应值为1):
self.home_option._impl.native_controller.setMode_(1) print(self.home_option._impl.native_controller.mode) # 输出:1
日志确认模式已设置为1。UITabBarController仅在窗口可见且用户登录后才添加到窗口视图层级中,但iPad上的触摸事件仍无法传递至Python,而相同代码在iPhone上可正常传递触摸事件。
推测
即使在.tabBar模式下,iPadOS 18仍会在使用UITabBarController时添加某个不可见的覆盖层或触摸拦截视图,导致命中测试无法到达表格视图或导航栏按钮项。
最小复现代码
import toga from toga.style import Pack from toga.style.pack import COLUMN class MyApp(toga.App): def startup(self): content_box = toga.Box(style=Pack(direction=COLUMN, flex=1)) label = toga.Label('Tap me') btn = toga.Button('Press', on_press=lambda w: print('pressed!')) content_box.add(label, btn) tab = toga.OptionContainer( content=[('Tab 1', content_box)], style=Pack(flex=1), ) # 在iPad iOS 18上设置mode = .tabBar tab._impl.native_controller.setMode_(1) main_box = toga.Box(style=Pack(direction=COLUMN, flex=1)) main_box.add(tab) self.main_window = toga.MainWindow() self.main_window.content = main_box self.main_window.show()
在iPad iOS 18模拟器中,点击按钮不会输出'pressed!',但在iPhone上可正常输出。
核心问题
- iPadOS 18对
UITabBarController做了什么,导致即使在.tabBar模式下也会拦截触摸事件? - 是否存在
UITabBarController代理方法、子类重写或配置,可恢复iPad iOS 18上的正常命中测试? - 有没有方法检查哪个视图在拦截触摸事件(例如通过Xcode视图调试器查看是否存在不可见覆盖层)?
环境
- Xcode 16
- iOS 18.x模拟器
TARGETED_DEVICE_FAMILY = "1,2"(通用应用)- Python 3.12
- rubicon-objc 0.4.9
- toga-iOS 0.5.1
内容的提问来源于stack exchange,提问作者rjen
相关产品推荐
相关产品推荐

