0

私はCocoaアプリケーションをプログラミングしていて、そのアプリケーションを一種のウィザードとして機能させたいと思っています。そのため、メインウィンドウには、ユーザーと対話し、ユーザーがウィザードのステージをステップスルーするときにサインインからデバイスアクティベーション画面に変更するカスタムビューがあります。現在、WizardViewControllerのawakeFromNibメソッドをオーバーライドしています。

- (void)awakeFromNib{
   //If no redirect request save, add first view: ID Login
   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   NSString *tokenRequest = [defaults objectForKey:@"redirectRequestToken"];
   if (!tokenRequest){
       SignInWithIDViewController *signInViewController = [[SignInWithIDViewController alloc] initWithNibName:@"SignInWithIDViewController" bundle:nil];
       [wizardView addSubview:[signInViewController view]];
   } else {
    NSLog(@"Have already logged in.");
   }
}

現状では、SignInIDViewControllerのinitWithNibNameは2回呼び出されます。1回は私が明示的に呼び出し、もう1回はビューがロードされたとき(おそらくloadViewを介して)です。ただし、単にinitを呼び出すと、initWithNib名は1回だけ呼び出されますが、間違ったxibファイルが(DeviceActivationViewControllerクラスの)ロードされます。signInViewControllerを2回初期化するべきではないため、何が間違っているのか理解できないようですが、表示するにはIBに適切なxibファイルが必要です。

現在このクラスにある、ユーザーインターフェイスIBActionではない他の唯一のメソッドは、生成されたinitWithNibNameメソッドと追加されたNSLogステートメントです。

4

1 に答える 1

1

IB (青い立方体) でオブジェクトを作成し、それらをコードでインスタンス化することが問題だと思います。それらのオブジェクトを IB で作成した場合、それらは awakeFromNib でインスタンス化されます。コードで alloc init を呼び出すべきではありません。これにより、新しいインスタンスが作成されます。

OSXでView Controllerを使用した経験はあまりありませんが、IBActionsをView Controllerに(ファイルの所有者として)接続できないようです。私がそれを機能させる方法は、カスタム ビュー (View Controller を追加するときに作成される) をサブクラス化し、そのビューのクラスを新しいサブクラスに変更し、そのクラスにアクション メソッドを配置することでした。これはView Controllerによって処理されるはずですが、動作しないのは、OSXのレスポンダーチェーンにView Controllerが含まれていないことに関係していると思います(iOSではそうです)。

編集後: メモリ管理の問題に回り道した後、これを行うための最良の方法を見つけたと思います。上で述べたように、(Apple の MVC パラダイムに準拠するために) ボタン メソッドをビューではなくビュー コントローラー クラスに配置することができます。実際には、IBActions を (ファイルの所有者として) ビュー コントローラーに接続できます。コードでインスタンス化するときに、ビュー コントローラーが保持されていることを確認する必要があります。これを行うには、SignInViewController クラスをインスタンス化するクラスで signInViewController をプロパティにし、プロパティ宣言で「retain」を使用する必要があります。そうすれば、IB で青い立方体を作成する必要はありません (作成する必要もありません)。

于 2012-06-01T16:12:35.343 に答える