1

「ウィザード」のようなものになることを目的として、単純なウィンドウを作成しました (Apple のガイドラインでは基本的に禁止されていることは知っていますが、顧客を説得しようとしましたが、何でも.

これは単純なビューで、内部に 2 つのカスタム ビューがあり、1 つは「前へ」と「次へ」ボタンを含む下部にあり、上部にはスペースの大部分を占める大きなビューがあります。

下のビューを「NavigationView」、上のビューを「ContainerView」と呼びました。

ユーザーが「次へ」ボタンと「前へ」ボタンを使用してナビゲートする一連のビューを保持する配列を作成しました。

だから、ここに私のコードがあります。

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];

    for (NSView *subView in [containerView subviews]) {
        [subView removeFromSuperview];
    }

    [containerView addSubview:nextView];
    [nextView setFrame:containerView.bounds];

    [containerView setNeedsDisplay:YES];

}

それはかなり簡単だと思います。次に表示されるビューを含む配列があります。

何が起こるかというと、ContainerView の左下部分の中央に次のビューが表示されるということです。なぜこれが起こるのですか?

また、ご想像のとおり、私はかなり長い間 Objective-C に取り組んできましたが、ビューを管理する初心者です。ありがとう!

編集:

追加するのを忘れていました: これらのビューの一部はサイズが異なります。ビューのサイズに応じてウィンドウのサイズを変更できるようにしたいと考えています。

4

2 に答える 2

1

[nextView setFrame:containerView.bounds];

コンテナー ビューの境界を次のビューフレーム( doc ) に割り当てています。
おそらく必要なのは、現在のビューフレームを次のビューフレームに割り当て、幅と高さを調整することです。

次のように、現在表示されているビューへの参照を保持します (_currentView はタイプの ivar ですNSView *)。

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];
    [nextView setFrame:_currentView.frame];

    [_currentView removeFromSuperview];    // _currentView is retained in the collection
    [containerView addSubview:nextView];
    _currentView = nextView;

    [containerView setNeedsDisplay:YES];
}
于 2013-05-09T11:29:29.137 に答える
0

わかりました、私はそれを理解しました..最後に..

問題は、表示しなければならなかった最初のビューが、.xib ファイルのコンテナー ビューに既に含まれていたことです。

理由はよくわかりませんが、最初のクリックで解放されたため、コンテナー ビューの保持カウントに問題が発生した可能性があります。コンテナー ビューを解放すると、おそらくそのフレームが null であったため、ビューが (0,0) に再配置され、ビューが正しく保持されなかったため、ビューが点滅しました。

いずれにせよ、.xib ファイルからビューを削除し、コードを介して追加すると、正常に機能します。

于 2013-05-10T09:28:06.357 に答える