Динамически загружать перо для iPhone / iPad в контроллере представления - PullRequest
20 голосов
/ 16 июня 2010

Я преобразовал приложение для iPhone с помощью волшебной вещи в XCode в универсальное приложение.

Он прекрасно работает, но в некоторых областях выглядит немного глупо:)

Мне нужно загрузить наконечники в зависимости от того, какое устройство используется.Я не хочу создавать свои контроллеры представления, используя initWithNib, так как у меня уже есть код для создания контроллеров с некоторыми данными (initWithMyLovelyData), который не имеет ничего общего с загрузкой пера.

Я знаю, чтобы выяснить, какое устройство вы используете UI_USER_INTERFACE_IDIOM(), поэтому я попытался переопределить initWithNibName внутри самих контроллеров представления, предполагая, что они каким-то образом вызываются изнутри.Но это не работает, так как я не уверен в синтаксисе.

Я пытался

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];

И это не работает: /

РЕДАКТИРОВАТЬ - я знаю, что я массово отредактировал это, сделал мой вопрос немного более конкретным после выполнения некоторыхбольше исследований - извинения!

Ответы [ 5 ]

75 голосов
/ 07 марта 2012

На самом деле, Apple делает все это автоматически, просто назовите ваши файлы NIB:

MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad

и загрузите ваш контроллер представления с наименьшим количеством кода:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
22 голосов
/ 16 июня 2010

РЕДАКТИРОВАТЬ: @ Адам ответ ниже является правильным ответом.

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

MyViewController *viewController;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil];
} else {
    viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil];
}

viewController.myLovelyData = someData;
2 голосов
/ 09 октября 2010

Ты можешь взять свой пирог и съесть его тоже.Просто добавьте метод, который оборачивает initWithNibName: bundle: и добавляет ваш параметр myLovelyData:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  myLovelyData:(id)data
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    {
        // Custom initialization using myLovelyData
        //
    }
    return self;
}
2 голосов
/ 04 октября 2010

Я просто поместил эти два метода в класс IPadHelper и использую метод addIPadSuffixWhenOnIPad для условного выбора между двумя кончиками в зависимости от платформы

+ (BOOL)isIPad{
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
            return YES;
        }
    }
    return NO;
}

+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{
    if([IPadHelper isIPad]){
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}

см. Здесь h ttp: // cocoawithlove.ru / 2010/07 / tips-tricks-tricks-for-conditional-ios3-ios32.html для более подробного объяснения первого метода ...

0 голосов
/ 18 января 2012

Я думаю, что будет лучше создать файл C.
FileHelper.h

#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);

FileHelper.m

#import "FileHelper.h"
BOOL isIPad() {
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) {
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            return YES;
        }
    }
    return NO;
}

NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) {
    if(isIPad()) {
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}
...