这是asked before,但似乎没有明确的(当前的)答案。实际上是否可以使用主菜单构建一个Cocoa应用程序,完全来自代码(没有MainMenu.xib等) 。)以这种方式,它仍然会在提交到应用程序商店时通过审查?如果是这样,那么让它发挥作用的神奇咒语是什么?
额外的功劳,如果有人可以指向我不是2002年的教程或文档,并且可以在小牛队工作..
答案 0 :(得分:1)
嗯,它当然有可能。
我首先查看main.m,然后用NSApplicationLoad()替换NSApplicationMain(),这样就得到了一个NSApplication对象。
然后你可以使用标准的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"将被完全忽略)。