[ios] Swift는 프로그래밍 방식으로 다른 뷰 컨트롤러 / 장면으로 이동합니다.
프로그래밍 방식으로 다른 ViewController로 이동하기 위해 다음 코드를 사용하고 있습니다. 잘 작동하지만 navigation bar
. 이 문제를 어떻게 해결합니까? (탐색 표시 줄이를 embeding에 의해 만들어진 ViewController
의 navigation 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)
}