UINavigationItem
具有以下私有变量
UIKIT_EXTERN_CLASS @interface UINavigationItem : NSObject <NSCoding> {
@private
NSString *_title;
NSString *_backButtonTitle;
UIBarButtonItem *_backBarButtonItem;
NSString *_prompt;
NSInteger _tag;
id _context;
UINavigationBar *_navigationBar;
UIView *_defaultTitleView;
UIView *_titleView;
UIView *_backButtonView;
UIBarButtonItem *_leftBarButtonItem;
UIBarButtonItem *_rightBarButtonItem;
UIView *_customLeftView;
UIView *_customRightView;
BOOL _hidesBackButton;
UIImageView *_frozenTitleView;
}
有没有办法(使用KVC等)阅读UINavigationBar *_navigationBar;
我需要这个来访问未定义的backButton。不在:
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
答案 0 :(得分:4)
不要这样做。 它违反了封装的基本OOP概念。如果Apple决定重新安排UINavigationItem
课程中ivars的顺序或含义,那么您的代码可能会无法预测地破坏,包括崩溃或吃紫色的龙。
那就是说,如果你确定要沿着邪恶 邪恶 的道路走下去,你应该能够到达{ {1}} ivar with:
_navigationBar
如果这不起作用(例如,如果Apple在此类上覆盖了UINavigationItem *theItem = ...;
UINavigationBar *bar = [theItem valueForKey: @"_navigationBar"];
),则可以下拉到Objective-C运行时:
+accessInstanceVariablesDirectly
这两种方法都非常危险,并且存在破坏操作系统的任何点发布的风险。 您已收到警告。这是龙。
答案 1 :(得分:0)
您需要访问UINavigationController上的navigationBar,而不是UINavigationItem
答案 2 :(得分:0)
理想情况下,你可以在UINavigationController上访问navigationBar,就像Christian说的那样。
如果必须通过UINavigationItem访问navigationBar,创建UINavigationItem的自定义子类,则可以选择自定义变量。
最后,如果您真的不太关心任何替代方案,并且真的,真的想要访问该属性,那么您只需致电:
[myNavigationItem performSelector:@selector(navigationBar)]
当然,通常情况下,“将拒绝您的应用程序”或“适用不良编码”声明。