2012-01-03 15 views
1

ボタンが選択されたときの背景色を変更するラベルがあります。ビューを最初に入力するとうまく動作しますが、ビューを閉じて戻ると、タグでラベルにアクセスしてテキストを読み取ることはできますが、それは機能しなくなります。UILabelの背景色が変更されない

UILabel *labelToFlip = (UILabel *)[self.view viewWithTag:labelTag]; 
if (button.selected) 
{  
    NSLog(@"selected"); 
    NSLog(@"label text:%@:%d", labelToFlip.text, labelToFlip.tag); 
    [labelToFlip setBackgroundColor:[UIColor blackColor]]; 
    [labelToFlip setTextColor:[UIColor whiteColor]]; 
} 

これは私が私の見解に戻る方法です。もう一度ラベルに行き、問題なくテキストを読むことができます。ちょうど背景色やテキストの色を変更することはできません。

[self.navigationController popViewControllerAnimated:YES]; 
[self.navigationController pushViewController:self.navigationController.parentViewController 
            animated:YES]; 
+2

あなたはここでひどく間違ったことをしているかもしれないと思います。コード "[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];"これにより、ナビゲーションコントローラーとの循環ループが作成されます。 –

+0

申し訳ありませんが、私は明らかにされていない可能性があります。そのコードは別のビュー、つまり子ビューから呼び出されます。それでも問題はありますか? – LittlePeculiar

+0

それでも問題になります。あなたのナビゲーションコントローラをアプリケーションデリゲートのUIWindowのインスタンスに追加し、UIViewControllerをこのUINavigationControllerにプッシュすると、ナビゲーションスタックにプッシュしたUIViewControllerで "self.navigationController"を呼び出すと、これがあなたのインスタンスを返しますこのビューを追加したUINavigationController。 次に、UINavigationControllerでparentViewControllerを呼び出しています。これは、上記の説明で、App DelegateのUIWindowになります。 –

答えて

0

コードを拡張して、私が上記のことについてコメントしようとしたことをもっと理解することができます。

UINavigationController* navigationController = [self navigationController]; 

UIViewController* parentViewControllerForNavigationController = [navigationController parentViewController]; 

次に、コード内で、親ViewControllerを子ViewControllerに追加します。

[navigationController pushViewController:parentViewControllerForNavigationController animated:YES]; 

どこでこれを実行しても、大きな問題が発生します。私はUINavigationControllerがどのように機能しているかを十分に理解していないと思います。簡単な説明は、UIViewControllers(またはUIViewControllersのサブクラス)のリスト(または必要に応じてキュー)の反復子に過ぎないということです。実際には、親ビューコントローラをナビゲーションコントローラに追加していると、ナビゲーションコントローラの複製が発生しています。

コード:

[self.navigationController popViewControllerAnimated:YES]; 

は、単にリストから最後の項目を削除し、それがUINavigationControllerスタックの終わりにあるのUIViewControllerのリリースとのdeallocメソッドを呼び出します。これは、アニメーションの引数が 'YES'であるため、以前のビューにアニメーションを戻すことになるため、ここでナビゲーションスタックに別のビューをプッシュする必要はありません。これは、実行しようとしているようです。

は、しかし、あなたが例えばのようないくつかのナビゲーション操作を実行しようとしていた場合: 次の3つのビューコントローラ、のUIViewController A、BおよびCの を持つルートビューコントローラがAであるあなたは、ナビゲーションコントローラ上にBを押して、次に実行しますいくつかはBで機能し、ビューコントローラCをナビゲーションスタックにプッシュしたいのですが、ビューCで戻るとビューAで表示され、ビューBでは表示されないようにするには、[self navigationController] viewControllers]を削除し、最後の2番目のオブジェクトを削除し、配列のサイズを変更して[self navigationController] setViewControllers: "resizedArray"]を呼び出すと、ビューコントローラCの実装のviewDidAppear関数でこの機能が実行されます。