5

ビュー #1​​ には、ストーリーボードに設定された 2 つのコントロールがあります。1 つはナビゲーション バーのUIBarButtonItemで、もう 1 つはUISegmentedControllerです。前者はカスタム描画されたイメージで、両方のアイテムの色合いが紫色に設定されています (ストーリーボード属性インスペクターで設定された色合い)。

さまざまなアクションを通じて、ユーザーはView #1を介してView #2にアクセスできます。ビュー #2で特定の条件が満たされない場合、エラー メッセージが表示され、[OK] をクリックするとビュー #1​​ にリダイレクトされます。

関連コード:

if(i == [self.itemsAvailable count]){
    UIAlertView *alertView = [[UIAlertView alloc] 
                    initWithTitle:@"Oh no!" 
                    message:@"Warning message text!" 
                    delegate:self 
                    cancelButtonTitle:@"OK" 
                    otherButtonTitles:nil, nil];

    [alertView show];

    break;
}

アラートはwhileループ内でトリガーされることに注意してくださいbreak;次の関数はビュー #1​​ に戻ります。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == [alertView cancelButtonIndex]) {
        // Jump back one screen
        [self.navigationController popViewControllerAnimated:YES];
    }
}

関数を使用してビュー #1​​ に戻ると、popViewControllerAnimated:YES前述の 2 つのコントロール ( UIBarButtonItemUISegmentedController ) の色合いが希望の紫ではなく灰色で表示されます。

別のUISegmentedController値を選択すると、適切な色合いに戻りますが、UIBarButtonItemが適切な紫色に戻るには、ビュー #1​​ を残す必要があります。

ビュー #1​​ に戻ったときに自動的に適切な色合いになるようにするには、どうすればこの問題を解決できますか?

ノート:

ビュー#1には次のviewWillAppear機能

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    // Unhide the nav bar (hidden on home screen)
    [self.navigationController.navigationBar setHidden:NO];

    [self setUserDefaults]; // Load the appropriate values and set in UISegmentedController
}

どこ

- (void) setUserDefaults {

    // Set the defaults from the settings
    int selectedValue;

    selectedValue = (int)[self.userDefaults integerForKey:@"SomeValue"];        

    [self.defaultsSegment setSelectedSegmentIndex:selectedValue];
}

一部変数名を変更したり、コードを省略したりしていますが、重要な部分です。UIBarButtonItem がコードによって変更されることはなく、 UISegmentedControllerと同じエラーが表示されるため、関数が正しくない色合いと関係があるとは思いませ

編集#1:

メソッドに行[self loadView];を追加すると、 UISegmentedControllerの色合いが修正されますが、 UIBarButtonItemの色合いの問題を修正する方法はまだわかりません。ラインを使用すると、問題が発生します。viewWillAppear[self.navigationController loadView];

編集#2:

UIAlertView、それ自体が から呼び出されるメソッド内で呼び出されviewWillAppearます。メソッド呼び出しを移動すると、適切な色合いが保持viewDidAppearされます。UIBarButtonItemしかし、ビューの読み込みが完了した後、ビュー内のグラフィックが突然表示されます。これは見苦しいものです。

4

1 に答える 1

2

この問題の理由はpopViewControllerAnimated、ビューの読み込みが完了する前に が呼び出されたためです。

こうなってしまった…

メソッド内でviewWillAppear、条件をチェックして 1 つのビューをポップアップするかどうかを決定する別のメソッドへの呼び出しがありました。ビューの読み込みが完了する前にすべてが発生し、そこに問題が発生しました。

これをビュー #2に入れてから、ビュー #1​​ から移動してみてください。

- (void)viewWillAppear:(BOOL)animated{
{
    [super viewWillAppear:animated];
    [self.navigationController popViewControllerAnimated:YES];
}

コードは正常にコンパイルされますが、View #2に移動すると、次のログが表示されます。

"nested pop animation can result in corrupted navigation bar"

そして本質的には、ポップ後に色合いが変わるという問題がありました。このメソッドpopViewControllerAnimatedは、Xcode によってキャッチされないほどコードに深く組み込まれていましたが、多くの問題を引き起こさなかったわけではありません。

私が行った回避策は次のとおりです。

  1. BOOL 変数を作成する@property (nonatomic) BOOL didFail;
  2. BOOL変数をFALSE最初に設定しますwillViewAppear
  3. willViewAppear条件をテストするメソッドを ( 内で) 呼び出します
  4. 条件が満たされない場合は、BOOL 変数をTRUE
  5. BOOLviewDidAppear変数が true かどうかを確認します。条件が探しているものである場合は、1 つのビューをポップアップします。

コード:

.h ファイル

@property (nonatomic) BOOL didFail;

.m ファイル

- (void)viewWillAppear:(BOOL)animated{
{
    [super viewWillAppear:animated];
    self.didFail = FALSE;

    [self methodCall];
}

- (void) methodCall
{
    if(condition is met){
        self.didFail = TRUE;
    }
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if(self.didFail == TRUE){
        //alert message
        [self.navigationController popViewControllerAnimated:YES];
    }
}

そして、それは約それを行います。アラートが表示されるまでに少し時間がかかりますが、無視できる程度です。そして今、ポップの後、すべてが本来あるべき姿になっています!

于 2014-06-29T03:25:33.233 に答える