UI Components 정리 [스코클 TIL_230802]

7과11사이·2023년 8월 2일
0

스파르타코딩클럽

목록 보기
22/90
post-thumbnail

오늘의 학습

기술면

todo 어플을 구현하기 위해 화면을 구성하는 도중, UIButton에서 문제가 발생했다. setTitle(,for:) 함수가 적용 이후 nil 문제를 발생시켰는데, 도저히 이해할 수 없었다. 3시간 동안 구글링, 팀원들, 전 팀원들, 매니저님과 튜터님 순으로 엄청나게 괴롭혔다.
결국 해결 방법을 찾았는데, 어이 없게도 타입을 잘못 적었다.
그것도 ViewController 자체를.

class mainViewController: UIViewController {
	@IBOutlet weak var checkTodo: UIButton!
	@IBOutlet weak var checkFinished: UIButton!

	func viewDidLoad() {
    	super.viewDidLoad()
        checkTodo.setTitle("완성된 타이틀", for: .normal)
        view.backgroundColor = .red
    }
    
    @IBAction func checkTodoTapped(_ sender: UIButton) {
    	print("체크 버튼이 눌렸습니다.")
        performSegue(withIdentifier: "todo", sender: sender)
}

class secondViewController: ViewController {
	func viewDidLoad() {
    	super.viewDidLoad()
        view.backgroundColor = .blue
    }
}

mainViewController에는 checkTodo 버튼이 선언돼 있다.
해당 버튼을 클릭했을 때 secondViewController로 연결되도록 segue를 연결했다면, 연결이 될까?

아쉽지만, 위 코드는 아주 치명적인 이유로 실행이 되지 않을 것이다.
바로 연결하는 타입이 다르기 때문이다.

ViewController

  • ViewController이란 무엇일까?
    ViewController이라는 타입은 없다.
    ViewController 문서 또한 타입에 대한 정의가 아닌
    View Controller 들의 전반적인 내용을 정리한다. [링크]
    말그대로 View를 관리하는 컨트롤러이다.
    쉽게 생각하면 일종의 관제탑 같은 존재다.
    담당하는 View에 들어오는 모든 UIComponent를 제어하고,
    관리하며 사용자 인터렉션이 발생할 경우, 입력 값이 들어갈 수 있도록 제어를 하는 역할을 한다.

UIViewController

  • UIViewController는 어떻게 다를까?
    UIKit 어플에서 View 계층 구조를 관리하는 UIViewController는 view에 대한 정보를 지속적으로 업데이트하여 변화를 화면에 출력시킨다.
    결국 UIViewController가 View들을 관리하는 타입이었기에 secondViewcontroller를 viewController가 아닌 UIController로 연결하게 되면서 nil이 반환되는 문제점을 해결했다.
    [Views And Controls]

PerformSegue

  • IBOutlet으로 연결을 하고 IBAction이 걸려 있을 경우,
    PerformSegue가 불필요하다 생각했다.
    특정 행동을 취할 수 있고 segue를 스토리보드상 연결을 해두었으니 따로 segue를 작동 시킬 필요가 없다 생각했는데, 없어도 가능은 하지만, 혹시 모르는 차원에서 연결을 해두면 안전하게 이동이 가능하다는 점을 이해하게 됐다.


    정신 차리고 다시 해봤다.

    이미 스토리보드 상에 다른 ViewController로 segue를 연결했다면 performSegue이 필요없다.
    연결할 경우 들어가는 애니메이션 효과가 2번 발생 - Awkward

UIViewController 생명주기

  • 버튼에서 발생하던 문제점은 버튼의 값이 nil을 리턴한다는 이유였다.
    초기에는 버튼의 타이틀을 변경하는데 너무 느리거나 빠르게 생성이 되고 있어서 nil 값을 리턴하는 것으로 착각했다.
    그러면서 뷰의 생명주기에 대해서 공부를 하게 되었는데,

    viewDidLoad
    ViewWillAppear
    ViewDidAppear 등
    View의 구조화(레이아웃을 다 그리기 전과 후에 코드를 활용해보면서
    문제점을 접근하게 됐다.

    한가지 알아낸 건, 데이터가 순서대로 WillAppear > DidAppear > DidLoad > WillDisappear > DidDisappear 순으로 작동을 하는 것으로 이해했으며 Appearing에서 Disappearing으로 넘어가는 과정도 간혹 발생한다는 점을 알았다. [링크],[링크2], [링크3]

0개의 댓글