17

ナビゲーション コントローラー (root: RootViewController、 second: ReadingViewController) にビュー コントローラーがありますが、2 番目のビュー コントローラーでは、のナビゲーション バーを無効にしたいUIToolBarと考えています (タイトルは必要なく、iBooks やFacebook アプリ)。問題は、2 番目のビューでナビゲーション バーを非表示にすると、ビュー コントローラーをポップする (戻る) ときに再びランダムに表示されることです。

ビュー コントローラをポップすると、戻るボタンが 1 秒間表示されます。

ここに画像の説明を入力

2 番目のビュー コントローラーでは、ナビゲーション バーを非表示にしますviewWillAppear:

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

    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

また、2 番目のビュー コントローラーで、ナビゲーション バーを次のように復元しますviewWillDisappear:

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

    // ... other stuff

    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

ビューコントローラーがシームレスに移行するように、この問題にどのように対処するのか疑問に思っています。

4

8 に答える 8

15

ここでの問題は、それviewDidLoadが早すぎることです。インターフェイスや実際のプッシュ アニメーションとviewDidLoadは何の関係もないことに注意してくださいこのビュー コントローラーのビューが画面に表示されようとしているわけではありません。これは、View Controller がそのビューを取得したことを意味するだけです。

ナビゲーション インターフェイスで 2 つのビュー コントローラー間を行き来するときに自分のマシンで何が起こるかを示すビデオを作成しました。一方にはナビゲーション バーが表示され、もう一方には表示されません

私にとって、それは、押したりポップしたりしてナビゲーションバーを表示したり隠したりするときに得られるのと同じくらい首尾一貫しています! これが私が使用したコードです。ナビゲーション バーを非表示にするビュー コントローラーは、ViewController2 クラスです。このコードはアプリ デリゲートにあります。

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    dispatch_async(dispatch_get_main_queue(), ^{
        [(UINavigationController*)self.window.rootViewController setDelegate:self];
    });
    return YES;
}

-(void)navigationController:(UINavigationController *)nc 
     willShowViewController:(UIViewController *)vc 
                   animated:(BOOL)animated 
{
    [nc setNavigationBarHidden:([vc isKindOfClass:[ViewController2 class]]) 
                      animated:animated];   
}

それだけです。

于 2013-04-28T21:32:16.867 に答える
2

ねえ、ナビゲーション バーをUIToolbar.

非表示にする代わりに、ボタンを追加してUINavigationナビゲーションコントローラーを模倣できます。UITootlbar

非表示にするのUINavigationは複雑です。

ドロップボックスのリンクをアップロードしました。

于 2013-05-20T12:15:50.633 に答える
1

2 番目のビュー コントローラーで、viewWillAppear: のナビゲーション バーを非表示にします。

self.navigationController.navigationBar.frame = CGRectMake(0, 0, 0, 0);

ナビゲーション バーを非表示にするには、フレームを viewWillDisappear に設定します。

self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44);
于 2013-05-04T13:47:32.193 に答える
1

さて、あなたの質問からわかるように、現在のアプローチの唯一の問題は、元の「戻る」ボタンが一時的に表示されることです。では、View Controller に対してこのボタンをブロックしないのはなぜでしょうか?

self.navigationItem.hidesBackButton = YES;

役立つかもしれないと思います。ただし、主なタスクについては、必要な数のボタンを追加できるカスタム ナビゲーション バーを使用することをお勧めします。このようなアプローチは iOS にとってより自然であり、質問で述べたような問題に直面することはおそらくないでしょう。

于 2013-05-24T06:08:57.673 に答える
0

こんにちは、次のことは私の仕事をしました

このFirstViewControllerメソッドを入れて

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

そして、SecondViewControllerこのメソッドを入れて

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

    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

viewWillDisappear私は自分の仕事のために使用していません。

希望はあなたを助けます。

于 2013-05-07T10:42:18.383 に答える
0

viewWillDisappearコードを からに移動するのと同じくらい簡単viewDidDisappearです。

また、view-transition は既にアニメーション化されているため、view*appear メソッドでアニメーションを使用しないでください。

于 2013-05-22T09:53:52.653 に答える