iOS11 UIBarButtonItem操作未被调用

我使用Xcode9 Beta6来构build项目,iOS10设备上的操作被正确调用,但是它不适用于iOS11设备。

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

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

viewDidLoad的最后,我打印出toolbar.items的信息,表明目标动作设置正确。

debugging输出

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

苹果已经证实了这个错误。 我的临时解决scheme是通过删除重叠区域来更改手势识别器区域,以便轻击手势不会阻止UIBarButtonItem上的轻击事件。

这只发生在iOS 11和自定义的UIView用于rightBarButtonItem (或左边)。 如果你使用UIBarButtonItem那么它会正常工作。 这个自定义栏项目的宽度为0,所以我们需要设置它。

在这个控制器的viewDidLoad中你可以添加代码,你可以用100代替你的东西:

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

至less作为一个简单的临时解决scheme,这是很好的。

在我的情况下,问题是一个gestureRecognizer添加到整个主视图(为了closures键盘),像这样:

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

该手势识别器覆盖了UIBarButtonItem上的水龙头,因此我通过在导航栏的正下方创build一个新的子视图并将手势识别器分配给该视图而不是整个主视图来解决这个问题。

@objc标记你的目标方法。