[iOS] 내비게이션 컨트롤러 이용하기

!·2022년 8월 28일
0

iOS

목록 보기
13/22


기능

  1. Edit 버튼이나, 수정 버튼을 클릭하면 수정화면으로 이동하며, 레이블에 어떤 버튼을 클릭했는지 표시한다.
  2. 스위치를 끈 상태로 완료 버튼을 클릭시 메인화면의 전구가 꺼지며, 그 반대도 마찬가지이다.

코드

import UIKit

class ViewController: UIViewController, EditDelegate{
    
    func didMessageEditDone(message: String) {
        self.message = message
        textField.text = self.message
    }
    
    func didLampSwitchToggled(isOn: Bool) {
        if isOn {
            imageView.image = lampOnImage
            isSwitchOn = isOn
        }else{
            imageView.image = lmapOffImage
            isSwitchOn = isOn
        }
    }
    
    
    let lampOnImage = UIImage(named: "lamp_on")
    let lmapOffImage = UIImage(named: "lamp_off")
    
    var isSwitchOn = true
    var message = ""
    
    @IBOutlet var imageView: UIImageView!
    @IBOutlet var textField: UITextField!
    
    override func viewDidLoad(){
        super.viewDidLoad()
        imageView.image = lampOnImage
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let editViewController = segue.destination as! EditViewController
        if segue.identifier == "barButtonSegue"{
            editViewController.labelText = "bar Button Segue"
            editViewController.textField?.text? = textField.text!
            editViewController.isSwitchOn = self.isSwitchOn
            editViewController.delegate = self
        }else if segue.identifier == "buttonSegue"{
            editViewController.labelText = "button Segue"
            editViewController.textField?.text? = textField.text!
            editViewController.isSwitchOn = self.isSwitchOn
            editViewController.delegate = self
        }
    }
}
import UIKit

protocol EditDelegate{
    func didMessageEditDone(message: String)
    func didLampSwitchToggled(isOn: Bool)
}
class EditViewController: UIViewController {

    var isSwitchOn = true
    var labelText = ""
    var delegate: EditDelegate?
    
    @IBOutlet var segueLabel: UILabel!
    @IBOutlet var switchLabel: UILabel!
    @IBOutlet var textField: UITextField!
    @IBOutlet var switchValue: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        segueLabel.text = labelText
        switchValue.isOn = isSwitchOn
        // Do any additional setup after loading the view.
    }
    
    @IBAction func onOffSwitch(_ sender: UISwitch) {
        isSwitchOn = switchValue.isOn
    }
    
    @IBAction func touchUpDoneButton(_ sender: UIButton) {
        if delegate != nil{
            delegate?.didMessageEditDone(message: textField.text!)
            delegate?.didLampSwitchToggled(isOn: isSwitchOn)
        }
        navigationController?.popViewController(animated: true)
    }
}
  • delegate 디자인 패턴을 이용하여 뷰 컨트롤 간의 데이터를 전달하고 있다.
  • 네비게이션 컨트롤러에서 새로운 뷰가 열리는 경우에는 viewDidLoad() 함수가 호출되며, prepare 함수로 데이터를 전달할 수 있다.
  • 뷰 컨트롤러를 해제할때는 navigationController?.popViewController(animated: true) 함수를 활용할 수 있다.
profile
개발자 지망생

0개의 댓글