상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Swift와 iPhone/iPhone App

아이폰 앱 개발 기초, 데이터 전달하면서 화면전환하기

월터제이(Walter J) 2021. 4. 11. 06:00

데이터 전달하면서 화면전환하기

  모바일 앱은 최소 단일 화면 하나만으로 구성되어 있는 앱도 있지만 대부분 여러개의 화면이 있다. 때에 따라서는 다음 화면으로 데이터를 넘겨줘야 할 때도 있다. 가장 대표적인 방법은 스토리보드(Storyboard)로 연결된 세그웨이(Segue)를 통해서 데이터를 전달하는 방법이다. 

  이 예제는 간단하게 각 버튼을 터치했을 때, 다른 화면으로 각기 다른 데이터가 전달되어 표시되는 앱이다.

 

#목차

(각 목차를 클릭하면 해당 내용을 바로 볼 수 있습니다.)

 

 

개발 환경

언어 : 스위프트 4 (Swift 4)

IDE : Xcode 12.2

 

 

Xcode 프로젝트에 이미지 넣기

   이미지를 표시하고 싶다면 이미지를 프로젝트에 넣어야 한다. 나는 연예인 3명의 이미지를 보여줄 생각이다. Assets.xcassets 에 이미지를 아래와 같이 넣어주면 된다.

 

 

스토리보드(Storyboard)에 뷰 컨트롤러 배치하기

  스토리보드(Storyboard)에 두 개의 뷰 컨트롤러를 배치한다. 화살표가 있는 왼쪽 화면이 첫 화면이며 각 버튼을 터치할 때마다 그에 해당하는 연예인의 이름과 이미지가 오른쪽 화면에 나타날 것이다.

  각각의 뷰 컨트롤러는 각각의 컨트롤러.swift 파일과 연결된다.

 

 

세그웨이(Segue) 연결하기

  뷰에서 직접 세그웨이(Segue)를 연결할 수도 있지만 이 예제와 같이 3개의 버튼을 연결해야 한다면, 한번에 연결하는 방법이 있다.

 

  위와 같이 컨트롤(Ctrl) + 드래그로 다른화면을 연결할 수 있다.

  이 예제에서는 Present Modaliy 를 선택했다.

 

  그럼 두 화면을 연결하는 화살표가 생기는데, 이 화살표를 클릭해서 인스펙터의 Identifier 의 이름을 설정한다. 이제 각 버튼들은 이 화살표를 통해서, 이 Identifier를 통해서 분기처리하게 된다.

 

반응형

 

뷰(View)를 코드와 연결하기

  각 버튼의 터치 이벤트를 담당할 함수를 만든다. 연결된 컨트롤러.swift에 컨트롤(Ctrl) + 마우스 드래그로 만들 수 있다.

 

이 예제에서는 3개의 버튼을 만들었기 때문에 총 3개의 함수를 만들어 주었다.

 

 

코딩1 : 데이터 보내기

  버튼이 있는 첫 번째 컨트롤러.swift를 열어 아래와 같이 작성했다. performSegue(withIdentifier: String, sender: Any)는 세그웨이(Segue)로 연결된 뷰 컨트롤러(View Controller) 를 호출하겠다는 의미다. 이때, 센더(sender)의 값으로 데이터를 넘겨준다.

/* ViewController.swift */

class ViewController: UIViewController {
    
    //이미지 파일명과 같은 이름으로 배열 생성
    let names = ["han", "bo", "iu"]

    override func viewDidLoad() {
        ...
    }
    //각 버튼마다 names배열 값을 다르게 전달한다.
    @IBAction func showHanJimin(_ sender: Any) {
        performSegue(withIdentifier: "show", sender: names[0])
    }

    @IBAction func showPackBoYeong(_ sender: Any) {
        performSegue(withIdentifier: "show", sender: names[1])
    }
    
    @IBAction func showIU(_ sender: Any) {
        performSegue(withIdentifier: "show", sender: names[2])
    }
}

 

  이 방식으로 데이터를 전달하기 위해서는 prepare() 라는 함수를 하나 더 오버라이드해야 한다. 위 코드가 세그웨이(Segue)로 연결된 뷰 컨트롤러(View Controller)를 호출하는 작업이었다면, 아래 코드가 데이터를 전달하는 실제적인 부분이다.

  스토리보드(Storyboard)에서 설정해준 화살표의 Identifier 이름이 맞다면 데이터를 전달할 것이다.

//====== 데이터를 전달하는 메서드 =====//
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "show" {
        let profileView = segue.destination as? ProfileImgView
        if let fileName = sender as? String {
            profileView?.name = fileName
        }
    }
}

 

 

코딩2 : 데이터 받기

  데이터를 보낼때 아래와 같이 작성했었다. 이 코드에서 name이 데이터를 받을 변수명이다.

/* 데이터를 보내는 컨트롤러.swift */
profileView?.name = fileName

 

  이제 데이터를 받는 쪽 코딩을 하면, 역시 각 뷰를 연결하고 데이터를 전달 받을 별도의 변수를 만든다. 그리고 화면이 나타남과 동시에 이름과 이미지가 나타날 수 있도록 ViewDidLoad()에서 각 뷰에 셋팅한다.

/* 데이터를 받는 컨트롤러.swift */
class ProfileImgView: UIViewController {
    
    //LableView 및 ImageView 연결
    @IBOutlet weak var nameLable: UILabel!
    @IBOutlet weak var profileImg: UIImageView!
    
    //데이터를 받을 옵셔널 변수
    var name:String?

    override func viewDidLoad() {
        //옵셔널 변수를 안전하게 열어준다.
        if let name = self.name {
        profileImg.image = UIImage(named: "\(name).png")
        nameLable.text = getHerName(name: name)
    }
}
    
func getHerName(name:String) -> String {
    var herName = ""
    switch name {
    case "han":
        herName = "한지민"
    case "bo" :
        herName = "박보영"
    case "iu" :
        herName = "아이유"
    default :
        herName = ""
    }
        
    return herName
}

 

  이제 앱을 실행해보면 각 버튼마다 다른 이름과 사진이 잘 나타나는 것을 볼 수 있다.

반응형