Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

记忆窗口位置

在程序中记忆窗口的位置,以便在下次打开的时候恢复记忆的位置。这对很多程序来说还是比较有必要的。方法很简单:

1
2
3
4
5
6
7
8
9
10
- (void)windowDidMove:(NSNotification *)notification {
    // 自动记忆和恢复位置
    [self.window setFrameAutosaveName:@"Position"];
    /* 如果是基于文档的程序
    [[self.window windowController] setShouldCascadeWindows:NO];
    [self.window saveFrameUsingName:[window representedFilename]];
    */
    // 手动记忆位置
    [self.window setFrameUsingName:@"Some name"];
}

// 如果是手动保存,则需要手动恢复

1
2
3
- (void)awakeFromNib {
    [self.window setFrameAutosaveName:@"Some name"];
}

// 清除记忆的位置

1
2
3
- (IBAction)clearWindowPosition:(id)sender {
    [NSWindow removeFrameUsingName:@"Some name"];
}

很简单吧。更多可以参考NSWindows Class ReferenceWindow Programming Guide文档。

(全文完)

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

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

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

Cocoa的几种内置数据类型之间的互转

因为Cocoa的数据类型之间的互转在实际程序中应用很广泛,而我经常都会忘记,因此在此记录一下常用的几个互转。以后将会补充更多。

1 NSDataNSString之间互转:

1
2
3
4
5
6
7
8
9
/* NSString to NSData */
NSString *theString = @"This is a string";
NSData *theStringData = [theString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@\n%@", theString, theStringData);

/* NSData to NSString */
NSString *theStringFromData = [[NSString alloc] initWithData:theStringData encoding:NSUTF8StringEncoding];
NSLog(@"%@", theStringFromData);
[theStringFromData release];

这里用NSUTF8StringEncoding作为例子,实际可以使用更多其它的编码类型,详情可以参考文档。

用Sparkle为Cocoa程序增加自动升级

Mac OS X上的绝大部分程序都使用Sparkle来作为程序的自动升级工具。利用Sparkle,用户无需对升级过程进行干涉,只需跟着升级指示做就可以了。而Sparkle对于程序开发人员来说,使用也是相当方便。其实Sparkle的文档已经写的相当好了,不过我还是来简单写一下Sparkle的使用,用于备忘。

首先到Sparkle的首页下载Sparkle框架。

然后按照和之前介绍Growl.framework的文章中同样的方法,新建一个Cocoa项目(或打开一个已有的Cocoa项目)把Sparkle加入项目中,在此我就不赘述了。

要让应用程序支持Sparkle很简单。大致分为3个大步骤:在项目中设置Sparkle;对升级包进行数字签名;设置AppCast服务器。(按:我正在用Rails编写一个AppCast服务器程序,能够简单方便的将这个过程自动化,等我测试完成之后将放到github上去。)

为应用程序增加Growl支持(下):在代码中应用Growl

之前一篇日志里,我简单的介绍了一下如何在项目中增加Growl.framework。现在,我来介绍一下如何使用Growl。在之前的日志里,我演示的时候,是往项目中加入Growl.framework,这次,为了完整起见,我将使用Growl-WithInstaller.framework来演示。

这两个框架的区别在于后者把Growl安装程序打包进了框架中。如果用户没有安装Growl,并且愿意安装,可以马上安装。但是很多人并不喜欢这种捆绑安装的方式,很多人把责任归咎于Growl,Growl甚至专门为此写了个网页解释。其实Growl是出于好意,并且,选择哪个框架是开发人员的事情。作为用户,如果你真的不喜欢Growl,Growl能够很方便的删除;而作为开发人员,应该根据目标用户谨慎选择捆绑Growl安装程序的包。

好了,题外话不多说,言归正传。

为应用程序增加Growl支持(上):在项目中加入Growl.Framework

Growl是啥,用来干什么的我就不介绍了。Growl的文档说实话,写的挺抽象的。不是Step by Step的文档,对我来说就有点困难了。所以,我决定把Growl支持写成几篇短文,简单介绍一下如何在程序中增加Growl支持。【为啥要分几篇?嘛,因为我自己也是边学边写文章的吗。。。Orz】

首先,介绍一下原文是怎么写的。

  1. Download the frameworks from the Downloads page from there.
  2. Copy the Growl framework to your application’s project folder (or any subdirectory of it).
  3. Add the Growl framework to your project, making sure that all the relevant target checkboxes are checked. The header files in the framework use UTF-8 encoding.
  4. Add a Copy Files phase to your application’s target.
  5. Get Info on the Copy Files phase.
  6. Set the destination to “Frameworks”, with no subpath (clear the field).
  7. Drag the framework from the group tree into the Copy Files phase.

其实描述的听清楚的。奈何,我的理解能力太差,搞不定。俗话说,A picture worth a thousand words,所以我就以Xcode 4为例,把上述过程做一遍。(下面的编号基本对应上文中的1-7所述的步骤)