没有 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 文件