iOS 앱 개발 부트캠프/TIL

TIL 13일차

iosstudyletsgo 2024. 9. 30. 18:07

네비게이션 컨트롤러를 연습하는데 아무래도 긴 예제를 한번에 따라가려니 무슨 코드인지도 헷갈리고 에러도 많아 해결이 안돼서 처음부터 차근차근 다시 하기로 했다. 첫번째 화면에 텍스트필드와 버튼을 넣고, 두번째 화면에서 라벨을 넣어 데이터를 두번째 화면에 넘어가는지부터 확인할 것이다.

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var dataTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    @IBAction func goToSecondScreen(_ sender: UIButton) {
        //segue를 통해 두번째 화면으로 이동
        performSegue(withIdentifier: "goToSecondVC", sender: self)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToSecondVC" {
            let destinationVC = segue.destination as! SecondViewController
            //두 번째 화면에 데이터를 전달
            destinationVC.receivedData = dataTextField.text
        }
    }

}

첫 번째 뷰컨트롤러엔 다음과 같이 코드를 작성하였다.

텍스트 필드에 값을 입력하고 버튼을 누르면 IBAction으로 연결된 goToSecondScreen 메서드가 동작할 것이다. performSegue는 지정된 Segue 식별자를 사용해 스토리보드에서 정의된 Segue를 실행한다. 내가 지정한 식별자는 goToSecondVC이기 때문에 withIdentifier: "goToSecondVC"로 작성하였다.

override func prepare은 Segue가 실행되기 전 호출되는 메서드인데 여기서 두번째 화면으로 데이터를 전달한다. segue.identifier를 확인해 어떤 segue가 실행될지 판단하고, 두번째 화면인 SecondViewController로 캐스팅한다. let detinationVC ~ 부분은 현재 segue가 이동하려는 목적지 뷰 컨트롤러를 가져와서 그것은 SecondViewController로 캐스팅하여 destinationVC 라는 변수에 할당하는 것이다.

이후 destinationVC를 통해 SecondViewController의 속성이나 메서드에 접근할 수 있기 때문에 뒤에 나오는 destinationVC.receivedData~ 부분을 통해 첫번째 화면에서 입력된 텍스트를 두번째 화면으로 전달할 수 있다.

import UIKit

class SecondViewController: UIViewController {
    
    var receivedData: String?
    
    @IBOutlet weak var receivedDataLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //첫번째 화면에서 전달받은 데이터를 라벨에 표시
        if let data = receivedData {
            receivedDataLabel.text = data
        } else {
            receivedDataLabel.text = "No data received"
        }
    }

}

두번째 화면은 다음과 같이 작성하였다. 데이터를 전달받아 라벨에 출력만 하기 때문에 일단은 간단하게 작성하였다.  

if let data와 else 부분은 receivedData가 nil이 아닐 경우에만 언래핑하여 사용하는 구문이고, data라는 변수를 만들어 안전하게 가져온 데이터를 저장해 label에 출력하는 내용이다.

다음에는 두번째 화면에서 다시 첫번째 화면으로 값을 넘기는 것을 하고 싶었다.

코드를 다음과 같이 수정하였다. 첫번째 뷰컨트롤러에는 Delegate에 대한 부분들을 추가하였고, 두번째 화면에선 protocol과 데이터를 첫번째 화면에 되돌려줄 pop 부분을 추가하였다.

테스트 해보니 첫번째 화면에서 두번째 화면으로는 잘 넘어갔는데, 두번째 화면에서 첫번째 화면으로 넘어가질 않았다. 찾아보니 이럴 때 확인해야 할 문제는 delegate를 설정하는 코드 작성이 잘못 되었거나, 버튼의 Outlet 연결이나 Action이 잘못 연결 되어 있으면 그렇다고 한다.

확인해보니 두번째 화면에서 버튼에서 연결해야할 IBAction을 텍스트 필드에 연결하여 생긴 문제였다. 다시 연결을 설정해 동작시켜보니 두번째 화면에서도 첫번째 화면으로 데이터가 잘 넘어온 것을 확인하였다.


매우 간단한 예제로 연습해보니 delgate나 pop, protocol의 사용법이 조금은 감이 잡히는듯 하다. 다음엔 여기에 테이블 뷰로 값이 실시간으로 업데이트 되는 화면을 구성해보려고 한다.

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

TIL 15일차 - 뷰컨트롤러와 프로토콜  (0) 2024.10.04
TIL 14일차 - 네비게이션 컨트롤러와 테이블뷰  (1) 2024.10.02
TIL 12일차  (2) 2024.09.27
TIL 11일차  (1) 2024.09.26
TIL 10일차  (1) 2024.09.25