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

时间:2014-02-01 04:15:48

标签: objective-c cocoa

这是asked before,但似乎没有明确的(当前的)答案。实际上是否可以使用主菜单构建一个Cocoa应用程序,完全来自代码(没有MainMenu.xib等) 。)以这种方式,它仍然会在提交到应用程序商店时通过审查?如果是这样,那么让它发挥作用的神奇咒语是什么?

额外的功劳,如果有人可以指向我不是2002年的教程或文档,并且可以在小牛队工作..

3 个答案:

答案 0 :(得分:1)

嗯,它当然有可能。

我首先查看main.m,然后用NSApplicationLoad()替换NSApplicationMain(),这样就得到了一个N​​SApplication对象。

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

 [NSApplication sharedApplication].mainMenu = myMenu;

然后,你知道,做一个NSWindow,表明等等。

当然,Apple推出时会为您设置许多菜单项,当您执行此操作时可能无法获得。如果是这样的话,你必须手动添加它们。

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

答案 1 :(得分:0)

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;
        }
    }
}

答案 2 :(得分:0)

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

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

someMenuItem.Submenu = someMenuItemSubMenu;

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