-
(iOS) ViewController 화면 전환 방법Programing Language/iOS(Swift) 2019. 10. 17. 14:18728x90반응형
뷰 컨트롤러 직접 호출에 의한 화면 전환
- 현재의 뷰 컨트롤러에서 이동할 대상 뷰 컨트롤러를 직접 호출해서 화면에 표시한다. Presentation 방식이라고 부르기도한다.
- 화면 전환은 *비동기 방식*으로 전환되기 때문에 화면 전환이 끝나기 전에 다음 코드를 실행한다. 따라서 위 메서드를 이용해야 한다. - 비동기 방식 : 하나의 처리가 끝나기를 기다리지 않고 다음 작업을 바로 이어서 수행하는 방식을 비동기 방식이라고 부른다. - *present 메서드*를 이용한 화면 전환은 기존 뷰 컨트롤러를 유지한 채, 그 위에 새로운 뷰 컨트롤러의 화면을 덮는 방식이다. - dismiss 메서드에 의해서 걷어내진 viewcontroller화면은 운영체제에 의해 곧 메모리에서 해제된다. - dismiss 메서드를 써서 화면을 전환하면 화면을 걷어내는 주체가 자기자신viewcontorller가 아니라 자신을 띄우고 있는 이전화면 viewcontroller 라는 점이다! (즉, 이전화면이 현재화면을 걷어내는것임.) - 즉 viewcontroller가 주체가 되어서 메서드를 호출하는게 아니라 presentatingViewController를 통해서 메서드를 호출한다. (두 view의 관리자) - 이전 뷰를 띄울 때 이전화면을 복귀가 아닌 PresentatingViewController를 통해서 이전화면을 새로 호출하면 안된다. 이유는 그럼 ***뷰가 계속 중복해서 쌓이게 되어 메모리상 비효율적***이다. <br> #### CODE :: 예제 --- moveNextAction 버튼을 누르면 화면전환이 된다. - 두번째 뷰 ID : secondView ```Swift class ViewController: UIViewController { @IBAction func moveNextAction(_ sender: Any) { //이동할 뷰 컨트롤러 객체를 stroyboardID 정보를 이용하여 참조 //let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) if let view_Controller = self.storyboard?.instantiateViewController(withIdentifier:"secondView") { // 화면 전환할 때의 애니메이션 타입 // UIModalTransitionStyle.<변환스타일> // 1. coverVertical : 모달형식으로 등장 // 2. crossDissolve : 번인아웃되면서 화면변경 // 3. partialCurl : 책넘김 효과 // 4. flipHorizontal : 화면돌아가는 효과(flip) view_Controller.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal //인자값으로 뷰 컨트롤러 인스턴스를 넣고 프레젠트 메서드 호출 // 첫번째 인자 : 전환될 뷰 self.present(view_Controller, animated: true) } }
Custom Class for ViewController
하나의 뷰컨트롤러에는 하나의 뷰컨트롤러 클래스가 있어야 한다.
- customClass.swift 파일 추가 (UIViewController 상속받아 생성)
- storyboard에서 해당 뷰컨트롤러를 클릭 후 인스펙터창에서 Cumstom Class 영역에서 만들어준 customClass.swift 를 class란에 써넣어준다.
- Identity에 StroyboardId에 swift클래스 명과 같은 명을 넣어준다
- 소스 - 뷰 연결 완료!
화면 전환 기법2 :: 네비게이션 컨트롤러를 이용한 화면 전환
-
뷰 컨트롤러들의 계층적 구조를 관리하는 역할을 한다. 직접 컨텐츠를 담고 화면을 구성하지 않지만, 대신 다른 뷰를 포함하고 있으며 포함된 모든 뷰 컨트롤러에 내비게이션 바를 생성하는 특징이 있다. (스토리보드상 보이지 않더라도 빌드하면 포함되어져 있다.)
-
항상 컨텐츠 계층구조의 시작점 역할을 하는 뷰 컨트롤러와 함께 붙어 다니는데, 이를 Root View Controller라고 한다.
-
Stack 구조를 갖고 있다.
//최상위에 뷰 컨트롤러를 추가할 때 pushViewController(:animated:) //최상위 뷰 컨트롤러를 제거할 때 popViewController(animated:)
-
도중에 네비게이션컨트롤러를 추가할 경우 [Editor] -> [Embed in]->[Navigation Controller]를 눌러줘서 삽입시켜준다. 혹은 segue( -> Root view controller)를 통해 지정해준다.
-
네비게이션 컨트롤러를 사용하여 화면을 전환시켜주지 않았을 경우, 더이상 네이게이션 컨트롤러의 제어하에 있지 않게 된다.
@IBAction func click_movebtn(_ sender: Any) { // viewcontrol에 이동할 viewcontroller에 스위프트 파일이 연결 되어있다면?? // pushViewController 메서드를 통해서 상수로 지정한 viewcontrol을 넣어 그쪽 파일로 넘어간다. if let viewcontrol = self.storyboard?.instantiateViewController(withIdentifier:"abcd"){ self.navigationController?.pushViewController(viewcontrol, animated: true) } }
참고 자료 :
https://hyunable.github.io/2017/11/18/viewChange/
https://medium.com/@mingdaejo/ios-%ED%99%94%EB%A9%B4-%EC%A0%84%ED%99%98-b979188a1a82
728x90반응형'Programing Language > iOS(Swift)' 카테고리의 다른 글
(iOS) TableView에서 사진 삭제하기 후 정렬하기 (0) 2019.10.28 (iOS) Xcode유용한 단축키 모음 (0) 2019.10.25 [iOS] 커스텀 알림창 만들기 (0) 2019.10.25 (iOS) UIImageView에 url 로 이미지 넣기 (0) 2019.10.24 (iOS) 화면간 데이터 전송 방법 (0) 2019.10.17