ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 12일차
    iOS 앱 개발 부트캠프/TIL 2024. 9. 27. 18:02

    오늘은 네비게이션 컨트롤러에 대해 공부했다. 첫 퀘스트였던 성적관리시스템을 완성시키고 싶었기 때문이다. 내가 원했던 건 처음 화면에서 학생의 이름과 아이디를 제출받고, 다음 화면에서 과목명과 점수를 입력 받으면 밑에 실시간으로 추가된 데이터들이 늘어나 나타나고 평균도 바로 보일 수 있었으면 했다.

    이런 느낌으로..

    어찌됐든 네비게이션을 다루는 연습을 해야겠다 싶어서 구글링으로 예제를 찾아 따라해보기로 했다. 지금 어떻게 하는지 모르는 부분이 다른 화면에서 값을 어떻게 서로 넘겨 받는지, 그리고 어떻게하면 화면이 실시간으로 변하면서 사용자가 추가, 수정, 삭제가 됐는지 확인할 수 있는지이다.

    인터넷에서 찾은 예제를 따라한 모습이다. 큰 흐름은 메인 화면에서 수정 버튼을 누르면 두번째 화면인 수정 화면으로 넘어가고, 수정 화면에서 textField에 값을 입력 후 완료 버튼을 누르면 다시 메인 화면으로 넘어가고 textField에 입력한 값이 메인 화면의 textField로 넘어가는 식이다. 물론 메인 화면의 textField값도 수정 화면의 textField로 넘어갈 수 있다.

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            let editViewController = segue.destination as! EditViewController
            editViewController.textField.text = "Hello, World!"
            editViewController.delegate = self
        }
        
        func didMessageEditDone(_ controller: EditViewController, message: String) {
            textField.text = message
        }

    첫번째 뷰컨트롤러에 다음과 같은 코드를 썼는데, 첫번째 화면에서 두번째 화면으로 전환할때 segue를 사용하여 데이터를 전달하고 두번째 화면이 완료된 후 다시 첫번째 화면으로 데이터를 전달 받는 코드이다. segue.destination~ 부분은 화면 전환을 해 이동할 두번째 뷰 컨트롤러(EditViewController)를 가리킨다.

    as! 는 segue.destination을 EditViewController 타입으로 강제 캐스팅해 두번째 화면의 속성과 메서드를 접근 할 수 있게 하는 것이고 강제 캐스팅이기에 만약 EditViewController가 아닌 다른 뷰컨트롤러일 경우 에러가 발생한다고 한다.

    editViewController.textField.text 부분은 두번째 화면의 textField에 직접 접근해 문자열을 설정하려고 작성한 코드이다. 그런데 두번째 화면에 textField가 초기화 되지 않았을 수 있어서 안전하지 않다고 한다. 따라서 직접 접근하지 말고 전달할 데이터를 저장할 별도의 변수를 두는 것이 좋다고 한다. 이번 코드에선 두번째 화면에 textFieldValue라고 빈 String 프로퍼티를 선언해놨으니 editView.Controller.textFieldValue.text로 바꾸면 되는 것 같은데 확실하지 않다.

    delegate = self 부분은 두번째 화면의 delegate 속성에 첫번째 화면을 할당하는 부분이고 self는 첫번째 화면의 뷰컨트롤러 자신을 가리킨다.

    protocol EditDelegate {
        func didMessageEditDone(_ controller: EditViewController, message: String)
    }

    첫번째 뷰컨트롤러에 다음과 같이 EditDelegate프로토콜을 채택해놨기 때문에 두번째 화면에서 delegate를 통해 첫번째 화면의 메서드나 속성들에 접근해 호출할 수 있다.

    func didMessageEditDone~ 부분은 두번째 화면에서 첫번째 화면으로 데이터를 전달할 때 사용된다. 두번째 화면이 종료될 때 값을 전달받아 처리하는 부분이다.

    쭉 나열하니 조금 어려운데 요약하자면 prepare 메서드는 첫번째 화면에서 두번째 화면으로 넘어갈때 두번째 화면으로 데이터를 전달하고, didMessageEditDone 메서드는 두번째 화면에서 첫번째 화면으로 돌아갈때 두번째 화면에서 입력한 값을 첫번째 화면으로 전달받아 해당 값을 텍스트 필드에 설정하는 부분이다.


    아직 예제의 시작부분인데 생각보다 이해 안되는 개념이 많아서 조금 오래 걸렸다. 아직도 확실히 이해한 건 아닌 것 같은게, 지금까지 한 부분만 해도 시뮬레이터에서 화면 전환을 테스트 해볼 수 있는듯 한데 에러가 나서 확인도 못해본 상태이다.. 첫번째 화면에서 두번째 화면으로 , 두번째 화면에서 다시 첫번째 화면으로 데이터가 전달되는 부분이 아직도 헷갈리는 상태이다. 그리고 프로토콜이라든가 delegate가 아직 정확히 뭔지 모르겠어서 더 공부 해야되는 부분이 많다..

    'iOS 앱 개발 부트캠프 > TIL' 카테고리의 다른 글

    TIL 14일차 - 네비게이션 컨트롤러와 테이블뷰  (1) 2024.10.02
    TIL 13일차  (2) 2024.09.30
    TIL 11일차  (1) 2024.09.26
    TIL 10일차  (1) 2024.09.25
    TIL 9일차 - 성적 관리 시스템2  (0) 2024.09.24
Designed by Tistory.