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