1

ナビゲーション バーの右上隅にそれぞれログイン ボタンが必要な 2 つの viewController があります。

viewController1#viewDidLoad では、次のように設定しましたrightBarButtonItem(省略):

// set up the login button on the right
UIButton *loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *loginImage = [UIImage imageNamed:@"btn_login.png"];
[loginButton setBackgroundImage:loginImage forState:UIControlStateNormal];
[loginButton setFrame:CGRectMake(0, 0, loginImage.size.width, loginImage.size.height)];
[loginButton setTag:1111111];
UIBarButtonItem *loginItem = [[UIBarButtonItem alloc] initWithCustomView:loginButton];
self.navigationItem.rightBarButtonItem = loginItem;
[loginItem release];

でタグ付けしてviewWillAppearviewWithTag:1111111ユーザーがログインしているかどうかに基づいて、非表示にする必要があるか表示する必要があるかを判断できるようにします。簡単です。

((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true; 

viewController2 がスタックにプッシュされると、基本的に同じコードを実行して をセットアップしますrightBarButtonItemが、別のタグ (つまり 222222) を付けます。

viewController2#viewWillAppear で、 を探すと、viewWithTag:222222null として返されるため、表示/非表示を切り替えることができません。

しかし、viewController1 で使用したのと同じタグ (1111111) を使用すると、そこに到達できることに気付きました。

どうしてこれなの?私のタグは実際には定数としてファイルの先頭に設定されているため、これを機能させるために乱数を vc1 から vc2 にコピーするのはエレガントではないようです。rightBarButtonItem代わりに、vc2 のタグが に適用されない理由と、別の viewController にいるにもかかわらず vc1 のタグがまだ保持されている理由を理解したいと思います。

4

2 に答える 2

0

あなたが何をしているのかを正しく理解している場合、最初に試みることは、この行の前に、両方のビューコントローラーで確認することです。

((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true; 

置くために

NSLog("View is %@", self.navigationController.view);

viewWithTag を正しいビューに送信しているかどうかを確認します。これについてはわかりませんが、UINavigationcontroller 内にロードされた UIViewcontroller によってビュー、コントローラーにアクセスしようとしていますか? この場合、次を使用します。

(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];
于 2012-04-12T15:57:19.290 に答える
0

最も簡単でスケーラブルな解決策はviewWithTag:、ペストのような使用を避けることです。

ivarUIBarButtonItemを作成すると、あいまいさなしにすぐにアクセスできます。

交換

[loginButton setTag:1111111];

self.loginButton = loginButton;

次に、これを取得するには

self.loginButton;

それ以外の

(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG];

どちらがよりエレガントで堅牢に見えるかを知っています

于 2012-04-12T16:07:04.497 に答える