Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

在iOS程序中调用Mobile Safari打开网址

在Cocoa中,我们可以用NSWorkspace-openURL:来来打开系统的默认浏览器。

1
2
3
- (IBAction)clickLink:(id)sender {
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://google.com"]];
}

不过Cocoa Touch没有这个NSWorkspace。那么应该怎么做呢?事实上UIApplication提供了同样的方法:

1
2
3
- (IBAction)clickLink:(id)sender {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]];
}

很简单吧!NSWorkspaceUIApplication真是异曲同工啊。事实上,因为iOS独占式的程序运行方式,用UIApplication来取代NSWorkspace来执行这个任务其实是很贴切的。不是吗?

(全文完)

关于NSCell

作为一个初学者,我一直很弄不明白NSCell的子类,比如,NSButtonCellNSImageCell及其对应的控件之间的关系。今天,在做一个TableView实现的时候,我终于开始有点悟了——好吧,你大可以鄙视我,我的脑袋是不灵光。尽管这是一个简单的问题,但是我还是简单的记录一下我的理解。

问题的起源是“Cocoa Programming For Mac OS X”上一段关于NSCell的叙述:

NSControl inherits from NSView. With its graphics context, NSView is a relatively large and expensive object to create. When the NSButton class was created, the first thing someone did was to create a calculator with 10 rows and 10 columns of buttons. The performance was less than it could have been because of the 100 tiny views. Later, someone had the clever idea of moving the brains of the button into another object (not a view) and creating one big view (called an NSMatrix) that would act as the view for all 100 button brains. The class for the button brains was called NSButtonCell.
– Chapter 17. Custom Views, “For the More Curious: Cells”

现在在此阅读这句话,我似乎已经能够基本理解,不过当时那叫一个困惑啊。为什么用Cell就比Button性能高呢?为什么Cell可以替代Button呢?

用Cocoa实现用Mac的摄像头拍照

我一直有一种错觉,似乎在Mac上通过Cocoa API,用iSight拍照会有点困难。但是我彻底错了!用Cocoa拍照非常非常简单。甚至比Cocoa Touch拍照还简单!

首先,我们来看看测试效果:

一个不是很好的NSAttributedString转HTML的方法

本文中的方法存在问题。保留本文仅为存档。如果你想了解如何将NSAttributedString转成HTML,请阅读我后来补充的文章。

从HTML转NSAttributesString相对简单,因为Cocoa已经提供了相应的方法。昨晚我花了一点点时间研究了一下从NSAttributesString转HTML的方法,不过依然没有找到非常理想的方法。

搜索了一番之后,找到了一个并不是很好的方法,因为暂时实在找不到好方法,所以先贴出来,等找到更好的方法之后再说。 先上代码:

用NSMutableURLRequest发送图片

DragFan目前的网络连接使用了ASIHTTPRequest这个第三方库。ASIHTTPRequest是一个相对非常庞大的库,在心理上我总觉得用在DragFan里有点大材小用了。因此,我今天试着寻找了一下替代方案。很幸运,我找到了一个不错的替代方案,而且是利用现有的Cocoa API,而且在iOS下也是能使用的。

尽管印象中看到过文章说用Cocoa的网络API的性能没有用CoreFoundation的性能好,但是目前我在写的程序并没有特别的需要高性能,而且用Cocoa的API,程序的可读性和内存管理也更加直观,应该说,是一个比较好的方案。

废话了一通,下面来看看究竟是如何实现的:

用Cocoa实现点击按钮打开快捷菜单

用一个自定义按钮打开菜单已经是一个很常见的需求的。不过NSPopupButton对于我们的这种需求来说显得有点不合适。最终的结果如下所示:

实现的方法很简单,代码如下所示: