Como defino programaticamente InitialViewController
para um Storyboard? Quero abrir meu storyboard para uma visualização diferente, dependendo de algumas condições que podem variar de lançamento para lançamento.
ios
objective-c
swift
uiviewcontroller
uistoryboard
UserDev
fonte
fonte
Respostas:
Como sem um controlador de exibição inicial fictício
Verifique se todos os controladores de exibição inicial têm um ID do Storyboard.
No storyboard, desmarque o atributo "É controlador de exibição inicial" no primeiro controlador de exibição.
Se você executar seu aplicativo neste momento, você lerá:
E você notará que sua propriedade de janela no delegado do aplicativo agora é nula.
Na configuração do aplicativo, acesse seu destino e a
Info
guia. Limpe o valor deMain storyboard file base name
. NaGeneral
guia, limpe o valor paraMain Interface
. Isso removerá o aviso.Crie a janela e o controlador de exibição inicial desejado no
application:didFinishLaunchingWithOptions:
método do delegado do aplicativo :fonte
didFinishLaunchingWithOptions
é chamado quando o aplicativo é iniciado em um novo processo. Se você for para a tela inicial e retornar ao aplicativo, esse método não será chamado novamente. (A menos que o iOS termine devido a restrições de memória.) Tente parar o aplicativo e inicie novamente a partir do seu IDE. Se o problema persistir, publique o problema no SO e terei prazer em ajudar, amigo.self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Para todos os amantes de Swift por aí, aqui está a resposta de @Travis traduzida para SWIFT :
Faça o que o @Travis explicou antes do código do Objective C. Então,
O
ExampleViewController
seria o novo controlador de exibição inicial que você gostaria de mostrar.Os passos explicados:
Aproveite e feliz programação!
fonte
Você pode definir programaticamente o rootViewController da janela da chave em
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
por exemplo:
fonte
init()
/deinit()
, mas sem executarviewDidLoad()
ou inicializar adequadamenteIBOutlet
-s. Verifique se o código está pronto para isso.Swift 3: atualização para o código de @ victor-sigler
fonte
Você pode definir o rootviewcontroller de Navegação como um controlador de vista principal. Essa ideia pode ser usada para login automático conforme os requisitos do aplicativo.
Para usuários do StoryboardSegue
obrigado
fonte
Abra o mainstoryboard, selecione a visualização que deseja iniciar primeiro e abra Utilitários -> Atributos. Abaixo do "View Controller", você vê o botão de opção "Is initial View Controller". Apenas selecione.
--- À pergunta revisada:
Pode ser que você possa tentar o seguinte: escreva um método na seção ViewDidLoad da visualização inicial e, quando o método for executado no início do aplicativo, o método dispara um segue para outra visualização.
fonte
SWIFT 5
Se você não tiver um ViewController definido como o ViewController inicial no storyboard, precisará fazer duas coisas:
Finalmente, agora você pode adicionar seu código no SceneDelegate:
fonte
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
aviso que eu estava tendo depois de decidir instanciar meu VC inicial no código. Um ponto importante, quando @ rs7 diz "excluir o campo de nome do storyboard", significa a linha inteira da lista, não apenas o conteúdo do próprio campo.Eu não acho que é possível. Em vez disso, você pode ter um controlador inicial que terá sequências para diferentes controladores de exibição. Na inicialização, você pode decidir quais segue executar programaticamente.
fonte
Você pode definir o
initial view controller
uso do Interface Builder e de forma programática.Abaixo está a abordagem usada para programaticamente.
Objetivo-C:
Rápido :
fonte
Criei uma classe de roteamento para lidar com a navegação dinâmica e manter a classe AppDelegate limpa, espero que ajude a outros também.
E no seu AppDelegate, chame isso
fonte
Outra solução com o uso do Swift 3 e Swift 4 com a prevenção de vazamento de força é assim
E abaixo está usando com
UINavigationController
fonte
Em
AppDelegate.swift
você pode adicionar o seguinte código:Obviamente, você precisa implementar sua lógica, com base em quais critérios você escolherá um controlador de exibição apropriado.
Além disso, não esqueça de adicionar uma identidade (selecione storyboard -> Cena do controlador -> Mostrar o inspetor de identidade -> atribua o StorboardID).
fonte
RESPOSTA ATUALIZADA para iOS 13 e delegado de cena:
certifique-se de que no arquivo info.plist vá para Application Scene Manifest -> Configuration Scene -> Application Session Role -> Item 0 e exclua a referência ao storyboard principal também. Caso contrário, você receberá o mesmo aviso sobre a falha na instanciação do storyboard.
Além disso, mova o código do aplicativo delegado para a cena delegate method scene (_: willConnectTo: options :), pois é aqui que os eventos do ciclo de vida são tratados agora.
fonte
Alguns dias atrás eu encontrei a mesma situação. Um truque muito simples resolveu esse problema. Defino oculto meu controlador de exibição inicial antes do lançamento2. Se o controlador de exibição inicial for o controlador certo, ele será definido como visível em viewDidLoad. Senão, uma sequência é executada no controlador de visualização desejado. Funciona perfeitamente no iOS 6.1 e superior. Tenho certeza que funciona em versões anteriores do iOS.
fonte
Agradecemos a modificação da seguinte maneira no AppDelegate:
fonte
Solução simples encontrada - não é necessário remover a "verificação inicial do controlador de exibição" do storyboard e editar a guia Informações do projeto e usar
makeKeyAndVisible
, basta colocarno
fonte
rootVC
deinstantiateViewControllerWithIdentifier
, correto?Outra maneira é apresentar o viewController,
Primeiro, você precisa criar o objeto do seu storyboard, depois alterar o root (se necessário) e, em seguida, fazer referência a um controlador de exibição específico que é acionado pelo controlador de exibição atual (se você alterar o root); caso contrário, é apenas um novo controlador de exibição que pode ser usado.
fonte
Swift 4, Xcode 9
no arquivo AppDelegate.swift
fonte
fonte
Swift 5 ou acima # faz o controlador de exibição de rota por este código simples. Se você estiver usando o xcode 11 ou superior, inicialize primeiro
var window: UIWindow?
no AppDelegatefonte
Se você preferir não alterar applicationDidFinish, execute o seguinte truque:
Defina o controlador de Navegação como um controlador de exibição inicial e atribua a ele uma classe personalizada 'MyNavigationController'. Em seguida, você pode ajustar seu controlador de visualização raiz durante o viewDidLoad - ele substituirá o controlador de visualização raiz que você definiu no seu storyboard.
fonte
Selecione o controlador de exibição que você deseja abrir primeiro e vá para o Inspetor de Atributos. Vá para a cena inicial e verifique a opção inicial do controlador de exibição.
Agora, este será o seu controlador de exibição inicial que abrirá primeiro quando o aplicativo for iniciado.
fonte