2017-10-16 60 views
1

我正尝试在我的UIBarButton的右上角创建一个徽章号码。对于iOS 9,10它工作正常,但与iOS 11我不能访问该按钮的观点,我通常这样做:iOS 11 - 无法访问UIBarButton的UIView

extension UIBarButtonItem { 
    func createBadge() { 
     guard let view = self.value(forKey: "view") as? UIView else { 
      return 
     } 
    } 
} 

据我所知,使用键值是不是一个好主意,这样的情况下,因为关键可以改变。但是在这里有没有其他的选择,使用公共API,以便该解决方案也适用于iOS 11? 谢谢。

+0

如果你知道试图访问私有子视图结构是一个坏主意,那么你为什么试图找到一个解决方案的坏主意?为什么不正确地做到这一点,所以你不必每次iOS更改私有实现时修复代码? – rmaddy

+1

嗯,我同意,我的问题并不是要求为iOS 11提供正确的键值,而是为了适合所有可用iOS版本的替代实现。 – PoolHallJunkie

+0

你的问题要求iOS 11的替代品,所以它听起来像你想要更新的私人密钥在iOS 11中工作。你应该更新你的问题,以清楚地表明你想要一个适当的解决方案,使用从iOS 9通过公共API iOS 11(及更高版本)。 – rmaddy

回答

0

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

0

我建议你使用一个自定义视图,并把它嵌入在你的UIToolbar/UINavigationBar而不是UIBarbuttonItem

自定义视图可以包含一个UIButton和你的徽章视图。

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

为这些创建IBOutlets并以编程方式设置它们。

0
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 
    } 
+1

尽管此代码可能会回答问题,但提供有关* how *和/或* why *解决问题的其他上下文会提高答案的长期价值。 –