我即将创建一个Cocoa应用程序,我想确保有一天我可以轻松地将它移植到iPad甚至iPhone上。我如何提前计划?如何将可可应用程序移植到iPhone OS?
我知道我将不得不重做所有的NIB,并可能设计一个不同的工作流程。
但是代码呢?只是用UI替换每一个NSsomething都不会削减它,对吧?有关如何确保我不会在晚些时候拍摄自己的任何提示?
谢谢!
(iPad的-SDK是保密协议。对于这个问题的目的只是假设我问了一下iPhone,OK?还是觉得iPhone具有更大的屏幕。)
我即将创建一个Cocoa应用程序,我想确保有一天我可以轻松地将它移植到iPad甚至iPhone上。我如何提前计划?如何将可可应用程序移植到iPhone OS?
我知道我将不得不重做所有的NIB,并可能设计一个不同的工作流程。
但是代码呢?只是用UI替换每一个NSsomething都不会削减它,对吧?有关如何确保我不会在晚些时候拍摄自己的任何提示?
谢谢!
(iPad的-SDK是保密协议。对于这个问题的目的只是假设我问了一下iPhone,OK?还是觉得iPhone具有更大的屏幕。)
与任何良好的项目布局一样,您应该将UI与非UI组件分开。这不仅仅意味着在磁盘布局上(尽管这也是合理的),而是使用MVC方法,从而控制器(C)知道模型(M)和UI(V)是分开呈现的。
您可以使用键值观察(又名KVO)来设置您的模型,这样当它们触发时,它会向任何注册的侦听器发送通知以更新。如果您使用XIB来生成用户界面,那么当您将对象绑定到您的显示小部件时会发生这种情况。
所以你最终可以为你的iPhone,Mac OS和(后来的)iPad单独使用XIB--尽管如果你正确调整大小,你可以为iPhone和iPad使用相同的XIB。
最后,通常会有一些情况需要将逻辑注入模型(例如,添加图像以从方法返回)。在这种情况下,iPhone和Mac OS具有不同的图像类别。要做到这一点,您可以创建以下文件:
MyModel.m // contains the data, no UI
MyModel+UIImage.m // contains a category for adding the UIImage
MyModel+NSImage.m // contains a category for adding the NSImage
类别如下:
@interface Host(UIImage)
-(UIImage *)badge;
@end
@implementation MyModel(UIImage)
-(UIImage *)badge
{
if (green)
return [UIImage imageNamed:@"green.png"];
if (red)
return [UIImage imageNamed:@"red.png"];
}
@end
---
@interface Host(NSImage)
-(NSImage *)badge;
@end
@implementation MyModel(NSImage)
-(NSImage *)badge
{
if (green)
return [[NSImage alloc] initWithContentsOfFile: @"green.png"];
if (red)
return [[NSImage alloc] initWithContentsOfFile: @"red.png"];
}
@end
这有一个好处,你的单元测试可以只加载模型(没有任何图像的类别,并且加载),而在运行时,需要处理图像的代码(例如,在视图控制器中)可以加载模型与类别,并以透明方式加载徽章[model badge]
,而不管其编译的平台。
Cocoa Touch和桌面Cocoa库甚至都不支持很多库。您需要考虑AppKit与UIKit的差异。另外,Objective-C不允许在iPhone上进行垃圾回收。有很多触摸事件只存在于iPhone上,而不是桌面上。由于手机是与个人数据绑定的非常个人化的设备,因此iPhone的开发限制更多。
查阅这些幻灯片更好的比较:http://www.slideshare.net/lukhnos/between-cocoa-and-cocoa-touch-a-comparative-introduction
确保你坚持严格您的应用中Model-View-Controller分离。特别是,该模型不应该依赖任何控制器或视图。
在移植到iPhone/iPod touch/iPad时,您需要更换大部分或全部控制器以及所有NSView和NSCell。你应该能够保留你的CALayer子类,如果有的话。如果大多数控制器都可以同时工作,但是某些部分只能在Mac上工作,或者两者都工作,但使用完全不同的API,则可以重新使用一个或两个带条件编译的控制器。你应该能够保持整个模型不变。
iPhone开发人员可能会警告您一些更具体的缺陷,但这是适用于从一个环境到另一个环境的任何转换的一般规则。 (另一个环境转换的示例是制作一个或多个与您的应用程序相同或相似的命令行工具,如xcodebuild,packagemaker或ibtool。)
另请参阅the Introduction to the Foundation framework reference以获取显示哪些Foundation类为Mac - 和仅限iPhone。
我检查标记这个答案,但所有其他人都很好。谢谢你们! – Ron 2010-01-28 14:06:30
KVO很不错,但iPhone上没有Cocoa Bindings。 – 2010-01-29 03:43:10