Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

Popover在Mac OS X Lion中已经成为正式控件

昨天心血来潮又把Lion装上了。这次是装到了移动硬盘里。效果良好。这次只要是为了看看Lion里Cocoa的新变化,顺道学习一下——虽然我对已有的Cocoa框架还没有熟悉。

打开最新的Xcode 4.1 DP5,很高兴的发现Popover已经成为一个标准控件。Popover在Xcode 4里用的很多。因为Popover现在非常流行,所以我就忍不住要测试以下。快速搜索了一下文档,发现Popover的文档暂时还没有进入Xcode的文档系统,所以只能硬着头皮,参考头文件里的文档,做了一个测试程序,感觉良好。 :)

先贴个截图:

好吧,界面上目前神马东东都没有。不过这是一个很好的状态,不是么?你可以在这个界面上自由发挥呀!

好了,下面拿代码说事儿。因为我试的时候还是走了一点点弯路的,不过既然写成文章了就不提了,直接进入正题。

用Xcode新建一个Cocoa项目。然后,创建一个NSViewController的子类,记得包含上xib(这样能省一些步骤)。我这里用的名字是MyPopoverViewController。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* MyPopoverViewController.h */
#import <Cocoa/Cocoa.h>

@interface MyPopoverViewController : NSViewController {
    NSPopover *popOver;
}

@property (retain) NSPopover *popOver;

- (IBAction)dismissPopover:(id)sender;
@end

/* MyPopoverViewController.m */

#import "MyPopoverViewController.h"

@implementation MyPopoverViewController
@synthesize popOver;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
        self.popOver = [[NSPopover alloc] init];
        self.popOver.contentViewController = self;
    }

    return self;
}

- (void)dealloc {
    [self.popOver release];

    [super dealloc];
}

- (IBAction)dismissPopover:(id)sender {
    [self.popOver performClose:sender];
}
@end

我为MyPopoverViewController.xib这样设计布局。当然,你可以随意,记得添加一个按钮,并设置action-(void)dismissPopover:(id)sender

然后,在AppDelegate中这样调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* TestAppAppDelegate.h */
#import <Cocoa/Cocoa.h>

@class MyPopoverViewController;
@interface TestAppAppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    NSButton *myButton;
    MyPopoverViewController *popControl;
}

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSButton *myButton;
@property (retain) MyPopoverViewController *popControl;

- (IBAction)showPopover:(id)sender;
@end

/* TestAppAppDelegate.m */
#import "TestAppAppDelegate.h"
#import "MyPopoverViewController.h"

@implementation TestAppAppDelegate

@synthesize window;
@synthesize myButton;
@synthesize popControl;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    self.popControl = [[MyPopoverViewController alloc] init];
}

- (IBAction)showPopover:(id)sender {
    [self.popControl.popOver showRelativeToRect:[self.myButton bounds] ofView:self.myButton preferredEdge:NSMaxXEdge];
}

- (void)dealloc {
    [self.popControl release];

    [super dealloc];
}

@end

MainMenu.xib也是随便设计。记得添加一个按钮,做一个Outlet,指向myButton,一个action指向- (IBAction)showPopover:(id)sender

测试程序基本就是这样了。如果没啥错误的话,编译运行应该一切OK。

应该说,Popover的使用方法也是很简单的。如果你了解一些Cocoa Touch的话,你应该会发现有样东西非常熟悉——ViewController。ViewController在Cocoa中的重要性也是越来越高了,虽然目前Cocoa的NSViewController还远没有UIViewController那么重要和完整,但是应该说,这是Cocoa今后的发展方向。

好了,关于Popover就简单的写这么多吧,我也要继续学习了。。。

(全文完)

Comments