Por padrão, o construtor de interfaces do Xcode 6 possui uma nova caixa de seleção "use classes de tamanho". Torna as visualizações adaptáveis.
Quando tento fazer segue entre duas visualizações no meu storyboard, tenho novas opções:
em vez antigo:
Agora temos "show" e "present modally" em vez de "push" e "modal". As opções antigas estão marcadas como obsoletas. Eu escolhi a opção "show", porque nas configurações a seguir chamava "show (por exemplo, push)
Mas isso não faz força. A animação de segmentos parece um slide da parte inferior (modal) e a barra de navegação desaparece.
A pergunta é: como posso fazer o "show" funcionar como push? É possível ou devo usar "push (obsoleto)" em vez disso? Onde posso encontrar informações sobre novos tipos de segue? A única coisa que encontrei na biblioteca de desenvolvedores do iOS8 é o Storyboards, que ajuda você a criar sua interface do usuário, mas não há informações sobre "show".
ATUALIZAR
Eu tentei criar um novo projeto e "show" é realmente funciona como "push". Acho que o problema no meu projeto pode ser porque reutilizo o controlador de navegação com código como este, mas não sei como corrigi-lo.
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
Depois disso, tento empurrar NewViewController após MainViewController
ATUALIZAÇÃO 2:
Parece ser apenas o iOS 7, o iOS 7.1.
fonte
Já existe uma resposta aceita, mas eu queria fornecer um pouco mais de informação, possivelmente informações que não estavam disponíveis antes.
Como mencionado anteriormente, os itens "push" e "modal" foram descontinuados e foram substituídos por "show" e "present modally", respectivamente. De acordo com a documentação da Apple, os novos itens foram divididos em itens que se adaptam às classes de tamanho. As mais antigas devem ser usadas apenas para suportar versões do iOS anteriores ao iOS 8.
O documento no link a seguir explica isso e a descrição de todos os itens disponíveis, antigos e novos.
Adicionando um segmento entre cenas em um storyboard
Caso o URL mude no futuro, esta é a explicação dada para cada novo segue:
fonte
Não há nada errado com as outras respostas, mas esta explica o que está acontecendo, como você pode verificar se está acontecendo e como mitigar o problema no futuro.
fundo
No meu caso, nenhum dos meus Show Segues estava funcionando, embora eu já tivesse um UINavigationController como meu controlador de exibição inicial (com meu conteúdo UIViewController como raiz).
Por que e como o segmento de exibição é interrompido
O Show segue quebra quando tem uma ação associada ao segue no xml de origem do storyboard. Um cenário típico que causa isso pode ser se você redefiniu uma sequência de uma sequência manual chamada anteriormente no código. Isso deixa os seguintes bits no xml do storyboard.
Para acomodar qualquer ação personalizada ao usar as instruções do storyboard, basta tocar em prepareForSegue e interceptar o controlador de exibição de destino e chamar qualquer método desse local. De qualquer forma, o efeito colateral desse pequeno bug (o bug é o fato de que, quando você redefine as seguições, elas não são configuradas corretamente em xml ~ ou seja, a ação permanece mesmo após a alteração das seguidas para uma que opera a partir de um UIView (ou UIControl) para um controlador de exibição de destino).
Infelizmente, a solução mais direta falha. Portanto, apenas remover o atributo xml da ação no Storyboard NÃO resolverá o problema. Em vez disso, é preciso simplesmente excluir e recriar as instruções no storyboard.
Quando recriado, o xml do storyboard não terá mais uma ação associada a segue específico e o Show será executado como um Push.
Amostra de XML para o segmento de exibição correto
Mitigação
Para evitar a recorrência, basta seguir as sequências não manuais do storyboard, se possível, usando o prepareForSegue para adicionar ações necessárias com base no controlador de exibição de destino. Ou, se você precisar misturar e combinar, tome as precauções para verificar se as etapas Mostrar não têm nenhuma ação anexada no xml do storyboard. Se você estiver lidando com projetos mais antigos, deve dar atenção especial ao código-fonte do Storyboard, pois descobri alguns problemas.
fonte
Como Scott Robertson comentou aqui , isso parece um bug no iOS 7.
Parece que no iOS 8 a transição é inferida em tempo de execução (comportamento correto), enquanto no iOS 7 a transição é inferida em tempo de design (comportamento de buggy).
A solução mais simples é adicionar um controlador de navegação não utilizado ao storyboard e vinculá-lo para que o controlador de exibição em questão faça parte desse controlador de navegação. Na verdade, você não precisa instanciar o controlador de navegação, você só precisa do controlador de exibição com erros para saber se ele está incorporado a um controlador de navegação.
Nota: Simular uma barra de navegação não é suficiente para esses propósitos; você deve realmente ter um controlador de navegação em sua pilha de envio.
Para reproduzir o erro:
initWithRootViewController:
métodoPara corrigir o erro:
workaround for show segues in iOS 7
).Observe como o controlador de navegação foi adicionado na segunda figura e como ele não possui nenhuma flecha de entrada (ou seja, não há como instancia-lo além de usar o identificador do controlador de exibição).
fonte
Sei que estou atrasado, mas queria compartilhar o que aprendi. Na verdade, isso é um bug e ainda está presente hoje (18/12/2014).
Eu escrevi um artigo sobre isso aqui .
É facilmente reproduzível; no iOS8 funcionará bem e até no iOS7.x, desde que você não insira um controlador de exibição programaticamente na pilha antes de chamar o
Show
segue.Se você empurrar apenas para a pilha usando conexões de storyboard, ele funcionará; mas, aparentemente, se você enviar via código de alguma forma, a
navigationController
propriedade do envioUIViewController
seránil
e, quando você o chamarShow
, assumirá um modal porque não há navegação para controlar a pilha.Somente a solução alternativa até agora não é enviada por código (não é viável) ou usa o agora descontinuado
Push
.Arquivei um radar (link no artigo). Sinta-se à vontade para arquivar duplicatas com a esperança de que a Apple resolva esse problema.
fonte
Show
, realizo um segue, e no segundoShow
segue é apresentado de forma modal, Solution?Show
de um viewController no iOS 7Eu tive o mesmo problema com segues no Xcode 7 e iOS 7.1.2. Mostrar segues (novo recurso do iOS 8) funciona como segues modais no iOS 7 e não permite que você coloque seus View Controllers na pilha do Navigation Controller ao definir o tipo de segue com o Xcode no Storyboard. É por isso que seu self.navigationController retornará nulo, porque o View Controller não foi enviado à pilha e você não pode abri-lo.
Não entendo por que a Apple não adicionou nenhuma notificação para este caso no Xcode quando você precisa que o aplicativo funcione no iOS 7. Eles dizem que o método Push está obsoleto, mas o Show não funciona corretamente no iOS 7.
O que eu fiz para resolver o problema:
Eu criei a classe MYShowSegue com .h
E arquivo .m com apenas um método de execução :
Do que você precisa definir um tipo personalizado para cada segue no seu Storyboard e selecionar uma nova classe para ele, no meu caso era MYShowSegue.
Exemplo de segmento personalizado
Esta solução ajudará você a obter um suporte completo de seus aplicativos para iOS 7, eles usarão o método pushViewController para enviar suas Views e para o iOS 8,9 etc. suas seguidas funcionarão com o novo método (iOS 8) showViewController
Não se esqueça de fazer o mesmo com todos os seus seguidores no seu Storyboard.
fonte
Isso ainda está acontecendo no iOS 10.x
Excluir e reinstalar segues não resolveu nada para mim:
Problema: A funcionalidade exigida foi de 7 passos, que funcionam apenas como 'push' (na verdade, um detalhe do programa), mas, na verdade, apenas os primeiros passos que adicionei foram enviados, os outros se comportariam de maneira modal. Isso ocorre apesar do Interface Builder descrever cada uma das etapas de forma idêntica.
Solução: tive que adicionar a ação às 6 etapas que não a possuíam.
XML do Storyboard original
Eu mudei isso adicionando showViewController: remetente
fonte