【问题标题】:Loading xib window from status menu从状态菜单加载 xib 窗口
【发布时间】:2013-10-21 01:51:58
【问题描述】:

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

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

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

在我提出的行动中:

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

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

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

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

编辑:格式代码。

【问题讨论】:

    标签: objective-c xcode macos cocoa


    【解决方案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 时窗口是可见的。

    【讨论】:

    • MYCentralViewController 假设是 SubscriptionsViewController?
    • 是的!编辑了我的答案
    【解决方案2】:

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

    @property (assign) IBOutlet NSWindow *window;
    

    那么你需要做的就是

    window.isVisible = !window.isVisible;
    

    在必要的操作方法中...

    【讨论】:

    • 我最初是这样做的,但是这个窗口会包含大量逻辑,并且不希望它在 appdelegate 中乱扔垃圾。所以我想把它分开。
    • 然后,您肯定需要像在示例中那样启动 xib 文件...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多