gpt4 book ai didi

macos - Cocoa、Objective-C 如何正确地将参数从一个窗口传递到另一个窗口

转载 作者:行者123 更新时间:2023-12-03 17:25:37 25 4
gpt4 key购买 nike

我对 Cocoa/Obj-C 编程非常陌生。

我有相当简单的应用程序(目标平台Mac OSX 10.5和10.6),我的背景是C/C++系统编程。

我有一个主窗口,其中包含一些文本字段、按钮、属性等。我设置了 socket 和操作(希望正确)。单击其中一个按钮即可加载在另一个 NIB 中声明的附加窗口:

- (IBAction) openSettings: (id) sender
{
ConfigurationWindowController * wc=[[ConfigurationWindowController alloc] initWithWindowNibName:@"Configuration"];

[wc showWindow:self];
}

正在加载并显示新窗口。

我需要做以下事情:1)将一些字符串参数传递给第二个(“子”)窗口2)当第二个窗口关闭时,将此参数接收回主窗口。

我不确定在 Cocoa 中执行此操作的正确方法是什么。

@塞尔吉奥:非常感谢您的回复!在我的“子”窗口中,我存储指向主窗口的指针,在打开子窗口之前,我传递了一些参数:

ConfigurationWindowController * wc=[[ConfigurationWindowController alloc]     initWithWindowNibName:@"Configuration"];
mConfigWindow = wc;

[mConfigWindow setValuesToURL:@"some string here" storageParam:@"another string" callerWindowPtr:self];
[wc showWindow:self];

此方法已成功调用,我看到存储在“子”窗口类实例属性中的值。但是,当我尝试将此值分配给 setValuesToURL 方法中的文本字段时,GUI 元素仍然为 null ,我尝试在 awakeFromNib 方法中分配存储的字符串,但这里这些属性为 null! 。而且 self 指针的值是不同的 - 这意味着 initWithWindowNibName 创建的对象和带有 GUI 的实际窗口是不同的。显然,当我尝试传回值时,存储的指向“主”窗口的指针也为空。我怀疑问题出在 NIB 设置中——这让我很困惑。我怀疑这是对代码/NIB 关系的常见误解,我尝试了不同的方法但仍然无法使其工作。任何指导都会非常有用。

-(void) setValuesToURL:(NSString*)strServiceURL  storageParam:(NSString*) strStorageURL     callerWindowPtr:(AppletAppDelegate *)_callerWindow
{
@try {
NSLog(@"setValuesToURL was called with params %@ , %@" , strServiceURL , strStorageURL);
self.strDataStorageURL = strStorageURL;
self.strServerURL = strServiceURL;
self.callerWindow = _callerWindow;
[textServerURL setStringValue:[self strServerURL]];
[textDataStorageURL setStringValue:[self strDataStorageURL] ];

NSLog(@" after assigmnemnt %@ , %@" , [self strDataStorageURL], [self strServerURL]);

}
@catch (NSException * e) {
NSLog(@"exception inf0 %@ " ,[[ e userInfo] descriptionInStringsFileFormat]);
}
@finally {

}

}

好消息 - 现在字符串值已分配给 NSTextField 对象。我在“子”窗口上有一个按钮,单击后我试图回调父指针窗口方法:

- (IBAction) saveConfigurationSetings: (id) sender
{
NSLog(@"saveConfigurationSetings: (id) sender");
//close window and pass back URL strings
self.strServerURL = [textServerURL stringValue];
self.strDataStorageURL = [textDataStorageURL stringValue];
[self.callerWindow passMeBackData: [textServerURL stringValue] strStorageURLParam: [textDataStorageURL stringValue]];

[self close];

}

此处 callerWindow 变量为 null 并且 passMeBackData 失败。这是 h 中的声明:

@interface ConfigurationWindowController : NSWindowController {
...
AppletAppDelegate *callerWindow;
...
}


@property (assign) AppletAppDelegate * callerWindow;

在m文件中

@synthesize callerWindow;

最佳答案

你的方法的问题不在于如何做到这一点,而在于如何做到这一点。相反,这就是您设置的方式。

对于 Objective-C/Cocoa 来说更合适的流程可能是执行以下操作:

  1. ConfigurationWindowController添加到MainMenu.xib;将其连接到菜单项 ApplicationMenu > Preferences (如果没记错的话,这应该可以通过实现 - (IBAction)openPreferences:(id)sender 或类似的东西来完成。)

  2. 让用户更改设置,并将其写入 NSUserDefaults。可能不需要模态窗口或应用/取消/确定按钮,除非您的设置非常复杂或更改它们的成本非常昂贵(计算上)。

  3. 每当设置更改或窗口关闭时,都会向感兴趣的各方可以观察到的应用程序 NSNotificationCenter 发出通知。 注意:并非所有设置都需要触发通知;仅那些影响缓存设置值的正在进行的进程的进程。

还有其他方法,但这可能是最容易扩展的。

<小时/>

如果问题是在特定 Pane 上打开设置窗口;适当设置打开窗口的每个控件或菜单​​项的标记值;并使用 [sender tag] 检查应打开哪个 Pane 。

<小时/>

如果问题是您的应用程序中的每个进程都有一个非常具体的设置窗口,那么这可能是一件坏事™。

关于macos - Cocoa、Objective-C 如何正确地将参数从一个窗口传递到另一个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com