2012-06-01 2 views
1

UINavigationItem имеет следующие частные переменныекак получить доступ к @private переменной _navigationBar в классе 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;

ответ

4

Не делайте этого. Он нарушает фундаментальную концепцию инкапсуляции ООП. Если Apple решит изменить порядок или значение иваров в классе UINavigationItem, ваш код может непредсказуемо ломаться, вплоть до сбоев или человеческих пурпурных драконов.


Это сказало, если вы уверены, что вы хотите пойти вниз это злозло дорога, вы должны быть в состоянии достигнуть _navigationBar Ивар с:

UINavigationItem *theItem = ...; 
UINavigationBar *bar = [theItem valueForKey: @"_navigationBar"]; 

Если это не работает (например, если Apple переопределила +accessInstanceVariablesDirectly в этом классе), вы можете опуститься до времени выполнения Objective-C:

#include <objc/runtime.h> 

UINavigationItem *theItem = ...; 
UINavigationBar *bar = nil; 
Ivar barIvar = class_getInstanceVariable([UINavigationItem class], "_navigationItem"); 
if (barIvar) { 
    bar = *(UINavigationBar *)((void *)theItem + ivar_getOffset(barIvar)); 
} 

Оба подхода невероятно опасны и могут быть подвержены риску взлома с любой точкой выпуска операционной системы. Вы были предупреждены. Здесь будут драконы.

0

Вы должны получить доступ к Панели навигации на UINavigationController, а не UINavigationItem

0

В идеале, вы бы получить доступ к Панели навигации на UINavigationController как сказал Кристиан.

Если вы должны получить доступ к навигационной панели через UINavigationItem, создав собственный подкласс UINavigationItem, тогда альтернативная альтернатива.

Наконец, если вы действительно не все равно слишком много о каких-либо альтернатив и действительно, действительно хотите получить доступ к этой собственности, то вы бы просто позвонить:

[myNavigationItem performSelector:@selector(navigationBar)] 

Конечно обычно, " будет отклонено ваше приложение отклонено "или" это не хорошее кодирование ".

Смежные вопросы