1

あるウィンドウが別のウィンドウを開いてから閉じるという最も簡単な例を探しています。

私が行き詰まっているように見える場所は、NIBとコンセントの配線方法です。ウィンドウを簡単に作成できます。それを閉じることは挑戦を提示します。

どんなアドバイスも大歓迎です!

以下にコードを添付します。私がやろうとしていることは単純だと思いますが、うまくいきません。Francisのおかげで、ウィンドウを開いたり閉じたりできるようになりましたが、もう一度開こうとすると、アプリケーションがクラッシュします(EXC_BAD_ACCESS)。これは、NIBとクラスの関係についての私の理解が不十分なためだと確信しています。ほとんどの言語では、ウィンドウの新しいインスタンスをインスタンス化してから閉じる必要があります。

に2つのウィンドウがありMainMenu.xibます。(ウィンドウを別のNIBに配置したいのですが、他の問題が発生するようです!)AppDelegateには、ウィンドウ(元のウィンドウ)とotherWindow(2番目のウィンドウが作成された)の2つのアウトレットがあります。

最初のウィンドウには、「ウィンドウを開く」と「ウィンドウを閉じる」の2つのボタンがあり、コード内の2つのメソッドに接続しています。

コード:

MyTestAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface MyTestAppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    NSWindow *otherWindow;
}

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSWindow *otherWindow;

- (IBAction)openOtherWindow:(id)sender;
- (IBAction)closeOtherWindow:(id)sender;

@end

MyTestAppDelegate.c

#import "MyTestAppDelegate.h"

@implementation MyTestAppDelegate

@synthesize window;
@synthesize otherWindow;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)openOtherWindow:(id)sender
{
    [otherWindow makeKeyAndOrderFront:sender];
}

- (IBAction)closeOtherWindow:(id)sender
{
    [otherWindow close];
}
@end
4

2 に答える 2

7

基本的に、NIB でさまざまなウィンドウを作成し、ボタン、テキストフィールドなどを追加します。次に、ウィンドウやさまざまなコントロールとの間でメッセージを送受信する「コントローラー」として機能するカスタム オブジェクトを追加します。単純なプロジェクトでは、自動的に作成された AppDelegate オブジェクトを使用してウィンドウを制御できます。より大きなプロジェクトでは、必要に応じて NSObject または NSWindowController のインスタンスである別のオブジェクトでロジックを処理する必要があります。

Windows は、アプリの起動時に開く「起動時に表示」として設定できます。また、ヘッダー ファイルで IBOutlet 参照を作成し、それらを NIB で接続することにより、手動で開くこともできます。ウィンドウを表示するには、makeKeyAndOrderFront:メッセージを送信します。それらを閉じるには、closeメソッドを送信します。

ウィンドウの開閉に応答するには、コントローラ オブジェクトをウィンドウの「デリゲート」として割り当てます。これは、NSWindowDelegate プロトコルの下のドキュメントにリストされているウィンドウからメッセージを受信することを意味します。したがって、別のウィンドウが閉じられたときにウィンドウを開きたい場合は、windowWillClose:メッセージを聞いて、別のウィンドウを開くように指示します。逆の場合も同様です。

これはかなり基本的なことなので、Hillegas の本を読むか、オンラインで入手できるさまざまなチュートリアル を参照することをお勧めします。

編集:

otherWindow が「閉じたときに解放」に設定されているため、アプリケーションがクラッシュしています。メモリ管理環境にあり、ウィンドウを保持しているものがないため、次にウィンドウを開こうとすると、すでに解放されています。解決策は、NIB ファイルで「閉じたら解放する」のチェックを外すことです。NIB で直接、ボタン アクションを他のウィンドウ自体に接続したりmakeKeyAndOrderFront:、メソッドを接続したりできることに注意してください。performClose:

于 2011-11-17T22:54:30.513 に答える
0

XCode4.1の「UINavigationController」テンプレートまたはXCode4.2の「Master-DetailApplication」テンプレートを使用して新しいプロジェクトを作成し、そこでの動作を確認します。

XCodeテンプレートを確認して学習することに興味がない場合は、次のチュートリアルを参照してください。http ://www.iosdevnotes.com/2011/03/uinavigationcontroller-tutorial/

于 2011-11-17T22:27:11.283 に答える