IOS 앱 개발하기 - 3일차 : 화면 전환, present 함수
목표는 https://macgongmon.club/25
MVVM 패턴 구현을 6월안으로 구현하는 것
✓오늘의 목표
- 로그인 후, 메인 페이지로 넘어가기
로그인 다음 페이지로 넘어가려면 뷰의 구성을 알아야해서 뷰의 생명주기를 조사해봄.
안드로이드의 Activity 의 생명주기와 다른건지 같은건지 아직 잘 모르겠음...
코드를 짜면서 이해한 후에, 재정리 해야지
[뷰 생명주기 참고]
https://zeddios.tistory.com/43
viewDidLoad() : 뷰의 초기화 작업, 뷰를 메모리 계층에 로드한 직후 수행, 뷰가 만들어질 때 1번만 수행됨
viewWillAppear() : 뷰가 나타나기 직전 호출
viewDidAppear() : 뷰가 화면에 나타난 직후 수행, 애니메이션 적용 등
viewWillDisappear() : 뷰가 사라지기 직전 호출
viewDidDisappear() : 뷰가 사라직 후 호출
[뷰 전환 참고]
https://medium.com/@mingdaejo/ios-%ED%99%94%EB%A9%B4-%EC%A0%84%ED%99%98-b979188a1a82
✓화면 전환 4가지 방법
1. 뷰 컨트롤러의 뷰 위에 다르나 뷰를 가져와 바꿔치기
2. 뷰 컨트롤러에서 다른 뷰 컨트롤러를 호출
3. 네비게이션 컨트롤러를 사용하여 화면 전환
4. 화면 전환용 객체 세그웨이(SegueWay)를 사용
1번 방식은 뷰 위에 뷰를 덮으므로서 메모리가 터져서 앱이 죽는 현상이 발생할 수 있다고 한다.
그래서 지양하는 방식. pass.
2번 방식은 presentation 방식이라고 하는 듯.
현재의 뷰에서 다른 뷰 컨트롤러를 호출해보겠다.
이를 위해서 present 함수를 사용함.
이전에 alert 화면을 구성할 때 썼지만, 화면 전환을 수행하는 대표적인 함수
1. 전환해 줄 다른 뷰 컨트롤러 생성
스토리보드 상단 + 버튼에서 View Contoller 를 추가
이미 추가하고 캡쳐해서 뷰가 3개나 있다
하나를 클릭하고 esc 버튼을 누르면 삭제 됨
다른 뷰 객체들과 똑같다
내가 생성한 뷰가 맞다는 의미로 주황색 hello world 라벨을 붙여줬음
2. present() 함수 추가
기존 메인 뷰인 ViewController.swift 에서 새 창을 띄울 부분에 해당 코드 추가
guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController")
else{
return
}
uvc.modalTransitionStyle = UIModalTransitionStyle.coverVertical
self.present(uvc, animated: true)
self.storyboard : 스토리보드를 참고해서 이동할 뷰컨트롤러 객체 찾기 (! 는 혹시 있을 nil 을 방지)
instantiateViewController : 뷰콘트롤러 객체를 찾아 할당
modalTransitionStyle : 화면 전환 시 애니메니션 타입
- coverVertical : 아래에서 위로 올라가면서 전환
- crossDissolve. : 전화면에서 다음화면이 교차되며 뚜렷하게 표현되는 전환
- paritalCurl. : 책넘김 효과, 화면 오른쪽 아래에서 페이지가 올라가는 효과로 전환
- filpHorizontal : 화면 중앙 축을 기준으로 회전하며 전환 (Flip)
✓ guard
guard 의 반환값이 true 일 경우, if 문 코드 계속 진행.
false의 경우, else의 블럭 코드 수행
* 장점
1. 코드 가독성
2. optional type 안전하게 사용 -> 옵셔널 바인딩 공부 후 추가 예정
3. 화면 띄우기 확인
로그인 버튼을 누르면 헬로우 월드 화면으로 전환되는 것을 확인함
4. 두번째 화면에서 작업하기 (뷰 컨트롤러와 swift 파일 연결)
1) 우선 두번째 뷰컨트롤러를 연결할 스위프트 파일을 만들어줌.
2) 스위프트 파일과 스토리보드의 뷰컨트롤러 연결
스토리보드에서 두번째 뷰컨트롤러를 클릭하고, custom class 에서 클래스명을 기입하고 Return 버튼 (엔터)을 누르면 연결됨
SecondVC.swift 파일이니까 클래스명은 SecondVC
그 다음에 Assistant 를 켜보면 SecondVC.swift 파일이 열리는 것을 볼 수 있다.
✓ 뷰 컨트롤러와 클래스 연결 오류
1. 두번째 뷰 컨트롤러에서 캡쳐본의 윗 아이콘을 클릭하지 않으면 다른 객체가 선택된 것일 수도 있음
2. Assistant 에서 SecondVC.swift 가 나오지 않는다면 Automatic 을 클릭. (아래 참고)
위 캡쳐처럼 Automatc 을 보면 연결된 스위프트 파일을 볼 수 있음
만약에 해당하는 파일이 뜨지 않는다면 뷰 컨트롤러 객체와 클래스가 연결되지 않은 것임
연결이 되지 않으면 UIView.h 나 UIcontoller.h 인가? 기본 내장 파일이 연결되어 있기에 그 파일이 뜸
3) 두번째 뷰에서 수행할 코드 삽입
여기서 위에 배운 뷰 생명주기를 이용해 보겠다.
viewDidAppear() 함수는 뷰가 나타난 직후의 애니메이션 등의 기능을 수행하니까,
이 함수를 오버라이드 해서 창이 뜨면 두번째 스위프트가 제대로 연결되었다는 alert 창을 띄워보기
아래는 두번째 스위프트 파일
SecondVC.swift
import UIKit
class SecondVC: UIViewController {
@IBOutlet weak var loginlabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController(title: nil, message: "bye", preferredStyle: UIAlertController.Style.alert)
let onAction = UIAlertAction(title:"확인", style: UIAlertAction.Style.destructive, handler:nil)
alertController.addAction(onAction)
present(alertController, animated: true, completion: nil)
self.presentingViewController?.dismiss(animated: true)
}
}
5. 뷰 종료
presentation 방식에서 뷰를 제거하는 것은 dismiss 함수로 가능
그러면 alert의 확인 버튼을 눌렀을 때 종료하는 코드를 핸들러에 추가해보자
- Handler : This block has no return value and takes the selected action object as its only parameter.
라고 애플 디벨롭먼트 홈페이지에서 그랫음
* UIAlertAction 함수에서 핸들러 사용법
1) 사용할 함수를 정의
func someHandler(alert: UIAlertAction!) {
self.presentingViewController?.dismiss(animated: true)
}
이렇게 핸들러에 쓰일 함수를 만들어주고 뷰 종료 코드를 추가해줌
UIAlertAction 의 핸들러에 해당 함수를 쓰겠다고 해줌
let onAction = UIAlertAction(title:"확인", style: UIAlertAction.Style.destructive, handler: someHandler)
2) 코드에서 익명 함수로 바로 정의
let onAction = UIAlertAction(title:"확인", style: UIAlertAction.Style.destructive, handler: {(alert: UIAlertAction!) in self.presentingViewController?.dismiss(animated: true)})
둘 다 아래 동영상처럼 확인 버튼을 클릭하면 사라지는것 확인
SecondVC.swift
import UIKit
class SecondVC: UIViewController {
@IBOutlet weak var loginlabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController(title: nil, message: "bye", preferredStyle: UIAlertController.Style.alert)
let onAction = UIAlertAction(title:"확인", style: UIAlertAction.Style.destructive, handler: someHandler)
alertController.addAction(onAction)
present(alertController, animated: true, completion: nil)
}
func someHandler(alert: UIAlertAction!) {
self.presentingViewController?.dismiss(animated: true)
}
}
* 화면 전환 참고
https://velog.io/@ellyheetov/%ED%99%94%EB%A9%B4%EC%A0%84%ED%99%98
https://hyunable.github.io/2017/11/18/viewChange/
본 게시글은 IOS 입문자의 독학 과정입니다.
고수 분들의 많은 조언 및 지적 감사합니다.