Загрузить категорию, специфичную для устройства - PullRequest
1 голос
/ 01 октября 2011

У меня есть приложение для iPhone, которое я хотел бы сделать универсальным, большинство представлений можно сохранить, но есть некоторые незначительные изменения, которые необходимо сделать для iPad.

Можно ли загрузить категорию в зависимости от того, какое устройство использует пользователь?

Или есть лучший способ сделать это? Общий способ (вместо того, чтобы специально проверять каждый раз, когда я создаю новый экземпляр класса, и выбирая между 2 классами)

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Вы можете сделать это с помощью какого-то метода, работающего во время выполнения. В качестве простого примера, если вы хотите иметь зависимый от устройства метод drawRect: в своем подклассе UIView, вы можете написать два метода и решить, какой использовать при инициализации класса:

#import <objc/runtime.h>

+ (void)initialize
{
    Class c = self;
    SEL originalSelector = @selector(drawRect:);
    SEL newSelector = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
                      ? @selector(drawRect_iPad:) 
                      : @selector(drawRect_iPhone:);
    Method origMethod = class_getInstanceMethod(c, originalSelector);
    Method newMethod = class_getInstanceMethod(c, newSelector);
    if (class_addMethod(c, originalSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
        class_replaceMethod(c, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, newMethod);
    }
}

- (void)drawRect_iPhone:(CGRect)rect
{
    [[UIColor greenColor] set];
    UIRectFill(self.bounds);
}

- (void)drawRect_iPad:(CGRect)rect
{
    [[UIColor redColor] set];
    UIRectFill(self.bounds);
}

- (void)drawRect:(CGRect)rect
{
    //won't be used
}

Это должно привести к красному представлению на iPad и зеленому представлению на iPhone.

0 голосов
/ 01 октября 2011

Посмотрите макрос UI_USER_INTERFACE_IDIOM(), это позволит вам разветвлять код в зависимости от типа устройства.

Возможно, вам придется создать вспомогательный класс или абстрактный суперкласс, который возвращает соответствующий экземпляр, если вы хотите сохранить каждый файл только для iPhone или iPad.

...