Cocoa China 苹果开发中文站

苹果Mac OS X开发 iPhone开发 Cocoa以及Cocoa Touch

推荐使用Safari浏览器阅读本站

Cocoa一般技巧

Cocoa的单态(singleton)设计模式

如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。单态模式在Java、C++中很常用,在Cocoa里,也可以实现。

由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:

点击这里阅读全文 »

最全的获取苹果机器硬件类型的方法

下面的方法可以将 sysctl hw.model 获取的苹果电脑硬件型号转换为容易看懂的形式。

1 复制下面的代码,将其保存为Macintosh.dict:

 

点击这里阅读全文 »

在Cocoa中使用JSON

JSON是一种新的用于在互联网上进行数据交换的标准格式。由于它的冗余、可读性和可解析性都比XML要好,因此JSON这种数据交换格式越来越广泛地运用于Web应用,尤其是Ajax应用中。

在Cocoa中使用JSON也很简单,目前有两个JSON的框架,都很容易使用,而且都对NSDictionary进行了扩展,您可以选择其一将JSON“揉”到您的Cocoa应用程序里。

点击这里阅读全文 »

使用NSClassFromString

NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。

正常来说,

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];

id myObj = [[MySpecialClass alloc] init];

是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。

因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。

比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:

[[NSClassFromString(@"NSTask") .....]]

而不要直接使用[NSTask ...]这种写法。

NSClassFromString的好处是:

1 弱化连接,因此并不会把没有的Framework也link到程序中。

2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

方便实现逻辑功能的代码

通常我们可以使用NSPredicate来进行逻辑计算,不过一般来说代码都很长。

比如考虑,要实现如下逻辑:(A or B) but not (A and B) 需要用很长的一堆代码来实现:

  1. NSPredicate *xor = [NSCompoundPredicate andPredicateWithSubpredicates:
  2.    [NSArray arrayWithObjects:
  3.       [NSCompoundPredicate orPredicateWithSubpredicates:
  4.          [NSArray arrayWithObjects: a, b, nil]
  5.       ],
  6.       [NSCompoundPredicate notPredicateWithSubpredicate:
  7.          [NSCompoundPredicate andPredicateWithSubpredicates:
  8.             [NSArray arrayWithObjects: a, b, nil]
  9.          ]
  10.       ],
  11.       nil
  12.    ]
  13. ];

不过如果用了本文介绍的方法,就会简单地变成下面的代码:

点击这里阅读全文 »

在Leopard中将文件移到废纸篓

 Leopard中新增了两个方法,可以将文件移到废纸篓:

FSMoveObjectToTrashSync 和 FSMoveObjectToTrashAsync,分别用于同步和异步删除文件。

OSStatus FSMoveObjectToTrashSync (
   const FSRef *source,
   FSRef *target,
   OptionBits options
);

source: 可以是文件或者文件夹;target可以传递NULL;options可以是以下几项:

enum {
   kFSFileOperationDefaultOptions = 0,
   kFSFileOperationOverwrite = 0x01,
   kFSFileOperationSkipSourcePermissionErrors = 0x02,
   kFSFileOperationDoNotMoveAcrossVolumes = 0x04,
   kFSFileOperationSkipPreflight = 0x08
};

使用Cocoa调用iChat Theater

iChat 4.0新增的iChat Theater功能可以让您在 iChat 视频窗口中演示幻灯片显示。您在桌面上控制演示,而您的好友在他们的桌面上观看演示。在Keynote中,支持这样一种功能:你可以在Keynote中进行幻灯片的展示,通过iChat使好友能够看到你进行的展示。

在Cocoa中,我们同样可以使用这种功能,下面就介绍如何通过Cocoa调用iChat Theater的功能。

点击这里阅读全文 »

关于按钮的action的问题

mikej的问题:

说到selector有个小问题: 比如我在处理UIButton 响应事件的时候,可能需要对不同按钮执行差不多的函数,比如我在做计算器的时候,按钮123456789,我分别定义成btn19,在create buttong时候我在addtarget由于不知道怎么把参数传给一个响应函数,所以只好定义9个接口函数。。。。

点击这里阅读全文 »

C++对象到Objective-C的参数传递

通常来说将C++对象做为参数传递给Objective-C的方法中是比较方便的。

举例来说,比如我们有一个NSString的初始化方法,我们希望传递一个std::string做为参数传进去。

只要你传递了对象的指针,事情就完成了,不过你还可以在参数中使用“被指向”的形式,下面用例子来说明。

点击这里阅读全文 »

Cocoa教学:使用应用程序资源

在大部分比较简单的程序里,资源的管理和使用都是无缝而且自动化的,你无需用程序去干预。

但是如果你的程序趋于成熟,可能在某些情况下你就需要用代码去直接访问资源。直接访问程序中资源的方式也非常直接,下面我们就来介绍一下方法。

点击这里阅读全文 »

Cocoa文本语音转换例子

在Cocoa中实现文本语音转换(Text to Speech)是很简单的事情。当然,目前只支持英文。

曾经Mac OS 9的时候,苹果官方提供过中文TTS支持,不过可惜的是并没有移植到OSX中。

点击这里阅读全文 »

Cocoa教学:使Core Data支持恢复操作

 

在Cocoa中,恢复操作(Undo)是一个很有用的功能,但是希望将它整合到Core Data中的人们知道,这个过程可能会有一点令人沮丧。

 

通常来说,你不需要在意Undo功能,这个内建的功能就可以直接被支持。但是如果你使用了Core Data,情况就会变得复杂一些。

点击这里阅读全文 »

在自定义NSTextField中响应键盘消息

看到Cocoachina讨论区上有人问起NSTextField的问题,翻译一下这篇文章。希望能够对大家有一定的参考意义。

这个代码做的事情很简单,按键盘的“上”,文本框中的数字会增加,反之,按“下”,文本框中的数字会减少。

点击这里阅读全文 »

如何用代码手工创建NSTableView

某些情况下,我们可能需要使用手工编写代码而不是使用Interface Builder建立NSTableView。尤其在我们需要修改NSTableView其中的内容的时候,这变得更加重要,而开发文档中写的不是很清楚。

以下这段简单的代码可以手工创建一个NSTableView,可以帮你节省一点查资料的时间。

 

点击这里阅读全文 »

Cocoa系列教学四:Sizing Policy 和其他

上次我们的程序在Window中创建了一个Button,如果这个Button是作为Window的ContentView的时候, 当你改变窗口的时候, 这个Button的大小也跟着改变,而且总是充满了整个Window,但是如果你通过NSView addSubview:把这个Button添加到窗口中的时候, 当你改变窗口大小的时候, 这个Button的位置和大小始终不变,所以当你的窗口的宽度小于Button的Left时,Button就消失了。

熟悉Java或者Unix下面GUI编程的人可能会使用Layout机制来解决这个问题,熟悉Windows的人可能会想到使用OnSize事件来处理这个问题, Cocoa的确在窗口或者Parent View的大小改变的时候发送通知,但是在Cocoa中我们还有另外一种处理方法,这个方法可以称作Sizing Policy,意思是在窗口改变的时候, 对应的Child View或者Control应该如何响应这个改变。

点击这里阅读全文 »

最新讨论