在 XIB 中添加手势时,iOS 应用程序崩溃并显示消息“-[UITapGestureRecognizer setFrame:]”

Posted

技术标签:

【中文标题】在 XIB 中添加手势时,iOS 应用程序崩溃并显示消息“-[UITapGestureRecognizer setFrame:]”【英文标题】:iOS App crashes with message "-[UITapGestureRecognizer setFrame:]" when adding Gesture in XIB 【发布时间】:2015-08-29 10:14:25 【问题描述】:

将手势添加到自定义视图 (XIB) 时,我的应用程序崩溃。我使用的是 Xcode 6.4 版。

以下是我使用点击手势添加自定义子视图的步骤:

    在我的项目中添加了一个 XIB 和一个 UIView 子类 (MyView)。并将 XIB 类设置为 MyView。

    使用 Interface Builder 向 MyView 添加了 TapGesture

    创建 MyView 对象 (myView) 并使用 [addSubview:myView] 将其添加为子视图。

    当我运行应用程序时,它崩溃了

    删除了 XIB 中的 TapGesture 并再次运行,没有任何问题。

代码:

[[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject];

日志:

-[UITapGestureRecognizer setFrame:]:无法识别的选择器发送到实例 0x7f924a4ce910

有时候是这样的,

-[UITapGestureRecognizer superview]:无法识别的选择器发送到实例 0x7f924a4ce910

请指教。

【问题讨论】:

您的 MyView 实现类的 awakeFromNib 或 drawRect 中是否有一些代码。您似乎正在尝试在 TapGesture 上设置框架。 是的 awakeFromNib 在那里。但没有在那里设置任何框架。 您可以尝试在 MyView 的 awakeFromNib 中添加您的轻触手势。只是为了检查 xib 中是否有问题。 使用代码添加手势时有效。但我想知道我的代码/xib 有什么问题。 @pawan:感谢您的建议。我通过添加一些额外的代码行解决了这个问题。我将添加这个问题的答案。 【参考方案1】:

我通过替换代码解决了这个问题,

[[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject];

MyView *myView = nil;
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
for (id object in objects)

  if ([object isKindOfClass:[MyView class]])
  
    myView = object;
  

注意:

如果XIB只有一个UIView对象,那么上面提到的单行代码就足够了。但是如果XIB中有多个UIView对象或者XIB中添加了任何Gestures,那么我们需要从loadNibNamed:owner:options:方法返回的数组中找出MyView对象。

【讨论】:

以上是关于在 XIB 中添加手势时,iOS 应用程序崩溃并显示消息“-[UITapGestureRecognizer setFrame:]”的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9:在故事板/xib 中设置了手势识别器,以添加到多个视图(不起作用)

在 iOS14 上释放 wkwebview 时,发送手势事件导致崩溃

将 UITapGestureRecognizer 添加到 XIB

UICollectionView:将单击手势识别器添加到补充视图

iOS 应用程序在点击手势事件时崩溃

为 iOS 应用程序实现侧边菜单,应用程序在显示手势时崩溃。