1

ナビゲーションバーの右上隅にログインボタンが必要な2つのViewControllerがあります。 viewController1#のviewDidLoadでカスタムrightBarButtonItemにアクセスできない

は、私は(略称)のよう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]; 

それは隠されたまたは可視する必要がある場合viewWillAppearに、私は把握するviewWithTag:1111111を使用できるように、私はそれをタグ付けユーザーがログインしているかどうかに基づいています。 viewController2をスタックにプッシュを取得したときに

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

、私は基本的に私のrightBarButtonItemを設定するために同じコードを実行し、私はそれを異なるタグ(すなわち、222222)を得ました。

私がviewWithTag:222222を探すと、viewController2#viewWillAppearで、nullに戻りますので、表示/非表示できません。

私はviewController1(1111111)で使用したのと同じタグを使用しても、私はそれを知ることができます。

これはなぜですか?私のタグは実際にはファイルの先頭に定数として設定されているので、vc1の乱数をvc2にコピーするのは面白そうに思えます。代わりに、私はrightBarButtonItemにvc2のタグが適用されない理由と、別のviewControllerにあるのにvc1のタグがまだ保存されている理由を理解したいと思います。チェックする

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

を置く

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

+0

私が最初に推測したのは、あなたが 'tag'を割り当てるときと' 'tag' – tipycalFlow

+0

私の2番目の推測(深刻なもの)は、222222が整数オーバーフローを引き起こし、-123648か何かに変わるということです。 2222 – tipycalFlow

+0

のような小さなタグを試してください。私のタグは、実際にはvc1では34590、vc2では234355です。私は1111111と222222を使用して、viewControllerの中にあるこの質問を明確にしました。 – djibouti33

答えて

0

最も簡単で最もスケーラブルなソリューションは、疫病のようviewWithTag:を使用しないことです。

UIBarButtonItemをivarにすると、曖昧さなしで即座にアクセスできます。

次に取得するために

[loginButton setTag:1111111]; 

self.loginButton = loginButton; 

と交換しません。この

self.loginButton; 

代わりの

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

私はどちらがもっとエレガントで丈夫であるかを知っています

+0

'viewWithTag:'がそれほど悪い理由を詳しく説明できますか?私はそれをよりエレガントなソリューションとして見ていました。ただ単に要素を取得する必要があるときに、要素のためにivarをインスタンス化する必要がありません。 – djibouti33

+0

ビュー階層全体を検索して、各ビューにそのタグがあるかどうかを尋ねるときに、そのビューにまっすぐにポインタを置くことができるのはなぜですか?また、偶然に簡単に変更できる変数にも依存しています。 –

0

私はあなたが何をしているかを正しく理解していれば、私がしようと最初にすることは、両方のviewcontrollersに、この行の前に、確認することですviewWithTagを正しいビューに送信している場合。 これについてはわかりませんが、UINavigationcontroller内にロードされたUIViewcontrollerによってビュー、コントローラにアクセスしようとしていますか? この場合、私が使用します。

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

vc1とvc2でself.navigationController.viewをログすると、全く同じオブジェクト( djibouti33

+0

それは私が言っていたことです:-)(申し訳ありませんが、私の英語はあまり良くありません)。 2番目のviewcontrollerから、最初のviewcontrollerのビューにアクセスしています。このため、タグ11111 :-)のビューのみが表示されます。 (UIButton *)[[[self.navigationController visibleViewController]ビュー] viewWithTag:LOGIN_BUTTON_TAG]を使用してみてください。 – LombaX

+0

Paul.sによって書かれたように、明らかにあなたはivarを使うこともできます。私の答えでは、あなたのコードのエラーは何かに集中しようとしていますが、他の方法があります:-) – LombaX

関連する問題