Динамически загружайте наконечник для iPhone/iPad в контроллере просмотра
Я превратил приложение iPhone, используя мастер в XCode, в универсальное приложение.
Он строит отлично, но, очевидно, выглядит немного мусором в некоторых областях:)
Мне нужно загрузить наконечники в зависимости от того, какое устройство используется. Я не хочу создавать контроллеры своего вида, используя initWithNib
, поскольку у меня уже есть код для создания контроллеров с некоторыми данными (initWithMyLovelyData
), которые не делают ничего общего с загрузкой nib.
Я знаю, как узнать устройство, которое вы используете UI_USER_INTERFACE_IDIOM()
, поэтому я попытался переопределить initWithNibName
внутри самих контроллеров представления, предполагая, что они вызваны как-то внутренне. Но он не работает, я думаю, я не уверен в синтаксисе.
Я пробовал
if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
И это не работает:/
РЕДАКТИРОВАТЬ - Я знаю, что я сделал это в массовом порядке, сделал свой вопрос немного более конкретным после проведения еще нескольких исследований - извинения!
Ответы
Ответ 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;
}
}