-Preview-

H2 App
업로드중..

-View made today-

IntroductionGoalPromiseMemberMemberDetail
소개뷰 연결목표뷰 연결약속뷰 연결멤버뷰 연결멤버디테일뷰 연결

-Code Review-

오늘은 미니프로젝트의 일환으로, 다른 팀원들이 만든 ViewController를 페이지뷰에 연결시키는 작업을 했다.
단순히 뷰컨트롤러를 연결하면 문제가 없을거라고 생각했는데, 예상 외의 문제들이 발생하여 조금 고생을 했다...

1) ViewController 가져오기

페이지뷰를 관리하는 클래스에서 현재 인덱스 값에 따라 다른 페이지를 보여주는데,
여기에 멤버들이 만들어준 뷰컨트롤러를 선언하여 넣어준다.

// 페이지마다 보여질 ViewController 정의
class PageContentViewController: UIViewController {
    var pageIndex: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        
        if pageIndex == 0 {
            setupCustomView(IntroductionViewController())
        } else if pageIndex == 1 {
            setupCustomView(GoalViewController())
        } else if pageIndex == 2 {
            setupCustomView(PromiseViewController())
        } else if pageIndex == 3 {
            setupCustomView(MemberViewController())
        }
    }
    // 생략...
}

그런데 이렇게 하고 프로젝트를 빌드했더니 문제가 생겼다.
메인뷰에 입장하자마자 크래시가 발생하더니 에러가 떴다...

// 에러코드
Fatal error: Unexpectedly found nil while unwrapping an Optional value

2) ViewController 원인 찾기

에러코드의 원인을 찾아가보니 멤버분이 만들어주신 ViewControllerLabel에서 옵셔널 값이 반환된다고 오류가 발생하고 있었다.
팀원분은 레이블을 IBOutlet으로 구현하셔서 혹시 스토리보드와 연결이 잘 되어있지 않았나?
라고 생각해서 스토리보드와 뷰컨트롤러의 연결을 확인해봤지만 연결은 잘 되어있었다.

일단은 레이블에 if를 추가해서 만약 nil을 반환하는 경우 프린트 되도록 해보았다.

@IBOutlet weak let firstLabel: UILabel!

// 중략...

if let label = firstLabel {
	label.text = "다함께 익어가는"
} else {
    print("label is nil")

// firstLabel.text = "다함께 익어가는" error 발생 분기점

이렇게 하고 빌드를 진행해보니 입력한 프린트 값 label is nil이 생성되며 크래시가 발생했다...

3) PageView 원인 찾기

인터넷에서 검색해보니 뷰 컨트롤러가 초기화되기 전에 로드를 하는 탓에 발생하기도 한다고 한다.
그럼 메인뷰에서 초기화를 먼저 시켜줘야 한다는건데, 이 방법을 몰랐다.

혼자서 오래 고민하다가 결국 해결을 못해서 튜터님께 찾아가서 해결방법을 여쭈어 봤는데 의외의 방법으로 해결할 수 있었다. 원인은 메인뷰에서 뷰컨트롤러를 불러올 때 모두 뷰컨트롤러를 초기화해서 불러왔는데, 이 방법이 잘못된 것이었다.
팀원분들은 StoryBoard를 사용해서 뷰를 구현했는데, 이 경우 스토리보드를 통해 뷰컨트롤러의 값을 전달 받아서 전달 받은 뷰컨트롤러 값을 메인 뷰에 불러와야 했던 것이다.

// 페이지마다 보여질 ViewController 정의
class PageContentViewController: UIViewController {
    var pageIndex: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        
        // 현재 인덱스 값에 따라 페이지뷰의 값이 바뀌도록 한다.
        if pageIndex == 0 {
        	// UIStoryboard에서 할당되어 있는 값을 뷰컨트롤러 값으로 변환
            // 변환된 값을 페이지 뷰에 불러온다.
            let vc = UIStoryboard(name: "Introduction", bundle: nil).instantiateViewController(identifier: "IntroductionViewController") as! IntroductionViewController
            setupCustomView(vc)
        } else if pageIndex == 1 {
            let vc = UIStoryboard(name: "Goal", bundle: nil).instantiateViewController(identifier: "GoalViewController") as! GoalViewController
            setupCustomView(vc)
        } else if pageIndex == 2 {
            let vc = UIStoryboard(name: "Promise", bundle: nil).instantiateViewController(identifier: "PromiseViewController") as! PromiseViewController
            setupCustomView(vc)
        } else if pageIndex == 3 {
            setupCustomView(MemberViewController())
        }
    }
    // 중략...
}

이렇게 하니 에러가 해결되고 무사히 빌드를 마칠 수 있었다.
UIKit도 처음이었는데, 팀프로젝트로 연결을 하는 것도 처음이어서 너무 미숙한 부분이었던 것 같다.

3) 구현 결과물

업로드중..


-Today's lesson review-

오늘은 팀원들과 프로젝트 연결을 하는 과정을 진행했는데,
여러모로 문제가 많이 발생해서 힘든 하루였다.
그래도 해결하는 과정을 통해 값진 경험을 얻었고, 다양한 지식도 쌓을 수 있었어서 좋은 시간이었던 것 같다.
아직 UIKit에 대해 잘 알지 못하니까 좀 더 성실히, 겸손하게 공부해야겠다고 생각했다.
profile
이유있는 코드를 쓰자!!

0개의 댓글