2

ウィンドウの親プロパティを設定しています。 でプロパティをチェックするとwindowDidLoad、すべて問題ありません。しかし、チェックインするとIBAction、ゼロです。ここで何が欠けていますか?

AppController.m

loginController = [[LoginController alloc] initWithWindowNibName:@"Login" owner:self];
loginController.parent = self;
[[loginController window] makeKeyAndOrderFront:self];

LoginController.h

@property (nonatomic, weak) AppController *parent;

LoginController.m @synthesize 親;

- (void)windowDidLoad
{
    [super windowDidLoad];

    NSLog(@"Parent: %@", self.parent); //<--- Parent: <AppController: 0xblahblah>
}

- (IBAction)login:(id)sender
{
    NSLog(@"Parent: %@", self.parent); //<--- nil
}

ここに画像の説明を入力ここに画像の説明を入力ここに画像の説明を入力ここに画像の説明を入力ここに画像の説明を入力

4

2 に答える 2

2

あなたの問題は、間違ったファイル所有者を設定したことだけだと思います.xibファイルを保持するログインコントローラーであるため、すべてのIBOutletsとIBActionsがバインドされています。

initWithWindowNibName:owner: の代わりに initWithWindowNibName: を呼び出して、ファイルの所有者がアプリ コントローラーではなく、新しく作成されたログイン コントローラーになるようにします。

loginController = [[LoginController alloc] initWithWindowNibName:@"Login"];

編集

私が推測したように、ログイン コントローラーの 2 つの別個のインスタンスがあり、1 つしかないと考えています。xib ファイルを参照してください。

ここに画像の説明を入力

xib ファイル内のそのオブジェクト「ログイン コントローラー」は、ログイン コントローラーの別のインスタンスを作成します。アプリ コントローラーで割り当てるのと同じインスタンスではありません。

解決策は、親を IBOutlet にすることです。

@property (nonatomic, weak) IBOutlet AppController *parent;

また、アプリ コントローラーに割り当てないように、xib ファイルから自動的に読み込まれます。xib ファイルのログイン コントローラーのインスタンスにバインドするだけです(ファイルの所有者がアプリ コントローラーの場合は、親プロパティをオブジェクト アイコンに ctrl キーを押しながらドラッグする必要があります。問題が発生した場合は教えてください)。 . そのため、null が出力されます。アクションは、親プロパティが初期化されていない別のオブジェクトによって処理されます。

于 2013-03-11T21:27:10.550 に答える
1

viewDidLoad では、 という iVar にアクセスしますparent。ログイン時: プロパティにアクセスしますself.parent。それは同じかもしれないし、違うかもしれない。

あなた@synthesizeは財産を持っていましたか?もしそうなら、追加のオプションなしで?その後、あなたは元気になるはずです。親とself.parent同じものでなければなりません。

自動合成したの?それは大丈夫です。しかし、その後、対応する iVar が呼び出され_parentます。parentつまり、同じivarではない追加のivarが必要です。

詳細については、すべての宣言を質問に追加してください。

于 2013-03-11T20:45:24.513 に答える