Подтвердить что ты не робот

Динамически загружайте наконечник для iPhone/iPad в контроллере просмотра

Я превратил приложение iPhone, используя мастер в XCode, в универсальное приложение.

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

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

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

Я пробовал

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

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

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

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: ответ @Adam ниже - правильный ответ.

Чтобы определить, какой nib загружать, выполните следующие действия и отмените метод 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

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

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

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

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything

Ответ 3

Я просто поместил эти два метода в класс под названием 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.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html для более подробного объяснения первого метода...

Ответ 4

Вы можете получить свой торт и съесть его тоже. Просто добавьте метод, который обертывает 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;
}

Ответ 5

Я думаю, что лучше создать файл 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;
    }   
}