2015-09-04 4 views
2

Прежде всего, я хочу подчеркнуть, что этот код работает, но плохо выглядит. Мне нужно, чтобы изменить вид контроллера программно (не может использовать SEGUE), поэтому я использую этот код:Obj-C Change ViewController программно (две раскадровки)

NSString *storyboardName = @"Main"; 
UIStoryboard *storyboard = 
    [UIStoryboard storyboardWithName:storyboardName bundle:nil]; 
PurchaseViewController *vc = [storyboard 
     instantiateViewControllerWithIdentifier:@"PurchaseViewController"]; 
[controller presentViewController:vc animated:YES completion:nil]; 

Obvoiusly свою работу. К сожалению, после того, как создать 2-ой раскадровку (IPad), я был вынужден изменить этот код:

#define IDIOM UI_USER_INTERFACE_IDIOM() 
#define IPAD UIUserInterfaceIdiomPad 

/* 
    ... 
*/ 

NSString *storyboardName; 
if (IDIOM == IPAD) 
    storyboardName = @"Main_iPad"; 
else 
    storyboardName = @"Main"; 
UIStoryboard *storyboard = 
[UIStoryboard storyboardWithName:storyboardName bundle:nil]; 
PurchaseViewController *vc = [storyboard 
           instantiateViewControllerWithIdentifier:@"PurchaseViewController"]; 
[controller presentViewController:vc animated:YES completion:nil]; 

Это должно быть лучшим решением, чем это, но я не нашел. Вы знаете альтернативное (лучшее) решение?

ответ

2

enter image description here

Держите ваше имя IPad раскадровки так же, как iPhone просто добавить '~ Ipad' перед '.storyboard' и добавьте 'Main раскадровка файл базовое имя (IPad)' в info.plist и Поместите имя раскадровки в качестве значения. Затем используйте ниже код для получения имени раскадровки в соответствии с устройством.

NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *storyboardName = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"]; 
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:bundle]; 

Надеюсь, это поможет.

Смежные вопросы