如何将Cocoa应用程序移植到iPhone-OS?

时间:2010-01-28 00:41:30

标签: iphone cocoa macos ipad

我即将创建一个Cocoa应用程序,我想确保有一天我可以轻松将其移植到iPad甚至iPhone上。我怎样才能提前做好计划?

我知道我将不得不重做所有NIB,并可能设计一个不同的工作流程。

但是代码怎么样?用UIsomething替换每个NSsomething都不会削减它,对吧?关于如何确保我以后不会用脚射击自己的任何提示?

谢谢!

(iPad-SDK属于NDA。为了这个问题,我假设我问过iPhone,好吗?或者想用更大屏幕的iPhone。)

4 个答案:

答案 0 :(得分:5)

确保您严格遵守应用中的Model-View-Controller分隔。特别是模型不应该依赖于任何控制器或视图。

在移植到iPhone / iPod touch / iPad时,您需要更换大部分或全部控制器以及所有NSView和NSCell。如果有的话,您应该能够保留CALayer子类。如果大多数控制器都可以在两个控制器上工作,但是某些部件只能在Mac上运行或者在两者上工作但具有完全不同的API,则可以重复使用带有条件编译的一个或两个控制器。你应该能够保持整个模型不变。

iPhone开发人员可能会提醒您一些更具体的陷阱,但这是从一个环境到另一个环境的任何过渡的一般规则。 (另一个环境转换的示例是为您的应用创建一个或多个命令行工具等价物或补充,如xcodebuild,packagemaker或ibtool。)

另外,请查看the Introduction to the Foundation framework reference,了解哪些基础类只适用于Mac和iPhone。

答案 1 :(得分:3)

在Cocoa Touch和桌面Cocoa库中甚至都不支持很多库。您需要考虑AppKit与UIKit的差异。此外,Objective-C不允许在iPhone上进行垃圾回收。有许多触摸事件仅存在于iPhone上但不存在于桌面上。由于手机是非常个人化的设备,因此iPhone开发的限制性更强。

查看这些幻灯片以获得更好的比较:http://www.slideshare.net/lukhnos/between-cocoa-and-cocoa-touch-a-comparative-introduction

答案 2 :(得分:2)

与任何好的项目布局一样,您应该将UI与非UI组件分开。这不仅意味着磁盘布局(虽然这也有意义),而是使用MVC方法,从而控制器(C)知道模型(M)和UI(V)是单独渲染的。

您可以使用键值观察(也称为KVO)来设置模型,这样当它们触发时,它会向任何已注册的侦听器发送通知以进行更新。如果您使用XIB生成用户界面,则将对象绑定到显示窗口小部件时会发生这种情况。

因此,您最终可以为iPhone,Mac OS和(稍后的)iPad使用单独的XIB - 但如果您正确调整大小,则可以为iPhone和iPad使用相同的XIB。

最后,在某些情况下,您需要在模型中注入逻辑(例如,添加图像以从方法返回)。在这种情况下,iPhone和Mac OS具有不同的Image类。为此,您可以创建以下内容:

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

这样做的另一个好处是,您的单元测试可以只加载模型(不加载任何图像类别),而在运行时,需要处理图像的代码(例如,在视图控制器中)可以加载模型 - -category并以透明方式加载徽章[model badge],无论其编译的是哪个平台。

答案 3 :(得分:-4)

checkout apple.com iphone上的所有应用程序也适用于ipad