【问题标题】:iOS11 UIBarButtonItem action not get callediOS11 UIBarButtonItem 动作没有被调用
【发布时间】:2017-08-28 23:26:45
【问题描述】:

我使用 Xcode9 Beta6 构建项目,在 iOS10 设备上正确调用了该操作,但在 iOS11 设备上不起作用。

在我的项目中,有一些viewControllers顶部有一个UIToolBar,而toolBar包含一些UIBarButtonItems。

有一种这样的 viewController,当我点击 UIBarButtonItem 时,它的 UIBarButtonItem 操作不会被调用。我可以看到点击动画(图标先变暗,松开手指后恢复正常)

viewDidLoad的末尾,我打印了toolbar.items的信息,表示目标动作设置正确。

Debug Output

【问题讨论】:

  • 阚辰,你的问题解决了吗?
  • 您的 ViewController 中有手势识别器吗?它在我的情况下引起了问题。我仍然不知道如何处理。
  • @AlexBlack 是的,我有。我在viewController 的view 中添加了一个TapGestureRecognizer,UIToolbar 是viewController 的view 的子视图。因为工具栏和它的 barItem 在view 的顶部,所以点击事件应该首先被 barItem 捕获。我已经制作了一个示例项目来向 Apple 展示这一点。希望他们能给我回复,所以我可以在这里发帖。

标签: ios ios11 xcode9-beta


【解决方案1】:

在我的例子中,我设置了按钮并将其实例化为 vc 的属性

class myVC: UIViewController {
let closeBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(close(_:)))
}

如果我把它移到 ViewDidLoad 就解决了问题

class myVC: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
    let closeBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(close(_:)))
}

}

【讨论】:

  • 似乎人们自 2017 年以来一直在说这是水龙头识别器的错误。然而,这个错误似乎仍然存在。所以现在把它放在 viewDidLoad 中可以解决这个问题。
【解决方案2】:

我通过从我的视图中删除当前手势识别器并添加一个新的来解决这个问题。然后我打开了我的视图的连接检查器并将gestureRecognizer 连接添加到我的手势识别器。

【讨论】:

    【解决方案3】:

    Apple 已确认此错误。 我的临时解决方案是通过移除重叠区域来更改手势识别器区域,这样点击手势就不会阻塞 UIBarButtonItem 上的点击事件。

    【讨论】:

      【解决方案4】:

      仅在 iOS 11 和自定义 UIView 用于 rightBarButtonItem(或左侧)时才会发生这种情况。如果您使用UIBarButtonItem,那么它会正常工作。 这个自定义 bar item 的宽度是 0,所以我们需要设置它。

      在此控制器的viewDidLoad 中,您可以添加代码,您可以将 100 替换为适合您的内容:

      if let view = self.navigationItem.rightBarButtonItem?.customView {
          view.widthAnchor.constraint(equalToConstant: 100).isActive = true
      }
      

      至少作为一个简单的临时解决方案是可以的。

      【讨论】:

        【解决方案5】:

        在我的情况下,问题是在整个主视图中添加了一个手势识别器(为了关闭键盘),如下所示:

        UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard)];
        [self.view addGestureRecognizer:gesture];
        

        那个手势识别器会覆盖 UIBarButtonItem 上的点击,因此我通过创建一个位于导航栏正下方的新子视图并将手势识别器分配给该视图而不是整个主视图来解决。

        【讨论】:

          【解决方案6】:

          @objc标记您定位的方法。

          【讨论】:

          • 这个问题不是 Swift 语言特有的。它实际上适用于 iOS 11,无论是 Obj-C 还是 Swift。
          • @iOSCuriosity 基于 OP 的描述,我为此类问题提供了一个答案(因为在 Xcode 9 中使用新的 Swift,如果您正在管理它,您应该使用 @objc 标记选择器等你自己)。它不仅可以帮助 OP。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-26
          • 2012-08-16
          相关资源
          最近更新 更多