没有 MainMenu.xib 的 Cocoa 应用程序?

Posted

技术标签:

【中文标题】没有 MainMenu.xib 的 Cocoa 应用程序?【英文标题】:Cocoa app without MainMenu.xib? 【发布时间】:2014-02-01 04:15:48 【问题描述】:

一直是asked before,但似乎没有明确的(当前)答案。. 是否真的可以仅通过代码(没有 MainMenu.xib 等)构建一个带有主菜单的 Cocoa 应用程序以这样的方式提交到应用商店时仍然会通过审查?如果是这样,让它发挥作用的魔法咒语是什么?

如果有人可以向我指出不是 2002 年的教程或文档,并且适用于小牛队,那就加分吧..

【问题讨论】:

除了启动 mainMenu.xib 之外,您还想启动其他窗口 xib 吗?? 不是真的,我只是想确保我真正了解幕后发生的事情,虽然我认识到 IB 是生产代码的最佳方式,但它在我的理解上留下了空白发生了什么事,所以我正在尝试在没有它的情况下做到这一点。 这是一个 SO 答案,如何通过代码(包括 MainMenu)制作没有 xib 文件的整个 Cocoa 应用程序:***.com/a/46759874/1418981 【参考方案1】:

嗯,以前确实是可以的。

我首先查看 main.m,然后将 NSApplicationMain() 替换为 NSApplicationLoad(),这样你就得到了一个 NSApplication 对象。

然后你可以使用标准的 NSMenu 方法(-addItem: 等)创建一个 NSMenu,然后调用

 [NSApplication sharedApplication].mainMenu = myMenu;

然后,你知道,制作一个 NSWindow,显示它等等。

当然,Apple 会在您启动时为您设置很多菜单项,而您在执行此操作时可能无法获得这些菜单项。如果是这样,您必须手动添加它们。

这真的不是我推荐的东西,但是你去吧。

【讨论】:

冒着听起来很愚蠢的风险......我的 main.m 看起来像这样,我什至会在哪里进行这些更改? int main(int argc, const char * argv[]) return NSApplication(argc, argv); 您必须删除一行并添加更多...调用 NSApplicationLoad() 然后连接菜单。这真的不容易,有很多事情你必须手工完成,我什至没有想到。【参考方案2】:

http://blog.moostep.com/xamarin-mac-helloworld-application-without-xib/ http://blog.moostep.com/creating-menu-for-xamarin-mac-app-using-csharp/

我对 Mac App Store 的了解还不够,不知道这是否会通过审核。我假设您可以将其从 C# 转换为 Objective-C。它不使用任何特殊的 Mono 或 Xamarin 功能。

阅读博客文章了解一些背景知识。同时,我将在此处粘贴我的 main.cs 和 AppDelegate.cs 版本:

main.cs:

using System;
using MonoMac.AppKit;

namespace XibFreeCocoaApp

    public class XibFreeCocoaApp
    
        static void Main (string[] args)
        
            NSApplication.Init ();

            var application = NSApplication.SharedApplication;
            application.Delegate = new AppDelegate();
            application.Run ();
        
    

AppDelegate.cs:

using System;
using System.Drawing;

using MonoMac.AppKit;
using MonoMac.Foundation;

namespace XibFreeCocoaApp

    public class AppDelegate : NSApplicationDelegate
    
        public override void FinishedLaunching (MonoMac.Foundation.NSObject notification)
        
            CreateMenu (NSProcessInfo.ProcessInfo.ProcessName);

            var window = new NSWindow (
                             new RectangleF (0, 0, 400, 300),
                             NSWindowStyle.Titled,
                             NSBackingStore.Buffered,
                             false) 
                Title = "Xib Free Cocoa App with Menu"
            ;

            window.CascadeTopLeftFromPoint (new PointF (20, 20));
            window.MakeKeyAndOrderFront(null);
        

        void CreateMenu (string appName)
        
            var mainMenu = new NSMenu();

            var appMenuItem = new NSMenuItem ();
            mainMenu.AddItem (appMenuItem);

            var appMenu = new NSMenu ();

            var quitMenuItem = new NSMenuItem (String.Format ("Quit 0", appName), "q", delegate 
                NSApplication.SharedApplication.Terminate(mainMenu);
            );

            appMenu.AddItem (quitMenuItem);

            appMenuItem.Submenu = appMenu;

            NSApplication.SharedApplication.MainMenu = mainMenu;
        
    

【讨论】:

【参考方案3】:

请注意,上面的代码不会更改具有子菜单的菜单项的标题 - 为此,您需要为子菜单分配标题,如下所示:

NSMenuItem someMenuItem = new NSMenuItem("Title 1");
NSMenu someMenuItemSubMenu = new NSMenu();
someMenuItemSubMenu.Title = "Title 2";

someMenuItem.Submenu = someMenuItemSubMenu;

在这种情况下显示的图块将是“标题 2”,而不是“标题 1”(实际上“标题 1”将被完全忽略)。

【讨论】:

以上是关于没有 MainMenu.xib 的 Cocoa 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6.3.1 中没有 mainmenu.xib 文件

Cocoa - awakeFromNib 没有被调用

Cocoa 应用程序菜单 - 如何重新创建?

我们在哪里可以为 MainMenu.xib 编写 windowDidBecomeKey 方法

可可无法连接动作

一个应用程序代表,两个窗口