1

Я работаю над iOS5 и борется с раскадровки, segues и настраивает виды для разных ориентаций. Пройдя какую-то помощь Apple за последние пару дней; Я не нашел места для своих ответов, я пришел к следующим выводам, которые я сформулирую очень тщательно, и я надеюсь, что кто-то скажет мне, если я прав:Раскадровки, Segues и разные виды для разных ориентаций

1- Использование раскадровки не означает, что вы должны используйте segues (да, это путаница для новичка).

2- Вы можете использовать только сегменты между VC, которые принадлежат навигационному контроллеру.

3 С другой стороны, наличие контроллера навигации необязательно означает, что вы должны использовать переход от одного VC к другому VC (yep!). Поэтому, если вы пытаетесь перейти от одного VC к другому VC (независимо от того, принадлежит ли первый VC к Nav Controller или нет), вы можете сделать следующее:

Предположим, что у вас есть класс WhiteVC и класс YellowVC и вы разместили кнопку на представлении WhiteVC (в раскадровке и изменили класс общего VC на WhiteVC) и связали его с IBAction в классе WhiteVC. Это будет код, который вы бы осуществить в WhiteVC.m, чтобы иметь возможность нажать на эту кнопку и имеют вид YellowVC появляются:

-(IBAction)GoToYellow 
{ 
    YellowViewController *YellowVC=[self.storyboard instantiateViewControllerWithIdentifier:@"myYellowVC"];            
    [self presentViewController:YellowVC animated:YES completion:nil]; 
} 

Для возврата из YellowVC к WhiteVC, вы бы тогда создать другую кнопку по мнению YellowVC (следовать той же процедуре, что и выше) и используйте следующий код:

-(IBAction)ReturnToWhiteVC 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Это распускать YellowVC и вернуться в Белый ВК.

4- Не рекомендуется иметь один VC собственный (экземпляр) нескольких видов - например, для разных ориентаций - лучше иметь отдельный VC для каждого вида. Это нормально, хотя VC создают экземпляр других VC как часть MVC.

5 Теперь все это произошло из-за того, что я создавал приложение с контроллером Nav, но его корень VC будет другим (разные VC с разными видами) в зависимости от того, пейзаж или портрет. Таким образом, я мог бы либо создавать копии VC программно (например, # 3 выше), которые хорошо работали. Или, если бы я хотел, чтобы сделать переход с помощью перетекает, яблоко помощь Docs предоставляет следующий код:

BOOL isShowingLandscapeView; 
- (void)awakeFromNib 
{  
    isShowingLandscapeView = NO; 

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(orientationChanged:) 
              name:UIDeviceOrientationDidChangeNotification 
              object:nil]; 
} 


- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView) 
    { 
    [self performSegueWithIdentifier:@"AlternateView" sender:self]; 
    isShowingLandscapeView = YES; 
    } 

    else if (UIDeviceOrientationIsPortrait(deviceOrientation) && isShowingLandscapeView) 
    { 
    [self dismissViewControllerAnimated:YES completion:nil];// breakpoint shows that this is triggered 
    isShowingLandscapeView = NO; 
    } 
} 

Приведенный выше код, очевидно, применяется только с контроллером Nav (из-за перетекает), и она работала, когда ориентация изменен с портрета на Пейзаж, но когда я поворачиваюсь назад к портрету, я заканчиваю тем, что пейзаж VC повернут назад к портрету. Что я здесь делаю неправильно?

Надеюсь, кто-то сможет подтвердить/подтвердить эти вопросы и ответить на мой вопрос. Thanks KB.

+0

«2- Вы можете использовать только сегменты между VC, которые принадлежат контроллеру навигации». <- Эта часть неверна. Вы можете переходить между любыми контроллерами представлений в раскадровке. – sobri

+0

У меня такая же проблема. Если я изменю тип segue на контроллере ландшафтного вида на «Модальный», то я не получу описанное вами поведение, но я потеряю навигационную панель, которая не то, что я хочу, но лучше, чем она была до – macgeezer

ответ

1

Прежде всего: segues не применяются только с UINavigationController, любой UIViewController способен выполнять segue.

В документации Apple также указывается, что вам необходимо ограничить поддерживаемую ориентацию каждого UIViewController, который вы будете использовать для ориентации, т. Е. Вам придется ограничивать портрет только портретным и ландшафтным только пейзажем).Это может быть сделано после документ:

Затем, для того, чтобы использовать Apple дизайн для управления ориентацией, вы можете следовать this blog post by Alex Moffat.

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

Основная идея состоит в том, чтобы нажимать/всплывать пейзаж в/из стека навигации и обрабатывать переход с третьим видом соответственно.

Вы должны уметь адаптировать свой код к своей собственной иерархии представлений.

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