0

MainMenu という名前のクラスが 1 つあります。このクラスには、NSWindow と NSView という 2 つのパラメーターを持つ switchViews というメソッドがあります。

次に、「applicationDidFinishLaunching」でこのメソッドを使用したいAppDelegateがあります。

したがって、AppDelegate.hi では MainMenu.h をインポートし、AppDelegate.m では次のように使用します。

MainMenu *theMainMenu = [[MainMenu alloc]] init];
[theMainMenu switchViews:param1:param2;

警告やエラーはありません。メソッドを呼び出さないだけです。

メソッドを呼び出す代わりにコピーして貼り付けると、正常に動作するため、変数に問題はありません。別のクラスにある場合、メソッドの実行中にエラーが発生しているようです?

どんな助けでも大歓迎です。

前もって感謝します

switchViews メソッド:

- (void)switchViews:(NSWindow*)mainWindow:(NSView*)newView {
    NSView *dummyView;
    [theMainWindow setContentView:dummyView];
    [theMainWindow setContentSize:newView.frame.size];
    [theMainWindow setContentView:newView];
}

編集:申し訳ありませんが、それは単なるタイプミスでした。

解決策: メソッド呼び出しで間違ったパラメーターを使用していました。以下は作業コードです:

- (void)switchViews:(NSWindow*)mainWindow:(NSView*)newView {
    NSView *dummyView;
    [mainWindow setContentView:dummyView];
    [mainWindow setContentSize:newView.frame.size];
    [mainWindow setContentView:newView];
}
4

2 に答える 2

1
MainMenu *theMainMenu = [MainMenu alloc[ init]];

それがあなたのコードである場合、そのコードが無効であるため、ビルドが失敗するため、実行さえされていません。

実際のコードに構文エラーが含まれていないと仮定すると、通常、何も起こらないということは、メッセージを に送信したことを意味しますnil-[MainMenu init]が返されたかnil、 の実装がswitchViews::存在しないオブジェクトにメッセージを送信しようとしました。

-[MainMenu init]returnにステートメントがないと仮定するとnil、後者のケースの可能性が高くなります。必要なオブジェクトを作成するか、nib ベースにする場合は、MainMenu オブジェクトのすべてのアウトレットを接続し、nib のロードを忘れていないことを確認してください。

編集:

- (void)switchViews:(NSWindow*)mainWindow:(NSView*)newView {
    NSView *dummyView;
    [theMainWindow setContentView:dummyView];
    [theMainWindow setContentSize:newView.frame.size];
    [theMainWindow setContentView:newView];
}

メソッドの最初の引数 variablemainWindowに名前を付けましたが、メッセージを に送信しますtheMainWindow

MainMenu オブジェクトに という名前のアウトレットがある場合は、theMainWindowそれが接続されていることを確認し、冗長な最初の引数を削除します。または、アウトレット (またはその他のものtheMainWindow) を強制終了して、 を使用しますmainWindow

また、(何らかの理由で) AppDelegate がウィンドウを MainMenu オブジェクトに渡しているため、AppDelegate に実際にウィンドウがあることを確認してください。AppDelegate コードの「<code>param1」の値を確認することから始めます。

于 2012-04-17T16:32:52.133 に答える
0

そのコードはコンパイルされません (または、コンパイルされたとしても、必要なことをまったく実行していません)。

これは構文的に意味がありません:

MainMenu *theMainMenu = [MainMenu alloc[ init]];

ただし、一般的には、すでにインスタンス化されて画面上にある可能性が高いものの新しいインスタンスを割り当てて初期化することはおそらく望まないでしょう。

行間を読むと、オブジェクト指向プログラミングの基礎と Cocoa 設計パターンの両方をブラッシュアップすることで利益が得られるのではないかと思います。

于 2012-04-17T16:32:03.683 に答える