1

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

3 に答える 3

4

これをしないでください。これは、カプセル化の基本的なOOPの概念に違反しています。Appleがクラス内のivarの順序または意味を再配置することを決定した場合UINavigationItem、コードは予期せずにクラッシュしたり、紫色のドラゴンを食べたりする可能性があります。


とは言うものの、この邪悪 道を確実に下りたいのであれば、次の方法で_navigationBarivarに到達できるはずです。

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));
}

どちらのアプローチも非常に危険であり、オペレーティングシステムのすべてのポイントリリースで破損するリスクがあります。あなたは警告されました。ここにドラゴンがいます。

于 2012-06-01T20:18:29.073 に答える
0

UINavigationItemではなく、UINavigationControllerのnavigationBarにアクセスする必要があります

于 2012-06-01T20:09:24.747 に答える
0

理想的には、Christianが言ったように、UINavigationControllerのnavigationBarにアクセスします。

UINavigationItemを介してnavigationBarにアクセスし、UINavigationItemのカスタムサブクラスを作成する必要がある場合は、カスタム変数が代わりになります。

最後に、選択肢のどれもあまり気にせず、本当にそのプロパティにアクセスしたい場合は、単に次のように呼び出します。

[myNavigationItem performSelector:@selector(navigationBar)]

もちろん、通常の「アプリが拒否されます」または「コーディングが適切ではありません」という記述が適用されます。

于 2012-06-01T20:17:53.547 に答える