[IOS] Do it(10) Navigation App 구현 - 뷰 전환과 정보 전달하기

728x90

Navigation App 구현 하기


네비게이션 컨트롤러 앱을 구현하였습니다.
동작 화면은 '메인화면'과 '수정화면'이며 
메인화면/수정화면 에서 입력한 message를 그대로 전달 & 버튼을 이용한 이미지 전환 및 사이즈 조절을 구현하였습니다.

결과 화면

텍스트 정보 전달
전구의 On/Off 조작(Switch)
전구 크기 조절(확대/축소)


코드 & 설명


ViewController - 메인화면

import UIKit

class ViewController: UIViewController, EditDelegate {

    // 전구 이미지
    let imgOn = UIImage(named: "lamp_on.png")
    let imgOff = UIImage(named: "lamp_off.png")

    var isOn = true
    var isZoom = false
    var orgZoom = false

    //메인화면 -> 수정화면 데이터 전달
    @IBOutlet var txMessage: UITextField!
    @IBOutlet var imgView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        imgView.image = imgOn
    }
    //prepare 함수 : 해당 세그웨이가 해당 뷰컨트롤러로 전환되기 직전에 호출되는 함수이며 데이터 전달을 위해 사용된다
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let editViewController = segue.destination as! EditViewController
        if segue.identifier == "editButton" { //버튼을 클릭 한 경우
            editViewController.textWayValue = "segue : use button"
        }else if segue.identifier == "editBarButton"{ //바 버튼을 클릭한 경우
            editViewController.textWayValue = "segue : use Bar button"
        }
        editViewController.textMessage = txMessage.text! // 메인화면의 데이터 -> 수정화면으로 전달
        editViewController.isOn = isOn // '수정화면'의 isOn에 '메인화면'의 상태를 전달
        editViewController.isZoom = orgZoom
        editViewController.delegate = self
    }
    func didMessageEditDone(_ controller: EditViewController, message: String) {
        txMessage.text = message
    }
    //'수정화면'의 스위치 값을 '메인화면'에 전달하여 켜진 전구 또는 꺼진 전구를 보여준다
    func didImageOnOffDone(_ controller: EditViewController, isOn: Bool) {
        if isOn {
            imgView.image = imgOn
            self.isOn = true
        } else {
            imgView.image = imgOff
            self.isOn = false
        }
    }

    func didImageZoomDone(_ controller: EditViewController, isZoom: Bool) {
        let scale: CGFloat = 2.0
        var newWide: CGFloat, newHeight: CGFloat

        if isZoom {
            if orgZoom {

            } else {
                self.isZoom = false
                self.orgZoom = true
                newWide = imgView.frame.width*scale
                newHeight = imgView.frame.height*scale
                imgView.frame.size = CGSize(width: newWide, height: newHeight)
            }

            print("Zoom: true")
        } else {
            if orgZoom {
                self.isZoom = true
                self.orgZoom = false
                newWide = imgView.frame.width/scale
                newHeight = imgView.frame.height/scale
                imgView.frame.size = CGSize(width: newWide, height: newHeight)
            } else {

            }

            print("Zoom: false")
        }

    }
}

EditViewController - 수정 화면



import UIKit

protocol EditDelegate {
    func didMessageEditDone(_ controller: EditViewController, message: String)
    func didImageOnOffDone(_ controller: EditViewController, isOn: Bool) //'수정화면'의 스위치 상태를 '메인화면'으로 보내기 위한 델리게이트에 추가
    func didImageZoomDone(_ controller: EditViewController, isZoom: Bool)
}

class EditViewController: UIViewController {
    //Do any additional setup after

    //레이블의 텍스트를 직접 제어할 수 없기 때문에 문자열 변수 만든다 , 그리고 viewDidLoad 함수에서 변수 textWayValue값을 레이블의 텍스트로 대입하여 레이블에 출력 되게 한다
    var textWayValue: String = "" //'수정화면에서' 직접 텍스트 필드의 텍스트 제어 할 수 없기 때문에 문자열 만든다
    var textMessage: String = ""
    var delegate: EditDelegate? //delegate 변수 생성
    var isOn = false //수정화면에서 직접 제어 할 수 없기 때문에 변수 isOn 만든다
    var isZoom = false

    @IBOutlet var txMessage: UITextField!
    @IBOutlet var lblWay: UILabel!
    @IBOutlet var swIsOn: UISwitch!
    @IBOutlet var btnResize: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

    // Do any additional setup after loading the view.
        lblWay.text = textWayValue
        txMessage.text = textMessage
        swIsOn.isOn = isOn //변수 isOn값 스위치에 On 대입해서 꺼져 있는 모습

        if isZoom {
            btnResize.setTitle("축소", for: UIControl.State())
        } else {
            btnResize.setTitle("확대", for: UIControl.State())
        }
    }

    //'수정화면'의 btnDone함수에서 didMessageEditDone을 호추하면서 '수정화면'의 텍스트 필드 내용을 메시지 문자열로 전달(수정화면 -> 메인) 데이터 이동
    // btnDone(완료) 버튼 누르면 수정화면의 스위치 상태를 isOn으로 전달한다. 즉 , '수정화면의' 스위치 상태를 '메인화면'으로 전달
    @IBAction func btnDone(_ sender: UIButton)
    {
        if delegate != nil {
            delegate?.didMessageEditDone(self, message: txMessage.text!)
            delegate?.didImageOnOffDone(self, isOn: isOn)
            delegate?.didImageZoomDone(self, isZoom: isZoom)
        }
        _ = navigationController?.popViewController(animated: true)
    }
    // 전구를 제어하기위한 함수
    // 스위치 함수
    @IBAction func swImageOnOff(_ sender: UISwitch) {
        if sender.isOn {
            isOn = true
        } else {
            isOn = false
        }
    }
    @IBAction func btnResizeImage(_ sender: UIButton) {
        if isZoom {
            isZoom = false
            btnResize.setTitle("확대", for: UIControl.State())
        } else {
            isZoom = true
            btnResize.setTitle("축소", for: UIControl.State())
        }
    }

}

전체 코드

Navigation.zip
0.73MB


출처 : Do it 스위프트로 앱 만들기

728x90

댓글

Designed by JB FACTORY