在Mac OS的应用程序开发中,有一个非常好玩的东西,就是Growl,相信用过“鸭子”的人都知道,虽然写这个东西不是什么难事,而且也有一些文章,但是实在无奈那些文章写的太不详细,于是折腾了半天终于折腾出来了,现在我就来说一下如何在应用程序中发送Growl消息。
首先,要了解Growl的话,可以去Growl官方网站,我们只需要下载一个Growl库就可以了。
下载完成后,要做的事情很简单,我们首先添加这个库到我们代码中去,直接拖动过去就可以了,不需要添加现有的framework,因为如果添加现有的话,可能会有些奇怪的诡异错误。注意,如果这个地方怎么拖动过去,怎么放到下面都出现了奇怪的诡异问题的话,直接将这个framework放置到/HD/系统/资源库/Frameworks目录下,做全局的资源库,这样就不会出错。
好了,既然我们添加了资源库,我们就可以写代码了,代码很简单,我们在应用程序中,会有一个MainController,我们在MainController里写一些测试代码即可。
= End of buffer =
在应用程序开发的时候有很多这样的情况,就是我想在全局使用一个快捷键然后我可以随时调用它。例如Things这个应用,你可以在窗体写自己的一些内容,如下图所示。但是更有意思的是,如果我能在全局去使用就好了,因为我们在大多数的时候,都要跳转到这个程序中,然后在程序中查询,如Things,我必须打开Things,然后添加我的内容,或者减少一个内容,如下图。
如果我能在邮件中,或者浏览器中,忽然发现这是我想看的东西,然后添加到Things中,这样多好,于是Things就出了下面这个功能。
也就是说,我可以不在应用程序窗体上进行应用程序操作。
听起来好像有点复杂,因为在操作系统中,任何程序的激活状态都是单一的,比如你不能一边魔兽一边写程序,你必须要“专注”某个应用程序来使用,比如我想发Twitter,而我又在写代码,我必须切换到Twitter客户端去写东西,而无法在当前“激活”程序的程序中去执行,非要将Twitter客户端激活,然后才能执行。
= End of buffer =
为什么Table View有这么多文章系列,因为Table View是最常用的也是最复杂也是最可定制性的一个控件,现在我就来说说如何去写一个更加复杂的Table View,通过这个,你就可以知道如何去使用,绑定和更新Table View了。
前面我们写了几种Table View的操作方式,但是1,2都比较初级,3还是比较中等,从这之后,我会写更高级的开发Table View的方式。这次我会提供源代码下载。ok,我们首先来看看程序的样子。
嗯,看上去有那么点点小复杂,那么我来说说这个程序做什么。这个程序是个很经典的搜索程序,当在右上角搜索的时候,我们就需要使用tableview来显示结果。
= End of buffer =
在应用程序开发过程中,我们经常需要用多个窗体,比如用户配置,添加一个东西,或者有关说明等等,毕竟一个窗体能够做的事情太少了,自然而然,我们就需要多个窗体,好吧,现在我来说说如何使用多窗体。
基本上Window就是普通的窗体,而后面几种,可以是Panel或者特殊的窗体。而打开窗体的方式有两种,一种是在同一个nib文件里打开,其他的窗体属于一个nib文件描述,第二种是新的nib文件和新的controller。我们的程序还是和上一次的一样,这里说的还是和程序无关,只是用来演示,如下图。
= End of buffer =
这篇文章要说的东西不多,而且也没那么复杂,只是作为笔记的用途,以后自己可能再回过头写的时候可能会需要这样的资料。
写一个简单的程序,这个程序大概叫Password Saver,我相信应该有很多这样的程序了,而且这样的程序也不是很复杂,不过在Windows下用到过一个比较顺手的,在Mac下还没有,所以就准备自己写一个,也算是自己用的一个小工具。这篇文章不是围绕这个程序来写的,所以,并不会和程序有多大关系。首先还是看看我们的效果。
简单说一下要做的事情,输入一个key,能够得到密码。比如我设置了我这个博客的后台的用户名,然后想要得到密码,我只需要输入用户名,然后就可以得到密码了,我可以将这个key设置为guojingkey,然后得到密码。当然,程序有很多其他部分,我就不展现了。
= End of buffer =
在读本篇文章之前,推荐先看看Mac开发 – Table View(1)和Mac开发 – Table View(2),前两篇文章分别讲解了TableView的一些基本功能和绑定方法,当只有一列的时候,我们可以通过ArrayController的方法绑定,当有两列的时候,我们可以通过Dictionary的方法绑定,但是有多列的时候,我们并不好绑定,现在我就来说说用对象和ArrayController的方法绑定,同时,我们这次实现的程序要复杂一点。
这个程序很简单,我们需要的是点击Add new添加一行,点击Delete删除一行,首先我们先使用Interface Builder创建一个这样的窗体,创建完成后我们可以开始写我们的类。
创建一个People的类然后编写如下代码,以下是头文件代码。
= End of buffer =
在开发应用程序的时候,特别是当今网络特别充足和重要的时候,网络应用和桌面应用史无前例的整合起来,其界限也越来越模糊。所以网络应用可以向桌面应用开放API,然后桌面应用去调用,这样可以方便的维护一份代码,并且可以push更新到用户手里。
而在设计的时候,通常情况下都是客户端发送相应的Http请求,并包含某些内容,发送完毕之后,等待服务器端的响应。而在服务器端,得到请求的内容并生成相应的结果返回即可。虽然这个过程很好理解,很简单,但是在Mac和iPhone开发上,还是有点麻烦,而且国内资料又少,所以这里我写一下如何实现发送HttpRequest请求,方便后面的同学。
这段代码可以适用与Mac OS X和iPhone应用。
界面我就用Mac的桌面应用做,因为简单,效果一样,界面可以做成如下模样,如何连接就各位自己去连接了,我前面的文章说的很明白了。
当我们按下按钮的时候,就去获取相应的网站/服务器的返回的请求。调用方法如下。
- (IBAction)buttonClicked:(id)sender
{
NSString *receive = [RequestSender sendRequest:@"http://wt.jguoer.com"];
textbox.title = receive;
NSLog(@"Clicked");
}
RequestSender是我写的一个类,这个类就是用于发送Http请求的,具体代码如下。
#import <Cocoa/Cocoa.h>
@interface RequestSender : NSObject {
}
+ (NSString*)sendRequest:(NSString*)url;
@end
实现代码如下所示,我已经写了详细的注释了,所以我就不需要再多说什么了。
+ (NSString*)sendRequest:(NSString*)url
{
//准备发送httprequest
NSString *urlString = url;
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"GET"];
//设置http头
NSString *contentType = [NSString stringWithFormat:@"text/xml"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; [...]
= End of buffer =
我们在Mac开发 – Table View(1)里面使用了Table View这个控件,可是这个控件是一个非常复杂的控件,我们使用于Array Controller绑定的方式去绑定数据有一个明显的缺点,就是只能绑定一个列的数据,这在很多情况下是没有多大的用处的,这个时候我们就需要绑定多个列的数据,当绑定多个列的数据的时候,我们可以使用Dictionary Controller绑定。
我们首先创建一个项目,然后将UI制作如下图即可。
我们在项目中添加一个文件(类),继承自NSObject,注意,这里不需要使用什么NSView的子/派生类,我们只需要使用NSObject类即可。取名NSDicController,然后我们写头文件如下。
#import <Cocoa/Cocoa.h>
@interface NSDicController : NSObject {
IBOutlet NSWindow *window;
IBOutlet NSTableView *tableView;
IBOutlet NSDictionaryController *dictionaryProxy;
}
@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTableView *tableView;
@end
写完头文件之后,写内容代码。
#import "NSDicController.h"
@implementation NSDicController
@synthesize window;
@synthesize tableView;
@end
写到这里都不是那么难理解,好,我们现在先连接一下我们的元素,因为前几篇文章我已经说的很清楚了,所以这里我就不再详细的讲解如何连接了,我这里给出一些示例即可。首先我们还是加一个object,如下所示。
加完之后,我们更改为我们的相应的类即可,更改之后,我们再连接相应的内容到UI上,依旧还是Control+鼠标连接,连接后连接器如下所示。
这样,我们就连接了我们的基本要素,连接完成后,我们就需要编写代码来实现多列的功能实现了,这里我们需要使用的一个方法是awakeFromNib,连接后,当应用程序启动会自动调用和执行awakeFromNib这个方法,我们更改方法如下,代码可能不那么好理解,我加了一些注释。
#import "NSDicController.h"
@implementation NSDicController
@synthesize window;
@synthesize tableView;
- (void)awakeFromNib
{
//清空现有的table的列
NSArray *tableColumns [...]
= End of buffer =
Text View算是Mac里面最常用但是最复杂的控件之一,我也是用了一下午的时间才知道如何使用这个控件,Mac控件并不像VC或者C#一样直观上是消息通信模式,也不是通过事件,添加相应对象的子节点去增加控件内容。Text View算是比较特别的控件,复杂的Text View控件可以做出很多复杂的效果,在iPhone上更是如此,最有名的软件如Twitterrific的Mac版本和iPhone版本显示Twits都是使用的Text View。Text View就好像C#中的Gridview,或者C++的listbox。
首先我们创建一个项目叫TextViewTest,创建好之后,我们在Class文件夹下面添加一个类,取名叫Controller(这里可以创建位NSObject或者位NSView的子类都可以)。
创建好之后,我们打开MainWindow.xib文件,然后制作UI如下图所示,我们的需求很简单,单击按钮添加一行数据。
编写好了UI之后,我们就需要连接一些基本的东西,这里我们拖动一个Object对象进来,并改成相应的Class。
拖动过来还需要更改为相应的Controller。
更改后,我们的这个Controller就是我们的Controller类的一个对象了。这里我们需要写一下Controller类,头文件我们可以定义如下。
#import <Cocoa/Cocoa.h>
@interface Controller : NSView {
//定义数据源数组
NSMutableArray *array;
//定义数据源数组的Controller,连接用
IBOutlet NSArrayController *arrayController;
IBOutlet NSButton *button;
}
@property (nonatomic,retain) IBOutlet NSButton *button;
- (void) buttonClicked:(id)sender;
@end
然后我们实现的代码很简单,每次点击都添加一个test字符串。
#import "Controller.h"
@implementation Controller
@synthesize button;
- (void) buttonClicked:(id)sender
{
//添加字符串
[arrayController addObject:@"test"];
}
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) { [...]
= End of buffer =
按照我的个性,不会把Hello World写好几遍,但是Mac开发确实和一般的开发过程有点不太一样,说一般,可能是因为我用Windows用太久了吧,对事件和消息模式感到特别的熟悉,但是对Mac的连接模式,感觉还是有点怪怪的,所以在做Mac下的应用程序开发的时候,还是花了一点时间,所以,刚好有空,就纪录一下。由于HelloWorld和iPhone前面说的差不多,所以这里顺带还会说一下事件。
同样,还是打开XCode,但是我们这里创建的是一个Mac应用程序,如下图。
这里,我们创建一个HelloWorld应用程序,创建完成之后,我们就能够看到一个非常熟悉的XCode界面。
虽然我们有XCode这个IDE帮助我们开发Mac应用程序,而且好像看上去和开发iPhone应用程序差不多,这个时候你说不定已经开始摩拳擦掌了,但是可惜的是,在开发一个Mac的Hello World应用程序,并执行一个事件还不是那么容易的问题,当然,这个时候如果我们退缩了的话那就永远写不了一个HelloWorld程序了。
首先,我们打开MainMenu.xib这个文件,首先我们还是会看到熟悉的Interface Builder。
我们做主界面如上图所示即可,上面一个TextField,下面一个Button。一个非常简单的应用程序,我们想做的是当单击按钮,在文本框中显示Hello World。这个时候,可能有iPhone开发经验的你会想我们是不是要加一个Controller,是View还是什么呢?其实iPhone开发和Mac开发有一些相同的地方,但是Mac开发还是有一些复杂的,这里我们首先要创建一个文件,并取名叫MainController。
我们分别在文件的头文件和代码文件中编写如下代码,加粗的是后来加上的意思。头文件如下(注意,我们这里也可以不用创建继承自NSView的类,直接继承NSObject也可以):
#import <Cocoa/Cocoa.h>
@interface MainController : NSView {
IBOutlet NSButton *button;
IBOutlet NSTextFieldCell *textbox;
}
@property (nonatomic,retain) NSButton *button;
@property (nonatomic,retain) NSTextFieldCell *textbox;
- (IBAction)buttonClicked:(id)sender;
@end
上面代码想做的事情已经很明显了,现在我们在代码文件中实现如下代码:
#import "MainController.h"
@implementation MainController
@synthesize button;
@synthesize textbox;
- (IBAction)buttonClicked:(id)sender
{
textbox.title = @"Hello World";
}
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// [...]
= End of buffer =