从状态菜单加载xib窗口

时间:2013-10-21 01:51:58

标签: objective-c xcode macos cocoa

我有MainMenu.Xib,它有一个状态菜单元素。 MainMenu文件所有者映射到AppDelegate。

我还有另一个Xib是一个Window,它的文件所有者被映射到一个具有相同名称的ViewController。

所以我尝试了它有点工作是我在appDelegate中创建了一个动作,并使用First Responder将状态菜单中的菜单项映射到appDelete中的动作。

在我提出的行动中:

SubscriptionsViewController *vc = [[SubscriptionsViewController alloc] initWithNibName:@"Subscriptions" bundle:nil];
[vc view];

如果我单步执行代码,窗口会显示但随后会消失。所以我有两个问题

1)我认为有一种方法可以在不需要上述代码的情况下使用NSMenuItem加载xib。

2)如何让窗户立即关闭?我是否需要保存视图指针?

编辑:格式代码。

2 个答案:

答案 0 :(得分:1)

  

1)我认为有一种方法可以在不需要上述代码的情况下使用NSMenuItem加载xib。

由于NSWindow不像iOS(UIWindow:UIView)那样从NSView继承,因此使用NSViewController从xib加载窗口是没有意义的。请改用NSObject的子类。

@interface SubscriptionsViewController : NSObject

    @property (assign, nonatomic) IBOutlet NSWindow *window;

@end


@implementation SubscriptionsViewController

- (id)init
{
    self = [super init];
    if (self) {

       [NSBundle loadNibNamed:@"Subscriptions" owner:self];

    }
    return self;
}

@end
  

2)如何让窗户立即关闭?我是否需要保存视图指针?

  • 依赖于上下文来保留subscriptionsViewController的实例。您可以使用下面的代码显示一个窗口,其中窗口的实例是nib -

       self.subscriptionsViewController = [[SubscriptionsViewController alloc] init];
       [self.subscriptionsViewController.window makeKeyAndOrderFront:self];
    

请记住,如果在nib中设置了“Visible At Launch”,则在实例化subscriptionsViewController时窗口是可见的。

答案 1 :(得分:0)

您可以将窗口添加到MainMenu.xib中,而不是使用附加的xib文件,并在AppDelegare.h中创建一个插座

@property (assign) IBOutlet NSWindow *window;

然后您需要做的就是

window.isVisible = !window.isVisible;

采取必要的行动方法......

相关问题