0

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

我还有另一个 Xib,它是一个窗口,它的文件所有者映射到同名的 ViewController。

因此,我尝试过并且有效的是我在 appDelegate 中创建了一个动作,并使用 First Responder 将状态菜单中的菜单项映射到 appDelete 中的动作。

在我提出的行动中:

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

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

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

2)如何防止窗口立即关闭?我需要保存视图指针还是什么?

编辑:格式代码。

4

2 回答 2

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 时该窗口是可见的。

于 2013-10-21T02:30:25.067 回答
0

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

@property (assign) IBOutlet NSWindow *window;

那么你需要做的就是

window.isVisible = !window.isVisible;

在必要的行动方法...

于 2013-10-21T02:02:31.787 回答