获取UIBarButtonItem的框架返回nil

4

我正在尝试像这样访问UIBarButtonItem的框架:

if let items = self.toolbarItems{

        let item = items[1]

        print(item)
        let view = item.value(forKey: "view") as! UIView


    }

使用 print(item) 可以返回一个已经存在的 item(条目)。为什么不能获取一个 UIView


1
UIBarButtonItem 不是一个视图。 - rmaddy
https://dev59.com/2l4b5IYBdhLWcg3wiSLV - Tushar Sharma
@rmaddy 这就是为什么我要访问 item.value(forKey: "view")。 - JVS
@TusharSharma 这是我使用的示例代码。 - JVS
不,你没有使用提到链接中的代码。 它应该像这样: `let barButtonItem = self.navigationItem.rightBarButtonItem! let buttonItemView = barButtonItem.value(forKey: "view") as? UIView let buttonItemSize = buttonItemView?.frame.size` - kamil3
@kamil3 我指的是 item.value(forKey:"view") as! UIView。这是一样的。其余部分可以忽略,因为它不是问题所在。 - JVS
1个回答

5

使用未记录的属性的问题在于它们可能会在没有通知的情况下发生更改。

以下是使用Xcode 8.3.1和iOS 10 SDK的结果。

let item1 = UIBarButtonItem(customView: UIView())
let view1 = item1.value(forKey: "view") as? UIView
print("\(view1)")

打印
Optional(<UIView: 0x7f9049001400; frame = (0 0; 0 0); layer = <CALayer: 0x60000003cc00>>)

然而

let item2 = UIBarButtonItem(title: "Test", style: .plain, target: nil, action: nil)
let view2 = item2.value(forKey: "view") as? UIView
print("\(view2)")

打印

nil

即使将其提升到下一个级别
class MyObject: NSObject { @objc var view: UIView? } // Fake to get selector

let item3 = UIBarButtonItem(title: "Test", style: .plain, target: nil, action: nil)
let view3 = (item3 as NSObjectProtocol).perform(#selector(getter: MyObject.view))?.takeRetainedValue()
print("\(view3)")

打印
nil

2
谢谢您的解释。不过,您知道如何在我的情况下解决这个问题吗?我仍然需要访问该框架。 - JVS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接