跟我一起学MAC编程吧(4)
可能是感觉到对Coredata略知一二了,重新跟着写Coredata的兴趣突然减小。那么Coredata就往后放一放,这一节,我们来研究一下浮动工具条。其实这也是个不错的东东,而且还相当简单。CSDN 上写博客一个挺大的问题就是源代码,稍微内容多一点的文章,代码就会很长,都贴出来就会让人觉得不舒服,我不知道有没有办法弄个源代码下载。这点我还不懂,有知道的可以指教一下。
我用VC的时候,几乎没有用过这种浮动工具条。
这样一个工具条,在OS X 里面是一个特殊的窗口: Panel, 你可以建立一个独立空的的Xib文件,然后找到Panel 窗口托进来。
这个窗口有一堆的属性,我测试了其中的一些, 比如你把标题点掉的话,也会正常显示。但是,它就不会浮动的其他窗口的上方了。你还可以试试改变窗口的大小,等等,找到一个合适的方法。
工具条里面使用的Matrix,大概是矩阵的意思。 这个东西让我花了不少时间,我看到例子里面有这个东西,却无论如何在控件库里面找不到它。我查了许多信息,不少人在找它,同样的一个问题。后来,终于给我找到了。你要先放一个矩形按钮在窗口,选中这个按钮,打开上方的主菜单,【编辑】下面你可以找到Matrix, 点了之后,在看这个按钮的属性,它已经是Matrix了。你可以调整Matrix的个数,也可以设置里面按钮的参数,多试试找到你想要的。你可以为每个按钮添加一个图形,诸如此类。
建这个例子的时候,我选中了基于文档的模版。你也可以这么做。
然后向界面添加一个Object对象,将它的类名设置成 MKAppDelegate, 这个类的内容如下:
// MKAppDelegate.h
// MyTypset
//
// Created by wuzhiqiang on 12-12-18.
// Copyright (c) 2012年 wuzhiqiang. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MKAppDelegate : NSObject
- (IBAction)showOrHideToolPalette:(id)sender;
@end
// MKAppDelegate.m
// MyTypset
//
// Created by wuzhiqiang on 12-12-18.
// Copyright (c) 2012年 wuzhiqiang. All rights reserved.
//
#import "MKAppDelegate.h"
#import "MKToolPaletteController.h"
#pragma mark *** NSWindowController Conveniences ***
@interface NSWindowController(SKTConvenience)
- (BOOL)isWindowShown;
- (void)showOrHideWindow;
@end
@implementation NSWindowController(SKTConvenience)
- (BOOL)isWindowShown {
// Simple.
return [[self window] isVisible];
}
- (void)showOrHideWindow {
// Simple.
NSWindow *window = [self window];
if ([window isVisible]) {
[window orderOut:self];
} else {
[self showWindow:self];
}
}
@end
@implementation MKAppDelegate
#pragma mark *** Launching ***
// Conformance to the NSObject(NSApplicationNotifications) informal protocol.
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
// The tool palette should always show up right away.
[self showOrHideToolPalette:self];
}
- (IBAction)showOrHideToolPalette:(id)sender {
// We always show the same tool palette panel. Its controller doesn't get deallocated when the user closes it.
[[MKToolPaletteController sharedToolPaletteController] showOrHideWindow];
}
@end
我们这个AppDelegate是整个应用的控制器。因此,它能够建立和管理跟应用同级别的Window。
将File‘s Owner 的delegate 设置成我们这个App Delegate对象。如果你愿意,还可以增加一个菜单项,然后跟App里面的那个方法连接。
前面我们说了工具栏xib文件的方法。建立后,按照MVC的原则, 我们建立一个 MKToolPaletteController 类,它是NSWindowController的子类。这个类的内容是这样。
// MKToolPaletteController.h
// MyTypset
//
// Created by wuzhiqiang on 12-12-18.
// Copyright (c) 2012年 wuzhiqiang. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface MKToolPaletteController : NSWindowController
+ (id)sharedToolPaletteController;
@end
// MKToolPaletteController.m
// MyTypset
//
// Created by wuzhiqiang on 12-12-18.
// Copyright (c) 2012年 wuzhiqiang. All rights reserved.
//
#import "MKToolPaletteController.h"
@interface MKToolPaletteController ()
@end
@implementation MKToolPaletteController
+ (id)sharedToolPaletteController {
static MKToolPaletteController *sharedToolPaletteController = nil;
if (!sharedToolPaletteController) {
sharedToolPaletteController = [[MKToolPaletteController allocWithZone:NULL] init];
}
return sharedToolPaletteController;
}
- (id)init{
self = [self initWithWindowNibName:@"ToolsPalette"];
if (self) {
[self setWindowFrameAutosaveName:@"ToolsPalette"];
}
return self;
}
- (void)windowDidLoad
{
[super windowDidLoad];
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}
@end
最后顺便说一下 sharedToolPaletteController 这个方法,在苹果里面这个叫做类方法,基本跟C++里面的静态函数类似。这种方法跟具体的对象无关,它对这个类的所有对象起作用,类方法往往执行静态变量的操作,静态变量可以在类里,这个类的所有对象都使用这一个变量,也可以在方法里面定义。他们的不同之处在于他们的可见性,函数里的静态变量,只在这个函数里可见。外面是看不到的。你不会希望屏幕上出现多个这样的工具条吧?那么这个静态函数与静态变量的使用正合适。