我即將創建一個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