0

次のように、UIViewController 内で loadView メソッドをオーバーライドしています。

-(void)loadView
{
    NSLog(@"HPSFormController loadView starting"); 

    HPSFormView* viewForThisController = [ [ HPSFormView alloc ] initWithFrame:_frame ] ;
    self.view = viewForThisController;

}

ビュー内で特定のボタンが押されると、同じ UIViewController が再び制御を取得し、この時点で、コントローラーが表示しているビューを完全に変更したいと考えています。次のように:

-(void)buttonTapped
{
    ABCFormView* newview = [ [ ABCFormView alloc ] initWithFrame:_frame ] ;
    self.view = newview;
}

ただし、buttonTapped メソッドは 2 番目のビューをロードしません。代わりに、完全に空白のビューが表示されます。

ボタンが押されたときにView Controllerにまったく別のビューをリロードさせるにはどうすればよいですか?

4

4 に答える 4

0

ただし、buttonTappedメソッドは2番目のビューをロードしません。代わりに、完全に空白のビューが表示されます。

問題が作成方法にある可能性はありませんABCFormViewか?つまり、元のビューが空のビューに置き換えられているように見えるので、後者がどのように作成されるかを確認してください...

コメント後に編集:

ビューが「ViewController内のviewDidLoadメソッド内で作成された」と言う場合は、ViewControllerをインスタンス化する必要があります。

@property (...) ABCFormViewController* newviewController;

....

-(void)buttonTapped
{
    self.newviewController = [ [ ABCFormViewController alloc ] init] ;
    self.view = newviewController.view;
}

newviewController制御されたものを使用している限り、それが存在している必要があることに注意してくださいview。そうしないと、クラッシュが発生します。それが、私がその参照をプロパティに格納する理由です。

于 2012-06-14T15:32:10.333 に答える
0

loadView の実装で他に多くのことを行う必要がない場合は、ストーリーボードを使用して最初に設定することをお勧めします。見逃しがちですが、ストーリーボードで、ビューがカスタムタイプであることを指定できます (ビューが選択された「ID インスペクター」で)。さらに、同じView Controllerインスタンスに対してまったく異なるクラスのビューが必要な理由を評価する価値があるかもしれません。私にとって、これはアプリケーションの設計に関する危険信号かもしれません。2 つのビュー コントローラー間のフローを使用する方が適切な場合もあれば、このカスタム UIView 拡張クラスに状態を変更するロジックを記述する場合もあります。私にとっての決定は、ビューによって表されるモデルと、それぞれがどの動作を促進するように設計されているかに基づいて行われます。

モデルが異なる場合 (つまり、最初のビューにはアカウントのリストが表示され、2 番目のビューには 1 つのアカウントの詳細が表示されます)、または動作が大きく異なる場合 (つまり、最初のビューはアカウントの表示で、2 番目のビューは新しいアカウントの作成)、 2 つの異なるビュー コントローラーを使用します。

モデルと動作が似ていて、スタイルを変更する必要がある場合は、カスタム ビュー クラスに状態を変更するコードを記述して、並べ替えなどを行います。

別のプラットフォームから来ている場合、最初はばかげているように見えるかもしれませんが、私たちは実際にはあまりためらうことなくView Controllerを使い回しています. それらはフレームワークによってエレガントに処理され、「コンテンツの画面全体」を管理し、別の画面全体に簡単に交換できるように設計されています。

于 2012-06-15T04:09:54.307 に答える
0

ABCFormViewController の中身を知らずに見分けるのは困難です。ビューコントローラーでタイミングの問題が発生しましたが、そのコンテンツをキャプチャしてpdfファイル(画面に表示されないビュー)を作成したかったため、ビューを生成する必要がありました。その場合、次のようなコードを挿入する必要がありました。

    [newviewcontroller.view setneedsrefresh]; 

私がする前に

     otherVC.view = newviewcontroller.view;

そうしないと、空白のページが表示されます。すべてが整理されるまでにARCがnewviewcontrollerの割り当てを解除するため、ビューがゼロになるため、これが得られると思います。あなたの場合、これは問題ではないかもしれません。これを行うためのはるかに簡単な方法は、モーダル、ポップビュー、またはナビゲーションコントローラーを介して他のビューコントローラーに制御を転送することであるため、ビューに2番目と3番目のビューコントローラーを配置する必要がある理由はありますか? 別のより一般的な方法は、XIB で複数のビューを作成し、それぞれのビュー コントローラーを作成する代わりに、空のビューにロードすることです。

于 2013-09-25T01:23:40.267 に答える
0

明らかに、self.view = newView; を設定するだけでは、新しいビューを表示することはできません。newView はまだ他のビューのサブビューとして追加されていないためです。つまり、ウィンドウにはありません。

別のビューに切り替える必要がある場合は、おそらく APSFormView をサブビューとして viewcontroller.view に追加する必要があります。切り替える必要がある場合は、APSFormView をスーパービューから削除してから、ABCFormView を新しいサブビューとして viewcontroller.view に追加します。

于 2012-06-15T03:49:40.240 に答える