触摸方法不适用于发布版本

Posted

技术标签:

【中文标题】触摸方法不适用于发布版本【英文标题】:Touch methods are not working with release build 【发布时间】:2009-04-20 23:22:19 【问题描述】:

我遇到了一个奇怪的问题,我为 iPhone 构建的自定义控件在调试模式下构建时可以完美运行,但在发布模式下构建时只能部分运行。

主包装视图是UIView 的子类,它包含一行作为子视图添加的“按钮”。自定义按钮类扩展 UIImageView 并使用以下签名覆盖触摸方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

在构建调试代码时,所有 4 个函数都会在您期望的时间被调用,而在发布构建时,什么都不会发生。我已经登录了他们每个人,但我没有收到任何日志消息(其他日志正在工作)。

另一个有趣的事情是,我在包装视图类中覆盖了 touchesBegan/Moved/Ended 方法,它们工作正常。我尝试在包装类中注释掉这些方法,看看它是否对按钮有影响,但没有。

我也尝试将 UIImageView 类更改为 UIButton 的子类,但在那里遇到了同样的问题,包括像 touchUpInside 这样的任何事件。它们在调试中工作,但不是发布。

我已尝试研究此问题以及一般事件处理,但空手而归。有什么想法可以看下一步吗?

【问题讨论】:

从该信息中很难判断。当您清理所有目标并重建您的发布版本时,您是否收到任何警告?您的发布版本是否与调试版本不同? 干净构建没有错误或警告,所有构建设置都相同,除了 Active Configuration 设置为 Release 而不是 Debug。这可以在 iPhone、iPod touch 和模拟器上重现。 【参考方案1】:

我终于找到了问题——“按钮”项的包装器高度为 0。在调试模式下,应用程序发现按钮被触摸,即使它们不在其点击区域内父视图(clipsToBounds 默认为 NO,因此按钮项目仍然完全可见),在发布模式下,不是那么多。

希望这可以帮助一些人节省我必须经历的头疼和调试时间:) 我也将此发布到 Apple 的一个错误中,希望有一天它会得到修复。

【讨论】:

以上是关于触摸方法不适用于发布版本的主要内容,如果未能解决你的问题,请参考以下文章

UITouch 不适用于 ios8

鼠标拖动选择不适用于触摸设备。我怎样才能使它成为可能?

从 webview 内容复制和粘贴仅适用于键盘快捷键(不适用于鼠标或触摸)

MutliTouch 适用于 iPad 模拟器,但不适用于设备

如何在 iOS 中禁用单个 HTML 元素的触摸操作

在 UiCollectionView 中处理触摸?