如何在UINavigationItem类中访问@private变量_navigationBar

时间:2012-06-01 20:04:50

标签: iphone objective-c private uinavigationitem

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;

3 个答案:

答案 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)]

当然,通常情况下,“将拒绝您的应用程序”或“适用不良编码”声明。