2015-05-01 2 views
0

Я пытаюсь сделать мое приложение ориентации отключить пейзаж, если выполняются следующие условия:Отключить ориентировка в некоторых View Controllers, если устройство iPhone

  • Устройство является iPhone
  • Представленный View Controller является WelcomeViewController, LogInViewController или SignUpViewController

Я попытался это в AppDelegate.m:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 

     if ([[window.rootViewController presentedViewController] isKindOfClass:[WelcomeViewController class]]) 
      return UIInterfaceOrientationMaskPortrait; 
     else 
      return UIInterfaceOrientationMaskAllButUpsideDown; 

    } 
} 

Это не работает, так как я получаю сообщение об ошибке: Control may reach end of-non-void function.

Я также попытался это:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

    NSString *deviceModel = (NSString*)[UIDevice currentDevice].model; 

    if ([deviceModel rangeOfString:@"iPhone"].location != NSNotFound && [[window.rootViewController presentedViewController] isKindOfClass:[WelcomeViewController class]]) { 

     NSLog(@"I am an iPhone"); 
     return UIInterfaceOrientationMaskPortrait; 

    } else if ([deviceModel rangeOfString:@"iPhone"].location != NSNotFound && [[window.rootViewController presentedViewController] isKindOfClass:[LogInViewController class]]) { 

     NSLog(@"I am an iPhone"); 
     return UIInterfaceOrientationMaskPortrait; 

    } else if ([deviceModel rangeOfString:@"iPhone"].location != NSNotFound && [[window.rootViewController presentedViewController] isKindOfClass:[SignUpViewController class]]) { 

     NSLog(@"I am an iPhone"); 
     return UIInterfaceOrientationMaskPortrait; 

    } else { 

     NSLog(@"I am NOT an iPhone"); 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
} 

Если я проверить его на iPhone, однако, он будет идти прямо в другое заявление, что интересно, так как если я удалю [[window.rootViewController presentedViewController] isKindOfClass:[SignUpViewController class]], он будет работать.

Что я делаю неправильно?

ответ

1

Это не работает, так как я получаю сообщение об ошибке, говоря, что Control может достигать функции конца не-void.

Ну, подумайте о вашей логике здесь (или ее отсутствие):

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     if ([[window.rootViewController presentedViewController] isKindOfClass:[WelcomeViewController class]]) 
      return UIInterfaceOrientationMaskPortrait; 
     else 
      return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
} 

Если UI_USER_INTERFACE_IDIOM() является UIUserInterfaceIdiomPad, вы возвращаете что-то в каждой ситуации (как if и else). Но в противном случае вы не говорите, что делать! Что если UI_USER_INTERFACE_IDIOM() является неUIUserInterfaceIdiomPad? Что ты тогда возвращаешь? Ничего! Поэтому это не имеет смысла. Вы поставляете недостаточную информацию. Вы must обложка каждый возможный случай, возвращая что-то независимо от того, что может случиться.

Лично я думаю, что весь путь, по которому вы идете, очень глупо. Что бы я сделал, это реализовать supportedInterfaceOrientations в каждом из трех классов WelcomeViewController, LogInViewController и SignUpViewController. В каждой реализации я бы сразу сказал, что вы сказали вначале: верните любую ориентацию, если устройство iPad, но портрет, только если устройство является iPhone. Да, это связано с некоторыми повторениями: реализация supportedInterfaceOrientations будет одинаковой во всех трех контроллерах просмотра, но кому это интересно? По крайней мере, это будет понятно - и это сработает, что больше, чем вы сейчас собираетесь за вами.

+0

О да, это так. Я не знаю, почему я этого не видел. У меня есть некоторые утверждения if в другом месте в моем приложении, где нет никакого другого утверждения, поскольку мне не нужно приложение, чтобы что-то делать, если оно не совпало, так что это не переходило мне на ум, чтобы быть честным. Что касается вашего предложения сделать один для всех трех ViewControllers, я это рассмотрю. Во всяком случае, спасибо за ответ. – chrisjr

+0

Несомненно, мое архитектурное предложение - всего лишь предложение. Но, по-моему, вы гораздо менее склонны связывать себя в эти самые сучки. Вам решать! – matt

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