1

对于主题行缺乏特异性,我深表歉意,但我不完全确定如何对我的问题进行分类。这是一个高层次的问题,但我觉得人们必须一直遇到这个问题,我想知道他们是如何处理这个问题的。我是客观 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;
....

到目前为止,我认为很好。很标准的东西,对吧?所以这是我问题的症结所在。在我的类的这种结构下,我如何将 subWindow 中发生的任何信息或活动返回到我的 mainAppController 以及从 mainAppController 到 subWindow 的数据?我似乎无法将 IBOutlet 或 IBAction 从文本字段/按钮返回到 myMainAppController.h,所以除了使用 KVO 之外,myMainAppController 将如何从 mySubWindowController 获取任何信息?如果在 subWindow 中实现了需要 myMainWindowController 元素的操作怎么办?我无法将操作消息发送回 myMainAppController 并且 mySubWindowController 无权访问其包含类的其他元素。

当主窗口和子窗口需要协调数据和逻辑时,在这种情况下你会怎么做?由于我的经验不足,我是否遗漏了一些完全明显的东西,还是这种情况相当普遍?在我开发我的应用程序的相对较短的时间内,我已经遇到过几次。试图了解其他人如何处理这个..

提前感谢您的任何想法。

4

2 回答 2

0

为此,您必须编写自己的自定义委托。希望下面的代码对您有所帮助。这里有两个窗口控制器,比如说 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
于 2013-09-30T08:44:44.647 回答
0

如果只有一个 mainAppController,则应该使用单例模式。创建一个方法 +getSingleton() 以从任何地方访问单例实例。NSApplication 也使用了单例模式,参见 +sharedApplication()。

关于objective-c上下文中的单例模式的讨论可以在这里找到:https ://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/Singleton.html

如果由于某种原因不能使用单例模式,则需要从窗口返回到 mainAppController 的链接。为此,请取消选中 IB 中的选项以自动实例化子窗口。相反,在您的 mainAppController 中实现 awakeFromNib 并自己实例化子窗口,将指针传递给 mainAppController。

于 2013-10-01T08:20:28.047 回答