[ios] Swift는 프로그래밍 방식으로 다른 뷰 컨트롤러 / 장면으로 이동합니다.

프로그래밍 방식으로 다른 ViewController로 이동하기 위해 다음 코드를 사용하고 있습니다. 잘 작동하지만 navigation bar. 이 문제를 어떻게 해결합니까? (탐색 표시 줄이를 embeding에 의해 만들어진 ViewControllernavigation controller경우 그 문제.)

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

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



답변

스위프트 5

기본 모달 프레젠테이션 스타일은 카드입니다. 이렇게하면 상단에 이전 뷰 컨트롤러가 표시되고 사용자가 제시된 뷰 컨트롤러를 스 와이프 할 수 있습니다.

이전 스타일을 유지하려면 다음과 같이 표시 할 뷰 컨트롤러를 수정해야합니다.

newViewController.modalPresentationStyle = .fullScreen

이는 프로그래밍 방식으로 생성 된 컨트롤러와 스토리 보드 생성 컨트롤러 모두에 동일합니다.

스위프트 3

프로그래밍 방식으로 생성 된 컨트롤러 사용

프로그래밍 방식으로 생성 된 컨트롤러로 이동하려면 다음을 수행하십시오.

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

StoryBoard에서 만든 컨트롤러로

식별자 “newViewController”를 사용하여 StoryBoard에서 Controller로 이동하려면 다음을 수행하십시오.

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


답변

SWIFT 4.x

큰 따옴표로 묶인 문자열은 항상 나를 혼란스럽게하므로이 질문에 대한 답변은이를 해결하기 위해 그래픽 표현이 필요하다고 생각합니다.

은행 앱의 경우 LoginViewController 및 BalanceViewController가 있습니다. 각각의 화면이 있습니다.

앱이 시작되고 로그인 화면이 표시됩니다. 로그인이 성공하면 앱이 잔액 화면을 엽니 다.

어떻게 보이는지 :

여기에 이미지 설명 입력

여기에 이미지 설명 입력

로그인 성공은 다음과 같이 처리됩니다.

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

보시다시피 소문자로 된 스토리 보드 ID ‘balance’는 코드의 두 번째 줄에있는 것이며, 첨부 된 스크린 샷과 같이 스토리 보드 설정에 정의 된 ID입니다.

대문자 ‘B’가있는 ‘Balance’라는 용어 는 코드의 첫 번째 줄에 사용되는 스토리 보드 파일 의 이름입니다 .

코드에서 하드 코딩 된 문자열을 사용하는 것은 매우 나쁜 관행이라는 것을 알고 있지만, 어떻게 든 iOS 개발에서는 일반적인 관행이되었으며 Xcode는 이에 대해 경고조차하지 않습니다.


답변

존재하지 않는 현재 탐색 컨트롤러를 사용하여 새 뷰 컨트롤러를 푸시해야합니다.

self.navigationController.pushViewController(nextViewController, animated: true)


답변

그의 대답 에 @jaiswal Rajan에 따르면 . 다음과 같이 pushViewController를 수행 할 수 있습니다.

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)


답변

따라서 뷰 컨트롤러를 제시하면 내비게이션 컨트롤러에 표시되지 않습니다. 전체 화면이 표시됩니다. 이 경우 다른 탐색 컨트롤러를 만들고 nextViewController이를위한 루트로 추가 하고이 새 navigationController를 제공해야합니다.

또 다른 방법은 뷰 컨트롤러를 누르는 것입니다.

self.presentViewController(nextViewController, animated:true, completion:nil)

자세한 내용은 Apple 설명서를 확인하십시오 .-
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96


답변

OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

그것은 나를 OperationQueue.main.addOperation위해 메인 스레드에서 실행 되는 코드를 내부에 넣었을 때 나를 위해 일했습니다 .


답변

위의 코드는 잘 작동하지만 NSObject클래스 에서 탐색하려는 경우 사용할 수 없습니다 self.present.

let storyBoard = UIStoryboard(name:"Main", bundle: nil)
if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController,
    let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController {

    navController.pushViewController(conVC, animated: true)
}