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

Objective c 没有MainMenu.xib的Cocoa应用程序?,objective-c,cocoa,Objective C,Cocoa,已经有了,但似乎没有明确的(当前的)答案。。是否真的可以专门从代码(无MainMenu.xib等)构建一个带有主菜单的Cocoa应用程序,从而在提交到应用商店时仍能通过审查?如果是这样的话,什么是魔法咒语(s)使这项工作 如果有人能给我指出一份不是2002年的、对小牛队有用的教程或文档,我会得到额外的奖励。好吧,这以前当然是可能的 我首先查看main.m,用NSApplicationLoad()替换NSApplicationMain(),这样就得到了一个NSApplication对象 然后,您可

已经有了,但似乎没有明确的(当前的)答案。。是否真的可以专门从代码(无MainMenu.xib等)构建一个带有主菜单的Cocoa应用程序,从而在提交到应用商店时仍能通过审查?如果是这样的话,什么是魔法咒语(s)使这项工作


如果有人能给我指出一份不是2002年的、对小牛队有用的教程或文档,我会得到额外的奖励。

好吧,这以前当然是可能的

我首先查看main.m,用NSApplicationLoad()替换NSApplicationMain(),这样就得到了一个NSApplication对象

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

 [NSApplication sharedApplication].mainMenu = myMenu;
然后,你知道,做一个窗口,展示它,等等

当然,有很多菜单项是苹果在你发布时为你设置的,而当你这么做的时候你可能得不到。如果是这样的话,你必须手工添加它们

这真的不是我推荐的东西,但你可以试试。

我对Mac应用商店了解不够,不知道它是否能通过测试。我想你可以把它从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;
        }
    }
}

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

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

someMenuItem.Submenu = someMenuItemSubMenu;

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

在启动主菜单的同时,您是否希望启动其他窗口xib。xib??不太可能,我只是想确保我真正了解幕后发生的事情,虽然我认识到IB是编写生产代码的最佳方式,但它在我对正在发生的事情的理解上留下了空白,所以我正试图在没有IB的情况下完成这项工作。下面是一个答案:如何在没有代码(包括主菜单)中的xib文件的情况下制作整个Cocoa应用程序:冒着听起来愚蠢的风险。。我的main.m看起来像这样,我在哪里做这些更改呢?int main(int argc,const char*argv[]){return NSApplication(argc,argv);}您必须删除这一行,然后再添加一行……调用NSApplicationLoad(),然后连接菜单。这真的不是一件容易的事,有很多事情你必须用手去做,我甚至都没想过。