Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 11-无法访问UIBarButton的UIView_Ios_Swift_Uiview_Uibarbuttonitem - Fatal编程技术网

iOS 11-无法访问UIBarButton的UIView

iOS 11-无法访问UIBarButton的UIView,ios,swift,uiview,uibarbuttonitem,Ios,Swift,Uiview,Uibarbuttonitem,我正试图在我的UIBarButton的右上角创建一个徽章编号。对于iOS 9和iOS 10,它工作正常,但对于iOS 11,我无法访问按钮的视图,我通常这样做: extension UIBarButtonItem { func createBadge() { guard let view = self.value(forKey: "view") as? UIView else { return } } } 我理解,对

我正试图在我的UIBarButton的右上角创建一个徽章编号。对于iOS 9和iOS 10,它工作正常,但对于iOS 11,我无法访问按钮的视图,我通常这样做:

extension UIBarButtonItem {
    func createBadge() {
         guard let view = self.value(forKey: "view") as? UIView else {
             return
         }
    }
}
我理解,对于这样的情况,使用键值不是一个好主意,因为键值可以更改。但是这里有没有替代方案,使用公共API使解决方案也适用于iOS 11?
谢谢。

您可以从自定义视图创建
UIBarButtonItem
。将徽章添加到自定义视图

您可以从自定义视图创建
UIBarButtonItem
。将徽章添加到自定义视图中

我建议使用自定义视图,并将其嵌入您的
UIToolbar
/
UINavigationBar
而不是
UIBarButtonim

自定义视图可以包含UIButton和您的徽章视图

通过故事板,只需将UIView拖放到工具栏中的插槽中,并添加UIButton作为子视图。根据徽章的实现,您可以创建一个UILabel,并通过相对于UIButton的约束对其进行定位


为它们创建IBoutlet并以编程方式进行设置。

我建议使用自定义视图,并将其嵌入到
UIToolbar
/
UINavigationBar
中,而不是
uiBarButtonim

    let button = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 25, height: 25))
    button.addTarget(self.target, action: self.action!, for: UIControlEvents.touchUpInside)
    button.target(forAction: self.action!, withSender: self.target)
    button.setImage(self.image, for: .normal)
    self.customView = button
    guard let view = self.value(forKey: "view") as? UIView else {
        return
    }
自定义视图可以包含UIButton和您的徽章视图

通过故事板,只需将UIView拖放到工具栏中的插槽中,并添加UIButton作为子视图。根据徽章的实现,您可以创建一个UILabel,并通过相对于UIButton的约束对其进行定位


为这些文件创建IBoutlet,并以编程方式进行设置。

如果您知道尝试访问私有子视图结构是个坏主意,那么您为什么要尝试找到解决这个坏主意的方法?为什么不正确地执行它,这样就不必在每次iOS更改私有实现时都修复代码?我同意,我的问题不是要求iOS 11的键值正确,但对于适用于所有可用iOS版本的替代实现,您的问题要求提供iOS 11的替代方案,因此听起来您需要在iOS 11中工作的更新私钥。您应该更新您的问题,以明确您想要一个使用从iOS 9到iOS 11(及更高版本)的公共API的适当解决方案。如果您知道尝试访问私有子视图结构是一个坏主意,那么您为什么要尝试找到解决坏主意的方法?为什么不正确地执行它,这样就不必在每次iOS更改私有实现时都修复代码?我同意,我的问题不是要求iOS 11的键值正确,但对于适用于所有可用iOS版本的替代实现,您的问题要求提供iOS 11的替代方案,因此听起来您需要在iOS 11中工作的更新私钥。您应该更新您的问题,以明确您想要一个使用从iOS 9到iOS 11(及更高版本)的公共API的适当解决方案。虽然此代码可能会回答此问题,但提供有关如何和/或为什么解决此问题的附加上下文将提高答案的长期价值。虽然此代码可能会回答此问题,提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
    let button = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 25, height: 25))
    button.addTarget(self.target, action: self.action!, for: UIControlEvents.touchUpInside)
    button.target(forAction: self.action!, withSender: self.target)
    button.setImage(self.image, for: .normal)
    self.customView = button
    guard let view = self.value(forKey: "view") as? UIView else {
        return
    }