1

件名が具体的でなくて申し訳ありませんが、質問の分類方法がよくわかりません。レベルの高い質問ですが、常に遭遇しなければならないと感じているので、どのように対処しているのか知りたいです。私はオブジェクティブ C とオブジェクト指向プログラミングに比較的慣れていないので、これが多くの人にとって完全に明らかである場合はご容赦ください。

ここに行きます。mainMenu.xib にメイン ウィンドウとメイン アプリ コントローラーの両方を作成するココア アプリケーションがあります。私の myMainAppController オブジェクトには別の windowController が含まれています。たとえば、mySubWindowController は、以下のように独自の別の nib ファイルから開始されます。サブウィンドウに NSTextfield と NSButton の 2 つの要素があるとします。そう...

myMainAppController.h
@interface
   @property (strong) MySubWindowContorller *mySubWindowController;
   ........ so forth


MyMainAppController.m
@implementation
 ......
 self.mySubWindowController = [MySubWindowController alloc] initWithWindowNibName:
 @"mySubWindow"];  
 etc...


MySubWindowController.h
@ interface
  IBOutlet (weak) NSTextfield *myTextField;
  IBOutlet (weak) NSButton *myButton;
....

これまでのところ、とても良いと思います。かなり標準的なものですよね?ここに私の質問の要点があります。このクラスの構造の下で、サブウィンドウで進行している情報やアクティビティを mainAppController に戻し、mainAppController からサブウィンドウにデータを戻すにはどうすればよいでしょうか? テキストフィールド/ボタンから IBOutlet または IBAction を myMainAppController.h に戻せないように見えるので、KVO を使用する以外に、myMainAppController は mySubWindowController からどのように情報を取得しますか? myMainWindowController の要素を必要とするサブウィンドウに実装されているアクションがある場合はどうなりますか? アクション メッセージを myMainAppController に送り返すことができず、mySubWindowController はそれを含むクラスの他の要素にアクセスできません。

メインウィンドウとサブウィンドウがデータとロジックを調整する必要がある場合、このような状況で何をしますか? 私の経験不足のために完全に明らかな何かを見逃しているのでしょうか、それともこれはかなり一般的に発生する状況ですか? 私が自分のアプリに取り組んでいる比較的短い時間で、私はすでにこれに数回遭遇しました。他の人がこれにどのように対処するかを感じようとしています..

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

0

このためには、独自のカスタム デリゲートを作成する必要があります。以下のコードがお役に立てば幸いです。これには、AwindowController と BwindowController の 2 つのウィンドウ コントローラーがあります。AwindowController でアクティビティが発生した場合、BwindowController が認識します。たとえば、AwindowController に 1 つのボタンを作成した場合、そのボタンをクリックすると、BwindowController は AwindowController でボタンをクリックするメッセージまたはデータを取得します。そのように、送信したい任意のデータまたは文字列値を送信できます。 注:- カスタム デリゲートは BWindowController で記述されています。

#import "sampleDelegate.h"
#import <Cocoa/Cocoa.h>
#import "BWindowController.h"

@interface AWindowController : NSWindowController<sampleDelegate>

{
    NSString *text;
}
@property(readwrite,retain)NSString *text;
-(IBAction)doSet:(id)sender;

@end

#import "AWindowController.h"
#import "BWindowController.h"

@interface AWindowController ()

@end

@implementation AWindowController
@synthesize text;


- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }

    return self;
}

-(NSString*)getDataValue
{
    return @"Button clicked on AWindow";
}

- (void)windowDidLoad
{
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

-(NSString*)windowNibName
{
    return @"AWindowController";
}

-(IBAction)doSet:(id)sender
{
    [self setText:[self text]];
    BWindowController *b=[[BWindowController alloc]init];
    b.delegate=self;
    [b showWindow:self];
}
@end

#import <Cocoa/Cocoa.h>
#import "sampleDelegate.h"

@protocol sampleDelegate <NSObject>
@required
-(NSString *)getDataValue;
@end
@interface BWindowController : NSWindowController<sampleDelegate>
{
    NSString *bTextValue;
    id<sampleDelegate>delegate;
}
@property(readwrite,retain)NSString *bTextValue;
@property(readwrite,assign)id<sampleDelegate>delegate;
@end

#import "BWindowController.h"
@interface BWindowController ()

@end

@implementation BWindowController
@synthesize bTextValue,delegate;
- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }

    return self;
}
-(NSString *)getDataValue
{
    return nil;
}
- (void)windowDidLoad
{
   NSString *str= [[self delegate]getDataValue];
    [self setBTextValue:str];
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

-(NSString*)windowNibName
{
    return @"BWindowController";
}
@end
于 2013-09-30T08:44:44.647 に答える