Как портировать приложение Какао на iPhone-OS? - PullRequest
2 голосов
/ 28 января 2010

Я собираюсь создать приложение Cocoa и хочу, чтобы однажды я мог легко перенести его на iPad или даже iPhone. Как я могу запланировать это заранее?

Я знаю, что мне придется переделывать все NIB и, возможно, разработать другой рабочий процесс.

А как насчет кода? Простая замена каждого NSsomething на UIsomething ничего не изменит, верно? Какие-нибудь советы, как теперь убедиться, что я не буду стрелять себе в ногу позже?

Спасибо!

(iPad-SDK находится под NDA. Ради этого вопроса просто предположите, что я спросил об iPhone, хорошо? Или подумайте об iPhone с большим экраном.)

Ответы [ 4 ]

5 голосов
/ 28 января 2010

Убедитесь, что вы строго соблюдаете разделение Model-View-Controller в своем приложении. Особенно модель никогда не должна зависеть от какого-либо контроллера или ракурса.

При портировании на iPhone / iPod touch / iPad вам необходимо заменить большинство или все контроллеры и все NSViews и NSCell. Вы должны быть в состоянии сохранить ваши подклассы CALayer, если они у вас есть. Возможно, вам удастся повторно использовать один или два контроллера с условной компиляцией, если большая часть контроллера будет работать на обоих, но некоторые части работают только на Mac или на обоих, но с совершенно разными API. И вы должны быть в состоянии сохранить всю модель без изменений.

Вероятно, существуют некоторые более конкретные подводные камни, о которых может предупредить разработчик iPhone, но это общее правило, которое применимо к любому переходу из одной среды в другую. (Примером другого перехода среды может быть создание одного или нескольких эквивалентов или дополнений инструмента командной строки для вашего приложения, таких как xcodebuild, packagemaker или ibtool.)

Кроме того, посмотрите на в справочнике Введение в платформу Foundation , где приведены цифры, показывающие, какие классы Foundation доступны только для Mac и iPhone.

3 голосов
/ 28 января 2010

Многие библиотеки даже не поддерживаются в Cocoa Touch по сравнению с настольными библиотеками Cocoa. Вы должны учитывать различия в AppKit и UIKit. Кроме того, Objective-C не позволяет собирать мусор на iPhone. Есть много сенсорных событий, которые существуют только на iPhone, но не на рабочем столе. Разработка iPhone намного более ограничена из-за того, что телефон - это очень личное устройство, привязанное к очень личным данным.

Проверьте эти слайды для лучшего сравнения: http://www.slideshare.net/lukhnos/between-cocoa-and-cocoa-touch-a-comparative-introduction

2 голосов
/ 28 января 2010

Как и в любом хорошем макете проекта, вы должны отделить свой пользовательский интерфейс от компонентов, не относящихся к пользовательскому интерфейсу. Это относится не только к разметке диска (хотя это также имеет смысл), но скорее к использованию подхода MVC, при котором ваши контроллеры (C) знают о Models (M) и UI (V), которые отображаются отдельно.

Вы можете использовать Key-Value Observing (он же KVO) для настройки ваших моделей, чтобы при запуске они отправляли уведомление всем зарегистрированным слушателям для обновления. Если вы используете XIB для создания своих пользовательских интерфейсов, то это то, что происходит, когда вы привязываете объект к отображаемым виджетам.

Таким образом, вы можете получить отдельные XIB для вашего iPhone, Mac OS и (позже) iPad - хотя, если вы правильно измените размер, вы можете иметь тот же XIB для iPhone и iPad.

Наконец, часто бывают случаи, когда вам необходимо внедрить логику в свои модели (например, добавить изображение для возврата из метода). В этом случае 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] независимо от того, для какой платформы он скомпилирован.

0 голосов
/ 28 января 2010

оформить заказ apple.com все приложения на iphone также работают на ipad

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...