0

FYI私はobjective-Cでプログラミングしていますが、誰でも手伝うことができます。私は過去2時間、ここに座って問題の原因を突き止めようとしています。この簡単なコーディングの問題をデバッグするために私が知っているすべてのことをやっています。以下のコードをチェックして説明します。このアプリケーションでは、MainScreenViewControllerで始まります。私のアプリケーションは、ユーザーに2つの選択肢を提供します。「マスター」ボタンまたは「ワーカー」ボタン(基本的なクライアント/サーバーモデル)を選択します。ユーザーの選択に基づいて、アプリケーションは別のビュー(MasterViewControllerまたはWorkerViewController)をロードすることになっています。今、私がアプリケーションを実行すると、あなたが印刷コマンドをたどって "マスタ"ボタンを選択した場合、私のプログラムでは "masterButtonPressed - Stage 1"と "masterButtonPressed - Stage 2"が印刷されます。ビューはAppDelegateセクションのコード内に問題があることを示すどちらも変化しません。そこに印刷コマンドを入れてアプリケーションを実行すると、AppDelegateセクションにある2つのステートメントは印刷されません。私は正しいファイルに正しい#importステートメントを持っていますが、それは無駄なスペースを占めるため、ここにはそれらを含めていません。私は、エラーも警告もなくコードをコンパイルすることができます。理論的には、私がコンソールで見なければならないものは、「マスター」ボタンを押したときに4行あり、「masterButtonPressed - ステージ1」、「changeToMaster - ステージ1」、「changeToMaster - ステージ2」、および "masterButtonPressed - Stage 2"を選択します。誰かが間違ったところを指摘できますか?私が言ったように、ビューは "マスター"ボタンを押したときに決して変わらないと言いました。ご協力いただきありがとうございます!論理エラー、またはプログラムが部品をスキップしていますか?

MainScreenViewController.h

@interface MainScreenViewController : UIViewController { 

} 

-(IBAction)masterButtonPressed; 
-(IBAction)workerButtonPressed; 
@end 

MainScreenViewController.m

@implementation MainScreenViewController 
-(IBAction)masterButtonPressed { 
    NSLog(@"masterButtonPressed - Stage 1"); 
    [ErwinAppDelegate changeToMaster]; 
    NSLog(@"masterButtonPressed - Stage 2"); 
    } 


-(IBAction)workerButtonPressed { 
    NSLog(@"workerButtonPressed - Stage 1"); 
    [ErwinAppDelegate changeToWorker]; 
    NSLog(@"workerButtonPressed - Stage 2"); 
} 
@end 

ErwinAppDelegate.h

@class MainScreenViewController, MasterViewController, WorkerViewController; 
@interface ErwinAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    MainScreenViewController *mainScreenViewController; 
    MasterViewController *masterViewController; 
    WorkerViewController *workerViewController; 
} 

@property(nonatomic, retain) IBOutlet UIWindow *window; 
@property(nonatomic, retain) IBOutlet MainScreenViewController *mainScreenViewController; 
@property(nonatomic, retain) IBOutlet MasterViewController *masterViewController; 
@property(nonatomic, retain) IBOutlet WorkerViewController *workerViewController; 

-(void)changeToMaster; 
-(void)changeToWorker; 

@end 

ErwinAppDelegate.m

@implementation ErwinAppDelegate 

@synthesize window, mainScreenViewController, masterViewController, workerViewController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after application launch 
    [window addSubview:mainScreenViewController.view]; 
    [window addSubview:masterViewController.view]; 
    [window addSubview:workerViewController.view]; 
    [window makeKeyAndVisible]; 

    // Bring first view up front 
    [window bringSubviewToFront:mainScreenViewController.view]; 
} 


-(void)changeToMaster { 
    NSLog(@"changeToMaster - Stage 1"); 
    [window bringSubviewToFront:masterViewController.view]; 
    NSLog(@"changeToMaster - Stage 2"); 
} 


-(void)changeToWorker { 
    NSLog(@"changeToWorker - Stage 1"); 
    [window bringSubviewToFront:workerViewController.view]; 
    NSLog(@"changeToWorker - Stage 2"); 
} 
@end 

答えて

2

クラスメソッド(+[ErwinAppDelegate changeToMaster])をインスタンスメソッドとして宣言している間に呼び出すようです。 MainViewController内のアプリケーションデリゲートオブジェクトへの参照を保持しておく必要があります。現在は静的(クラス)メソッドのみを扱っています。

これを行うには、MainScreenViewControllerでデリゲートプロトコルを作成し、そのビューをErwinAppDelegateのウィンドウに追加した後にmainScreenViewController.delegate = selfと設定します。

ここでデリゲートを作成および使用上のいくつかの非常に有用な情報です:How do I create delegates in Objective-C?

+0

申し訳ありませんが、すべてのことを説明してくれて意味がありますが、私は1つの質問があります。 mainScreenViewControllerビューをウィンドウに追加した後、デリゲートとして宣言していますか? –

+0

私が言ったのは、 '[window addSubview:mainScreenViewController.view]を実行した後、' mainScreenViewController.delegate = self'のようなことをするでしょう。 MainScreenViewControllerインスタンスの内部では、[self.delegate changeToWorker] 'などを直接呼び出すことができます。 – pix0r

0

ちょうど推測、しかし、あなたはおそらくにメッセージを送信するためにあなたのErwinAppDelegateのインスタンスをしたい...

一部ErwinAppDelegateがあるはずですeadeleg; [eadeleg changeToMaster];いいえ?

+0

私はこのアプローチ方法を試しましたが、クラスメソッドでインスタンス変数(私の場合はウィンドウになる)を参照しているという警告/エラーが表示されます。 –

関連する問題