iOS 11-无法访问UIBarButton的UIView
我正试图在我的UIBarButton的右上角创建一个徽章编号。对于iOS 9和iOS 10,它工作正常,但对于iOS 11,我无法访问按钮的视图,我通常这样做: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 } } } 我理解,对
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
}