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


83

프로그래밍 방식으로 다른 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)

답변:


208

스위프트 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)

2
"! NewViewController로"스토리 보드 옵션에 필요하지 않습니다
라비 Avigdor에게

2
예치 내가 그 선택 사항입니다 알지만, 우리가 다음 보여 주면의 ViewController 다른 개발자 대상이다 명확해진다
jaiswal 라잔

4
전화 storyBoard.instantiateViewControllerself.present메인 스레드에서, 또는 당신의 ViewController 구성 요소를 표시에 지연이있을 것이다
알렉스

2
@Alex 봐, 메인 스레드에서 호출하는 것은 개발자에게 달려 있으며, 위에서 질문에 대한 답변을 방금 작성했습니다. 메인 스레드에서 호출하는 귀하의 의견은 여기에 적합하지 않습니다.
jaiswal 라잔

안녕 친구들 : 일반적으로 좀 더 친근한 어조를 제안해도 될까요? 대신, 주제 (이 꽤 문제가 여기에 SO에있다)가 직접 영업 이익에 의해 요청 아니에요 있지만, 나는이 좋은 대답은 여전히 작업이 주 스레드에서 발생한다는 것을 (사람이 읽기에) 기억해야 할 적절한 장소라고 생각합니다
superjos

32

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는 이에 대해 경고조차하지 않습니다.


굉장한 데모
Elias Fazel

1
야 너 대단해!
OhhhThatVarun

16

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

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

이점이있는 이유는 무엇입니까?
DragonFire

1
@DragonFire, op는 탐색 모음을 가리지 않고 작동하기를 원하기 때문입니다. whatsapp 연락처 화면과 채팅 화면 사이와 같은 마스터-세부 정보 페이지 디자인을 원한다면 push내비게이션 컨트롤러 가 있는 viewcontroller가 있어야 합니다. (왼쪽에서 오른쪽으로 애니메이션됩니다) 현재 화면에 팝업을 표시, 프레젠테이션 (아래에서 위로 애니메이션)하려면을 사용하십시오 present.
Okan Kocyigit

감사합니다! 내 탐색을 유지 치료를 작동 컨트롤러 탭 등
David_2877

12

그의 대답 에 @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)

1
안녕하세요, 궁금합니다. 이미 게시 된 답변을 반복하는 이유는 무엇입니까? 댓글이나 찬성도 괜찮 았을 것입니다. 아니면 뒤에 추론이 더 있습니까?
superjos

그는 NavigationController로 탐색하는 방법을 제시하고 있습니다. 감사합니다.
Hiran DA Walawage

4

따라서 뷰 컨트롤러를 제시하면 내비게이션 컨트롤러에 표시되지 않습니다. 전체 화면이 표시됩니다. 이 경우 다른 탐색 컨트롤러를 만들고 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


presentViewController이름이 변경되었습니다 present(loginController, animated:true, completion:nil)
kite_n_code

2
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위해 메인 스레드에서 실행 되는 코드를 내부에 넣었을 때 나를 위해 일했습니다 .


1

위의 코드는 잘 작동하지만 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)
}

0

다른 모든 답변은 좋게 들립니다. 애니메이션 LaunchScreen을 만들어야하는 경우를 다루고 싶습니다. 애니메이션의 3 ~ 4 초 후에 다음 작업은 홈 화면으로 이동하는 것이 었습니다. 나는 segues를 시도했지만 대상보기에 문제가 발생했습니다. 그래서 마지막에 AppDelegates의 Window 속성에 액세스하고 새 NavigationController 화면을 할당했습니다.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController

//Below's navigationController is useful if u want NavigationController in the destination View
let navigationController = UINavigationController(rootViewController: homeVC)
appDelegate.window!.rootViewController = navigationController

incase, u 대상 뷰에서 navigationController를 원하지 않는 경우 다음과 같이 할당하십시오.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
appDelegate.window!.rootViewController = homeVC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.