wli*_*psc 21 macos cocoa objective-c
通常我正在制作iOS应用程序,但现在我正在尝试制作OS X应用程序,而且我在一开始就迷路了.说我制作iOS应用程序的样式完全是程序化的,没有xib文件或者只是因为我通过键入而不是拖动来控制更多.但是在OS X编程中,它从一些带有菜单项和默认窗口的xib文件开始.菜单项中有很多项目,所以可能不是我想乱搞的东西,但我想以编程方式自己创建我的第一个窗口.
所以我这样做了:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSUInteger windowStyleMask = NSTitledWindowMask|NSResizableWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask;
NSWindow* appWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(200, 200, 1280, 720) styleMask:windowStyleMask backing:NSBackingStoreBuffered defer:NO];
appWindow.backgroundColor = [NSColor lightGrayColor];
appWindow.minSize = NSMakeSize(1280, 720);
appWindow.title = @"Sample Window";
[appWindow makeKeyAndOrderFront:self];
_appWindowController = [[AppWindowController alloc] initWithWindow:appWindow];
[_appWindowController showWindow:self];
}
Run Code Online (Sandbox Code Playgroud)
所以在这里,我首先创建了一个窗口,然后使用windowController来初始化这个窗口.窗口确实以这种方式显示,但我只能在这里指定内部元素,如按钮和标签,但不能在windowController中指定.这让我心疼,所以我尝试了另一种方式.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
_appWindowController = [[AppWindowController alloc] init];
[_appWindowController showWindow:self];
}
Run Code Online (Sandbox Code Playgroud)
在此之后我想loadWindow:在windowController 中设置函数中的其他元素,如下所示:
- (void)loadWindow
{
[self.window setFrame:NSMakeRect(200, 200, 1280, 720) display:YES];
self.window.title = @"Sample window";
self.window.backgroundColor = [NSColor lightGrayColor];
NSButton* sampleButton = [[NSButton alloc] initWithFrame:NSRectFromCGRect(CGRectMake(100, 100, 200, 23))];
sampleButton.title = @"Sample Button!";
[sampleButton setButtonType:NSMomentaryLightButton];
[sampleButton setBezelStyle:NSRoundedBezelStyle];
[self.window.contentView addSubview:sampleButton];
NSLog(@"Loaded window!");
[self.window makeKeyAndOrderFront:nil];
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这永远无效.该loadWindow:不会被调用,也不是windowDidLoad:.他们去哪儿了?
请不要问为什么我不使用笔尖.我希望在内部制作一些高度自定义的视图,可能是OpenGL,所以我不认为nib可以处理它.如果有人能提供帮助,我将不胜感激.谢谢.
而且,谁知道如何以编程方式从头开始创建菜单项?
我正在使用最新的XCode.
Cli*_*udo 41
我花了整整一个星期天自己挖掘这个问题.就像问这个问题的人一样,我更喜欢编写iOS和OSX而不使用nib文件(主要是)或Interface Builder,而不是裸机.我尽管使用NSConstraints.如果你正在做更简单的用户界面,那么可能并不值得避免使用IB,但是当你进入一个更复杂的用户界面时,它会越来越难.
事实证明这很简单,为了"社区"的利益,我想我会在这里发布一个简明的最新答案.有一些较旧的Blog帖子,我发现最有用的是来自Lap Cat Software的那些.先生,给你戴帽子'先生!
这假设ARC.修改你的main()看起来像这样:
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
int main(int argc, const char *argv[])
{
NSArray *tl;
NSApplication *application = [NSApplication sharedApplication];
[[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:application topLevelObjects:&tl];
AppDelegate *applicationDelegate = [[AppDelegate alloc] init]; // Instantiate App delegate
[application setDelegate:applicationDelegate]; // Assign delegate to the NSApplication
[application run]; // Call the Apps Run method
return 0; // App Never gets here.
}
Run Code Online (Sandbox Code Playgroud)
你会注意到那里还有一个Nib(xib).这仅适用于主菜单.事实证明,即使在今天(2014年),显然也无法轻松设置位置0菜单项.这是标题=您的应用程序名称的那个.您可以使用[NSApplication setMainMenu]但不是那个设置其右侧的所有内容.所以我选择在新项目中保留由Xcode创建的MainMenu Nib,并将其剥离到位置0项.我认为这是一个公平的妥协,我可以忍受.UI Sanity的一个简短插件......当您创建菜单时,请遵循与其他Mac OSX应用程序相同的基本模式.
接下来修改AppDelegate看起来像这样:
-(id)init
{
if(self = [super init]) {
NSRect contentSize = NSMakeRect(500.0, 500.0, 1000.0, 1000.0);
NSUInteger windowStyleMask = NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask;
window = [[NSWindow alloc] initWithContentRect:contentSize styleMask:windowStyleMask backing:NSBackingStoreBuffered defer:YES];
window.backgroundColor = [NSColor whiteColor];
window.title = @"MyBareMetalApp";
// Setup Preference Menu Action/Target on MainMenu
NSMenu *mm = [NSApp mainMenu];
NSMenuItem *myBareMetalAppItem = [mm itemAtIndex:0];
NSMenu *subMenu = [myBareMetalAppItem submenu];
NSMenuItem *prefMenu = [subMenu itemWithTag:100];
prefMenu.target = self;
prefMenu.action = @selector(showPreferencesMenu:);
// Create a view
view = [[NSTabView alloc] initWithFrame:CGRectMake(0, 0, 700, 700)];
}
return self;
}
-(IBAction)showPreferencesMenu:(id)sender
{
[NSApp runModalForWindow:[[PreferencesWindow alloc] initWithAppFrame:window.frame]];
}
-(void)applicationWillFinishLaunching:(NSNotification *)notification
{
[window setContentView:view]; // Hook the view up to the window
}
-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
[window makeKeyAndOrderFront:self]; // Show the window
}
Run Code Online (Sandbox Code Playgroud)
和宾果......你很高兴去!您可以从AppDelegate开始工作,就像您熟悉的那样.希望有所帮助!
更新:我不再在代码中创建菜单,如上所示.我发现你可以在Xcode 6.1中编辑MainMenu.xib源代码.工作得很好,非常灵活,所需要的只是一些实验,看看它是如何工作的.比在代码中搞乱并且易于本地化更快!看图片了解我的目的:

| 归档时间: |
|
| 查看次数: |
18483 次 |
| 最近记录: |