스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

5. 스파르타 코딩 클럽 - 네비게이션 및 화면 전환해보기

seongpil Heo 2025. 3. 5. 21:17

1. 네비게이션 및 화면 전환

- 하나 이상의 화면

  • 하나의 화면을 그리고 나면 화면 이동을 고민하게 됩니다
  • 그중에 상세 페이지로 갔던 경험 있으신가요?
  • 여러 개의 화면을 만들어 놓고 이동하는 방법

segue

Ctrl + 드래그

네비게이션

  • 우리가 어디로 가야 할지 알려주는 장치입니다
  • 이동을 도와주기 때문에 사용자는 길을 잃지 않습니다
  • 자동으로 뒤로 가기 버튼이 생깁니다
  • 복잡한 코딩 없이 드래그 앤 드롭으로 길을 만들어봅시다

    네비게이션 컨트롤러

   

    스토리보드


[ 미션 문제 1 ]

네비게이션 바를 추가하고, "다음 화면으로" 버튼을 눌렀을 때 새로운 화면으로 이동하게 구현하세요. 이동한 화면에서 "뒤로" 버튼으로 원래 화면으로 돌아오도록 하세요.


[ 미션 문제 2 ]

배열에 3가지 과일 이름을 저장하고, 테이블 뷰에 그 배열의 내용을 표시하세요. 새로운 과일을 추가할 수 있도록 입력 필드를 추가하고, 추가된 과일이 테이블 뷰에 반영되도록 만드세요.

 

[먼저 배열에 3가지 과일 이름을 저장하고, 테이블 뷰에 그 배열의 내용을 표시하세요]를 먼저 해결해 보자

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myTableView: UITableView!
    
    var fruits: [String] = ["Apple", "Banana", "Grape"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.delegate = self
        myTableView.dataSource = self
    }

    
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fruits.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = myTableView.dequeueReusableCell(withIdentifier: "MyFirstCell", for: indexPath)
            cell.textLabel?.text = fruits[indexPath.row]
            return cell
    }
    
    
}

 

 

[ 오류 1 ]

Thread 1: "unable to dequeue a cell with identifier MyFirstCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard"

 

해당 오류 메세지를 구글에 검색해 본 결과 withIdentifier에 입력한 MyFirstCell을 찾을 수 없어서 발생한 오류로 보임

 

분명 강의 영상에서 보고 따라서 잘 입력했는데 하며 Table View Cell의 Identifier를 확인하는 순간

 

역시 그럼 그렇지 오타 발견...

 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = myTableView.dequeueReusableCell(withIdentifier: "MyFirstCell", for: indexPath)
            cell.textLabel?.text = fruits[indexPath.row]
            return cell
    }

 

myFirstCell을 MyFirstCell로 변경하니 오류 없이 빌드 성공!

 

 

이제 다음 과제인 [새로운 과일을 추가할 수 있도록 입력 필드를 추가하고, 추가된 과일이 테이블 뷰에 반영되도록 만드세요]를 해결해 보자

 

TextField와 Button을 스토리보드에서 추가하고 IBOutlet 연결을 했다

	// TextField와 Button을 IBOutlet 선언
	@IBOutlet weak var textField: UITextField! 
    @IBOutlet weak var appendButton: UIButton!

	// 버튼 클릭시 동작될 부분을 구현
	@IBAction func appendButtonClick(_ sender: Any) {
        
    }

 

강의 영상에서는 입력 필드를 받고 그 받은 데이터를 배열에 추가했던 방법을 아직 배우지 않아서 구글링을 해봤다

배열의 추가는 배열이름.append() 함수를 이용하는데 코드로 작성하면 아래와 같다

 

@IBAction func appendButtonClick(_ sender: Any) {
        fruits.append(String(self.textField.text!)) // 사용자 입력 값 받아서 배열에 저장
        self.textField.text = "" // 사용자가 입력하는 TextField를 공백으로 비움
        self.myTableView.reloadData() // 테이블 뷰 새로고침
    }

 

사용자 입력 값을 받아서 버튼을 누르면 배열에 추가하고 입력했던 TextField는 공백으로 비워준다

그 후 테이블 뷰에 새로 받은 데이터를 보여주기 위해 reloadData() 함수를 사용하여 새로고침 해준다

 

[실행 화면]