Alert 앱에 아웃렛 변수와 액션 함수 추가하기

Posted on 2021-09-04 by GKSRUDTN99
Swift&Xcode Xcode Alert

Image View와 Button의 아웃렛 변수 및 액션함수 추가하기

1. Assistant를 열어 Image View에 대한 아웃렛 변수를 추가한다.
  • Connection: Outlet
  • Name: lampImg
  • Type: UIImageView
2. 켜기 Button에 액션 함수 추가하기
  • Connection: Action
  • Name: btnLampOn
  • Type: UIButton
3. 끄기 Button에 대한 액션 함수 추가하기
  • Connection: Action
  • Name: btnLampOff
  • Type: UIButton
4. 제거 Button에 대한 액션 함수 추가하기
  • Connection: Action
  • Name: btnLampRemove
  • Type: UIButton
//
//  ViewController.swift
//  Alert
//
//  Created by 한경수 on 2021/09/04.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet var lampImg: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


    @IBAction func btnLampOn(_ sender: UIButton) {
    }

    @IBAction func btnLampOff(_ sender: UIButton) {
    }

    @IBAction func btnLampRemove(_ sender: UIButton) {
    }
}

전구 켜기를 코드로 구현하기

1. ViewController.swift를 열고 코딩에 필요한 상수들과 변수들을 클래스 내에 선언한다.
class ViewController: UIViewController {

    let imgOn = UIImage(named: "lamp-on.png")
    let imgOff = UIImage(named: "lamp-off.png")
    let imgRemove = UIImage(named: "lamp-remove.png")

    var isLampOn = true

//  (... 생략 ...)  
2. 이미지 보여주기
  • 앱을 처음 시작할 때 전구가 켜저 있는 이미지를 보여주기 위해 viewDidLoad 함수 내에서 lampImg 객체에 imgOn을 대입한다.
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        lampImg.image = imgOn
    }
3. 켜기 Button 클릭 시 동작하는 함수 코딩하기
@IBAction func btnLampOn(_ sender: UIButton) {
        if(isLampOn == true){
            // UIAlertController 생성
            let lampOnAlert = UIAlertController(title: "경고", message: "현재 On 상태입니다", preferredStyle: UIAlertController.Style.alert)

            // UIAlertAction 생성(특별한 동작이 없으므로, handler는 nil로 설정)
            let onAction = UIAlertAction(title: "네, 알겠습니다.", style: UIAlertAction.Style.default, handler: nil)

            // 생성된 onAction은 Alert에 추가
            lampOnAlert.addAction(onAction)

            // present 메서드 실행
            present(lampOnAlert, animated: true, completion: nil)
        }
        else{
            lampImg.image = imgOn
            isLampOn = true
        }
    }
  • present 함수는 다음 세 가지 파라미터를 받아 실행되는 함수이다.
    • viewControllerToPresent : 나타낼 UIViewController 객체를 전달한다.
    • flag : animation 효과를 사용할 것인지 Bool 값을 전달한다.
    • completion : present가 끝난 후, 실행할 함수나 클로저를 전달한다.
4. 끄기 Button 클릭 시 동작하는 함수 코딩하기
@IBAction func btnLampOff(_ sender: UIButton) {
        if isLampOn {
            let lampOffAlert = UIAlertController(title: "램프 끄기", message: "램프를 끄시겠습니까?", preferredStyle: UIAlertController.Style.alert)

            let OffAction = UIAlertAction(title: "네", style: UIAlertAction.Style.default, handler: {
                ACTION in self.lampImg.image = self.imgOff
                self.isLampOn = false
            })
            let cancelAction = UIAlertAction(title: "아니오", style: UIAlertAction.Style.default, handler: nil)

            lampOffAlert.addAction(OffAction)
            lampOffAlert.addAction(cancelAction)

            present(lampOffAlert, animated: true, completion: nil)
        }
    }
  • OffAction을 정의할 때, 익명 함수를 사용한 것을 확인할 수 있다.
ACTION in
self.lampImg.image = self.imgOff
self.isLampOn = false
  • 위 형태는 파라미터 타입과 리턴 타입을 생략한 익명함수의 한 형태이다.
  • ACTION 이라는 매개변수를 받아 아래 두 줄을 실행한다.
5. 전구 제거 Button 코드 추가하기
@IBAction func btnLampRemove(_ sender: UIButton) {
        let lampRemoveAlert = UIAlertController(title: "램프 제거", message: "램프를 제거하시겠습니까?", preferredStyle: UIAlertController.Style.alert)

        let offAction = UIAlertAction(title: "아니오, 끕니다", style: UIAlertAction.Style.default, handler: {
            ACTION in
            self.lampImg.image = self.imgOff
            self.isLampOn = false
        })

        let onAction = UIAlertAction(title: "아니오, 켭니다", style: UIAlertAction.Style.default, handler: {
            ACTION in
            self.lampImg.image = self.imgOn
            self.isLampOn = true
        })

        let removeAction = UIAlertAction(title: "네, 제거합니다", style: UIAlertAction.Style.destructive, handler: {
            ACTION in
            self.lampImg.image = self.imgRemove
            self.isLampOn = false
        })
        lampRemoveAlert.addAction(offAction)
        lampRemoveAlert.addAction(onAction)
        lampRemoveAlert.addAction(removeAction)
        present(lampRemoveAlert, animated: true, completion: nil)
    }