获取UIBarButtonItem的帧返回nil

JVS*_*JVS 4 uiview uibarbuttonitem ios swift

我试图访问这样的框架UIBarButtonItem:

if let items = self.toolbarItems{

        let item = items[1]

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


    }
Run Code Online (Sandbox Code Playgroud)

print(item)返回现有项目.为什么不能UIView回来?

Jef*_*mas 5

这是使用未记录的属性的问题.他们可以在不事先通知的情

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

let item1 = UIBarButtonItem(customView: UIView())
let view1 = item1.value(forKey: "view") as? UIView
print("\(view1)")
Run Code Online (Sandbox Code Playgroud)

版画

Optional(<UIView: 0x7f9049001400; frame = (0 0; 0 0); layer = <CALayer: 0x60000003cc00>>)
Run Code Online (Sandbox Code Playgroud)

然而

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

版画

nil
Run Code Online (Sandbox Code Playgroud)

甚至把它提升到一个新的水平

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)")
Run Code Online (Sandbox Code Playgroud)

版画

nil
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解释.但是,你知道如何在我的案例中解决这个问题吗?我仍然需要访问框架. (2认同)