3

我是一个MacRuby和可可的完整n00b,所以请记住在回答时 - 我需要大量的细节和解释。 :)MacRuby +界面生成器:如何显示,然后关闭,然后再次显示一个窗口

我已经建立了一个简单的项目,它有2个窗口,它们都是用Interface Builder构建的。第一个窗口是使用表格视图的简单帐户列表。它在表格下方有一个“+”按钮。当我点击+按钮时,我想显示一个“添加新帐户”窗口。

我还有一个AccountsController < NSWindowController和一个AddNewAccountController < NSWindowController类,它们被设置为这些窗口的代表,并使用适当的按钮点击方法连接,并且插座引用所需的窗口。

当我点击帐户窗口中的“+”按钮,我有这样的代码火:

@add_account.center 
    @add_account.display 
    @add_account.makeKeyAndOrderFront(nil) 
    @add_account.orderFrontRegardless 

这个伟大的工程,我第一次点击+按钮。一切都显示出来了,我可以输入数据并将其绑定到我的模型。但是,当我关闭添加新帐户表单时,情况开始变差。

如果我设置添加新帐户窗口关闭,然后第二次点击+按钮,窗口仍然会弹出,但它被冻结。我无法点击任何按钮,输入任何数据,甚至关闭表格。我认为这是因为表单的代码已经发布,所以没有消息循环处理表单......但我不完全确定这一点。

如果我设置添加新帐户窗口不关闭,然后第二次我点击+按钮,窗口显示正常,它是可用的 - 但它仍然有我以前输入的所有数据...它仍然绑定到我以前的Account类实例。

我做错了什么?当我点击账户表格上的+按钮时,创建添加新账户表单的新实例,创建新的账户模型,将该模型绑定到表单并显示表单,有什么正确的方法?

...这是所有正在对OSX 10.6.6,64位完成后,用了XCode 3.2.4

+0

您是否已将其他元件连接到控制器(按钮/ textareas)?我有麻烦的下面的教程显示nsobjects下拉菜单控制器消息 – 2011-02-27 10:08:12

回答

1

的问题是,它不创建窗口每次。关闭时释放是一个令人讨厌的选项,通常只有当您知道窗口关闭时窗口控制器也被释放时才会使用。 (注意我从来没有使用过MacRuby,所以我会在Obj-C中提供代码,因为我知道它是正确的,希望你可以将它转换。我会假定GC是和MacRuby一样的。

现在有两种方法可以做到这一点。我不完全确定你的NIB /课程是如何建立的,因为它可能是两种方式之一。

-

来解决它的第一种方式是使用您使用的表单元素提及空出来的网点,当您再次显示窗口,例如[myTextField将setStringValue:@“”]。如果你使用的是可可绑定,那么它有点棘手,但基本上你必须确保绑定的对象是空白的。如果你是Cocoa的新手,我会建议你不要绑定。

-

第二种方法是使AddNewAccountController类NSWindowController的子类。当您按下+按钮时,您将创建一个新的实例并显示它(请记住将它存储在ivar中)。最好的办法是这样的:

if (!addAccountController) { 
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"]; 
    [[addAccountController window] setDelegate:self]; 
} 
[addAccountController showWindow:self]; 

这可以防止在窗口已经可见的情况下产生新的实例。然后,您需要实现委托:

- (void)windowWillClose:(NSNotification *)notification { 
    //If you don't create the account in the AddNewAccountController then do it here 
    addAccountController = nil; 
} 

显然,你需要将窗口移动到一个单独的NIB称为“AddNewAccountController”。在此NIB中,确保将文件所有者的类设置为AddNewAccountController,然后将文件所有者的窗口连接到窗口。

当所有这些设置完成后,您每次都会得到一个新的控制器/窗口。它还具有将笔尖和控制器分成更集中的单元的好处。

-

最后一件事。虽然在窗口中做这样的事情是很好的,但您最终可能希望通过表单来做这件事,因为这样可以防止添加帐户窗口隐藏在其他窗口后面的可能性。

+0

在xcode中,我没有什么明显的。 :)所以,一个.xib文件是一个NIB,对吧?我应该在单独的NIB中组织所有与彼此相关的界面元素 - 一个窗口和一个菜单,控制器和其他对象 - 而不是像我现在正在做的那样?这会让我更好地控制什么是加载的,什么时候......以及NIB中的所有UI元素都是在加载NIB时创建的......并且我可以使用awakeFromNib实例化我的模型并将其绑定到窗口的.datasource。这听起来正确吗? – 2011-01-30 18:35:55

相关问题