Por definição, um segue não pode realmente existir independentemente de um storyboard. É ainda lá no nome da classe: UIStoryboardSegue
. Você não cria segues programaticamente - é o tempo de execução do storyboard que os cria para você. Normalmente, você pode chamar performSegueWithIdentifier:
o código do seu controlador de exibição, mas isso depende de ter uma sequência já configurada no storyboard para referência.
O que eu acho que você está perguntando é como você pode criar um método no seu controlador de exibição comum (classe base) que fará a transição para um novo controlador de exibição e será herdado por todas as classes derivadas. Você pode fazer isso criando um método como este no seu controlador de exibição de classe base:
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
e, em sua classe derivada, chame esse método quando o botão apropriado for clicado ou a linha da tabela for selecionada ou o que for.
UIViewController
método nomeadoperformSegueWithIdentifier:sender:
para isso.UIView
'spresentModalViewController:animated:
está obsoleta. Dos documentos - (Preterido no iOS 6.0. Use presentViewController: animated: conclusão: em vez disso.)Eu pensei em acrescentar outra possibilidade. Uma das coisas que você pode fazer é conectar duas cenas em um storyboard usando um segue que não está anexado a uma ação e, em seguida, disparar programaticamente o segue dentro do seu controlador de exibição. A maneira como você faz isso é que você deve arrastar do ícone do proprietário do arquivo na parte inferior da cena do storyboard que é a cena seguinte e arrastar com o botão direito do mouse para a cena de destino. Vou colocar uma imagem para ajudar a explicar.
Um pop-up será exibido para "Segmento manual". Eu escolhi Push como o tipo. Toque no pequeno quadrado e verifique se você está no inspetor de atributos. Dê a ele um identificador que você usará para se referir a ele no código.
Ok, a seguir vou seguir usando um item de botão de barra programática. No viewDidLoad ou em outro lugar, criarei um item de botão na barra de navegação com este código:
Ok, observe que o seletor é buttonizeButtonTap :. Portanto, escreva um método nulo para esse botão e, dentro desse método, você chamará o seguinte assim:
O parâmetro sender é necessário para identificar o botão quando o prepareForSegue é chamado. prepareForSegue é o método de estrutura em que você instancia sua cena e passa a ela quaisquer valores necessários para realizar seu trabalho. Aqui está a aparência do meu método:
Ok, apenas testei e funciona. Espero que ajude você.
fonte
Eu tenho usado esse código para instanciar minha subclasse de segue personalizada e executá-lo programaticamente. Parece funcionar. Algo errado com isso? Estou intrigado, lendo todas as outras respostas dizendo que isso não pode ser feito.
fonte
UIStoryboardSegue
.performSegueWithIdentifier:
esteja realmente definido no storyboard. Eu evito todos os problemas se eu mesmo criar o segue.Acho que isso foi respondido e aceito, mas eu gostaria de acrescentar mais alguns detalhes.
O que eu fiz para resolver um problema em que eu apresentaria uma visualização de login como primeira tela e, em seguida, queria seguir para o aplicativo se o login estivesse correto. Eu criei o segue do controlador de visualização de login para o controlador de visualização raiz e dei a ele um identificador como "myidentifier".
Depois de verificar todo o código de login, se o login estivesse correto, eu ligaria
Meu maior mal-entendido foi que eu tentei colocar os seguimentos em um botão e meio que interrompi os seguidos assim que foram encontrados.
fonte
Você precisa vincular seu código ao
UIStoryboard
que está usando. Certifique-se de acessar o YourViewController no seuUIStoryboard
, clique na borda ao redor e defina seuidentifier
campo comoNSString
aquele que você chama no seu código.fonte
Para controladores que estão no storyboard.
jhilgert00 não é isso que você estava procurando?
OU...
fonte
bem, você pode criar e também pode subclassificar o UIStoryBoardSegue. a subclasse é usada principalmente para fornecer animação de transição personalizada.
você pode ver o vídeo do wwdc 2011 apresentando o StoryBoard. também está disponível no youtube.
http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue
fonte
Eu gostaria de adicionar um esclarecimento ...
Um mal-entendido comum, de fato um que eu tive durante algum tempo, é que um storyboard segue é acionado pelo
prepareForSegue:sender:
método. Não é. Um storyboard segue será executado, independentemente de você ter implementado umprepareForSegue:sender:
método para esse (saindo de) controlador de exibição.Aprendi isso com as excelentes palestras do iTunesU de Paul Hegarty . Minhas desculpas, mas infelizmente não consigo lembrar qual palestra.
Se você conectar um segue entre dois controladores de exibição em um storyboard, mas não implementar um
prepareForSegue:sender:
método, o segue continuará no controlador de vista de destino. No entanto, ele segue para esse controlador de exibição despreparado.Espero que isto ajude.
fonte
Os segmentos do storyboard não devem ser criados fora do storyboard. Você precisará conectá-lo, apesar das desvantagens.
A referência UIStoryboardSegue afirma claramente:
Você ainda pode dizer programaticamente ao storyboard para apresentar um controlador de exibição usando um segue usando
presentModalViewController:
oupushViewController:animated:
calls, mas precisará de uma instância do storyboard.Você pode chamar
UIStoryboard
o método de classe s para obter um storyboard nomeado com pacote nulo para o pacote principal.storyboardWithName:bundle:
fonte
Primeiro, suponha que você tenha duas visualizações diferentes no storyboard e deseje navegar de uma tela para outra, então siga estas etapas:
1) Defina todas as suas visualizações com o arquivo de classe e também a identificação do storyboard no inspetor de identidade.
2) Certifique-se de adicionar um controlador de navegação à primeira exibição. Selecione-o no Storyboard e, em seguida, em Editor> Incorporar> Controlador de navegação
3) Na sua primeira classe, importe o "secondClass.h"
4) Adicione este comando no IBAction que deve executar o seguinte
5)
@"second"
é a classe do controlador secondview, ID do storyboard.fonte
self.storyboard
deve ser:UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
storyboardWithName:@"Main"
[self showDetailViewController:next sender:self];
ou[self showViewController:next sender:self];
Fiz a engenharia reversa e fiz uma (re) implementação de código aberto das sequências do UIStoryboard: https://github.com/acoomans/Segway
Com essa biblioteca, você pode definir segues programaticamente (sem nenhum storyboard).
Espero que ajude.
fonte
Alguns problemas, na verdade:
Primeiro, nesse projeto que você enviou para nós, o segue não possui o identificador "segue1":
nenhum identificador
Você deve preencher esse identificador, se ainda não o tiver.
Segundo, ao passar da exibição de tabela para exibição de tabela, você está chamando initWithNibName para criar um controlador de exibição. Você realmente deseja usar o instantiateViewControllerWithIdentifier.
fonte
Aqui está o exemplo de código para
Creating a segue programmatically
:fonte
self.prepare(for: self.commonSegue, sender: self)
do seu método de ação. Então, qual é o sentido de compararif self.commonSegue == segue {...}
noprepare(for:sender)
método?prepare(for:sender:)
, você pode configurar o controlador de exibição de destino antes de ser exibido. Claro que você também pode fazê-loactionFunction
.