ios - Navegue programaticamente para outro controlador de cena/cena




swift uiviewcontroller (12)

Além das boas respostas acima para definir o controlador de exibição de navegação na parte superior da tela do seu aplicativo, você pode adicioná-lo ao seu arquivo AppDelegate.swift dentro do bloco da seguinte maneira

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = UINavigationController(rootViewController: LoginViewController())

    return true

}

Recebi uma mensagem de erro durante a navegação do primeiro controlador de exibição para o segundo controlador de exibição. Minha codificação é como esta

let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

O problema é que sempre recebo esse tipo de mensagem de erro

2014-12-09 16:51:08.219 XXXXX[1351:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/FDC7AA0A-4F61-47E7-955B-EE559ECC06A2/XXXXX.app> (loaded)' with name 'LoginViewController''
*** First throw call stack:
(0x2efcaf0b 0x39761ce7 0x2efcae4d 0x31b693f9 0x31ac1eaf 0x3191e365 0x317fe895 0x318a930d 0x318a9223 0x318a8801 0x318a8529 0x318a8299 0x318a8231 0x317fa305 0x3147631b 0x31471b3f 0x314719d1 0x314713e5 0x314711f7 0x3146af1d 0x2ef96039 0x2ef939c7 0x2ef93d13 0x2eefe769 0x2eefe54b 0x33e6b6d3 0x3185d891 0x4ccc8 0x4cd04 0x39c5fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Dou-lhe o meu código para fazer uma transição. Neste exemplo, a ação está se conectando a um UIButton. Portanto, não esqueça de configurá-lo. Não se esqueça de definir o nome do seu ViewController no método de transition .

Não se esqueça de definir seu storyboard também. Você precisa ter uma visualização por viewController. Conecte cada ViewController a cada exibição no storyBoard. Você pode ver na tela abaixo

class PresentationViewController: UIViewController {
    override func viewDidLoad() {
         super.viewDidLoad()

         var playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton

         let image = UIImage(named: "YourPlayButton") as UIImage?

         playButton.frame = CGRectMake(0, 0, 100, 100)
         playButton.center = CGPointMake(self.view.frame.width/2, self.view.frame.height/2)
         playButton.addTarget(self, action: "transition:", forControlEvents:  UIControlEvents.TouchUpInside)
         playButton.setBackgroundImage(image, forState: UIControlState.Normal)

         self.view.addSubview(playButton)
    }


func transition(sender:UIButton!)
{
    println("transition")
    let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourSecondViewController") as UIViewController

    let window = UIApplication.sharedApplication().windows[0] as UIWindow
    UIView.transitionFromView(
        window.rootViewController!.view,
        toView: secondViewController.view,
        duration: 0.65,
        options: .TransitionCrossDissolve,
        completion: {
            finished in window.rootViewController = secondViewController
    })
}
}

Eu já encontrei a resposta

Swift 4

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "nextView") as! NextViewController
self.present(nextViewController, animated:true, completion:nil)

Swift 3

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

Não tenho certeza, tente as etapas abaixo, acho que pode haver erro abaixo dos motivos.

  • você renomeia alguns arquivos fora do XCode. Para resolvê-lo, remova os arquivos do seu projeto e importe-os novamente.
  • verifique e inclua o arquivo Nib ausente em Fases de construção-> Copiar recursos do pacote. finalmente, verifique a ortografia do nome da ponta, está correta e diferencia maiúsculas de minúsculas.
  • verifique as propriedades dos arquivos .xib / storyboard no inspetor de arquivos , a propriedade " Target Membership " afixa na caixa de seleção e, em seguida, seu arquivo xib / storyboard foi vinculado ao seu destino.
  • como tipo incorreto de NIB. Clique com o botão direito do mouse no arquivo e clique em "Obter informações" para verificar se o tipo é o que você esperaria.

Se você deseja navegar para o Controlador criado programaticamente, faça o seguinte:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Se você deseja navegar para o Controller no StoryBoard com o identificador "newViewController", faça o seguinte:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

Se você estiver criando uma interface do usuário sem arrastar e soltar (sem usar o storyboard) e quiser navegar na página padrão ou no ViewController.swift para outra página? Siga estas etapas 1) adicione uma classe (.swift) 2) Importe o UIKit 3) Declare o nome da classe como

class DemoNavigationClass :UIViewController{
     override func viewDidLoad(){
         let lbl_Hello = UILabel(frame: CGRect(x:self.view.frame.width/3, y:self.view.frame.height/2, 200, 30));
lbl_Hello.text = "You are on Next Page"
lbl_Hello.textColor = UIColor.white
self.view.addSubview(lbl_Hello)
    }
}

depois de criar a segunda página, volte para a primeira página (ViewController.swift) Aqui, faça um botão no método viewDidLoad

let button = UIButton()
button.frame = (frame: CGRect(x: self.view.frame.width/3, y: self.view.frame.height/1.5,   width: 200, height: 50))
 button.backgroundColor = UIColor.red
 button.setTitle("Go to Next ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

agora defina o método buttonAction fora de viewDidLoad () na mesma classe

func buttonAction(sender: UIButton!) 
{
    let obj : DemoNavigationClass = DemoNavigationClass();
    self.navigationController?.pushViewController(obj, animated: true)
}

Mantenha uma coisa que eu esqueço no main.storyboard: há uma cena com uma seta, selecione essa seta e pressione o botão Excluir

Agora arraste e solte um controlador de navegação e exclua a tableview que acompanha o controlador de navegação. selecione o controlador de navegação, pressione o controle no teclado e arraste-o para outra cena no storyboard que é o ViewController. Isso significa que seu viewcontroller se tornará root no viewcontroller. Espero que ajude. Obrigado em main.storyboard, arraste e solte o navigationcontroller,


Veja o meu.

func actioncall () {
    let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPageID") as! ViewController
    self.navigationController?.pushViewController(loginPageView, animated: true)
}

Se você usar o estilo de apresentação, poderá perder a barra de navegação da página com navegação predefinida.


Você pode navegar entre os controladores de exibição usando o código com a ajuda do storyboard e storyboardId do controlador de exibição. Este código é para o Swift 3:

let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
self.navigationController?.pushViewController(signUpVC, animated: true)

XCODE 8.2 E SWIFT 3.0

Apresentar um UIViewController existente

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.present(loginVC, animated: true, completion: nil)

Enviar um UIViewController existente

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(loginVC, animated: true)

Lembre-se de que você pode colocar o UIViewController Identifier seguindo as próximas etapas:

  • Selecione Main.storyboard
  • Selecione seu UIViewController
  • Pesquise os Utilitários à direita
  • Selecione o inspetor de identidade
  • Procure na identidade da seção "ID do storyboard"
  • Coloque o identificador para o seu UIViewController


XCODE 9.2 E SWIFT 3.0

ViewController para NextViewcontroller sem Conexão Segue

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(nextViewController, animated:true)

ou

let VC:NextViewController = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(VC, animated: true)

Swift3:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController("LoginViewController) as UIViewController
self.navigationController?.pushViewController(vc, animated: true)

Experimente isso. Você acabou de confundir a ponta com a representação do storyboard.


let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyCustomViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)






xcode6