对于主题行缺乏特异性,我深表歉意,但是我不确定如何对我的问题进行归类。这是一个高水平的问题,但我觉得人们总是必须一直遇到这个问题,而且我想知道他们是如何处理的。对于目标c和面向对象的编程,我是一个相对的菜鸟,如果对您来说这完全是显而易见的,请原谅我。
开始。我有一个可可应用程序,可以在mainMenu.xib中创建主窗口和主应用程序控制器。我的myMainAppController对象包含另一个windowController,例如mySubWindowController,它是从其自己的独立nib文件启动的,如下所示。可以说subWindow有两个元素,可能是NSTextfield和NSButton。所以...
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无法访问其包含类的其他元素。我想我可以在myMainAppController中声明并定义指向mySubWindowController的所需元素的软指针,但是在某种程度上,这似乎违反了“面向对象”和本地化的规定。
当主窗口和子窗口需要协调数据和逻辑时,在这种情况下该怎么办?由于我的经验不足,我是否错过了一些完全显而易见的东西?还是这种情况经常发生?在开发应用程序的较短时间内,我已经遇到过几次。试图感受别人如何处理这个问题。
预先感谢您的任何想法。
最佳答案
为此,您必须编写自己的自定义委托。希望下面的代码对您有所帮助。在此有两个窗口控制器,假设AwindowController和BwindowController。如果在AwindowController上发生了任何活动,则BwindowController将会了解。例如,如果我们单击该按钮,则我在AwindowController中创建了一个按钮,然后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