궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Udemy iOS

[Udemy] 섹션12: stepper, textField, segue 더치페이 계산기

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

 

레이블 연결

1. @IBOutlet으로 아래의 Label들을 연결해준다.

2. @IBAction도 연결해준다.

ResultsVC에 IBAction 및 IBOutlet 생성

1. Cocoa Touch 파일 생성 > ResultsViewController 라고 부르고 UIViewController 의 서브클래스로 지정.

2. Main.storyboardResultsViewController를 연결시킴

3. ResultsVCIBOutlet 및 IBAction을 연결

버튼 toggle 활성화

isSelected라는 속성을 사용하여 버튼에 배경이 있고 선택된 것처럼 보이게 할 수 있다. 

    @IBAction func tipChanged(_ sender: UIButton) {
        
        //버튼을 false 상태로 지정
        zeroPctBtn.isSelected = false
        tenPctBtn.isSelected = false
        twentyPctBtn.isSelected = false
        
        // 선택된 sender만 true로 바뀜
        sender.isSelected = true
    }

백분율 소수로 변경

20% 버튼을 탭하면 20% 가 출력되고, 계산 버튼을 탭 하면 콘솔에 0.2가 출력될 수 있게 해 준다.

  var tip = 0.1
  
    @IBAction func tipChanged(_ sender: UIButton) {
        
        let buttonTitle = sender.currentTitle!
        // 🔥 buttonTitle의 문자에서 제일 마지막 문자를 삭제한다. ( dropLast(n) 메서드 )
        let removeSymbolFromTitle = String(buttonTitle.dropLast())
        // 문자열을 Double로 변경
        let buttonTitleAsANumber = Double(removeSymbolFromTitle)!
        // buttonTitleAsANumber 을 100으로 나눠 소수점으로 표시되게 함
        tip = buttonTitleAsANumber / 100
    }

TIP
 
 

dropLast(n:) 메서드를 사용하면 문자의 마지막 부분을 탈락시키는 효과를 사용할 수 있다.

Stepper

Stepper+ 또는 - 를 클릭하면 splitNumberLabel가 업데이트되도록 해준다. 

    @IBOutlet weak var splitNumLabel: UILabel!
    
    @IBAction func stepperValueChanged(_ sender: UIStepper) {
        splitNumLabel.text = String(format: "%.0f", sender.value)
        persentageValue = Int(sender.value)
    }

TextField

1. textField에 입력한 값을 출력하고 이것을 정수로 바꿔줌.

2. keyboardnumberpad 스타일로 지정함. keyboardType = .numberPad 메서드

3. percent를 클릭했을 때 키보드가 닫힐 수 있게 구현한다. endEditing(true) 메서드

@IBOutlet weak var billTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        billTextField.keyboardType = .numberPad
    }
    
    @IBAction func tipChanged(_ sender: UIButton) {
    //textField
    billTextField.endEditing(true)
    
    }
    
    @IBAction func calculatePressed(_ sender: UIButton) {
        let bill = billTextField.text!
        // bill이 empty가 아니라면 실행
        if bill != "" {
            //String타입의 bill을 Double타입으로 변경
            billTotal = Double(bill)!
            
            // 총 값에 터치페이 하기 때문에 1을 더한 팁을 곱한 후 인원수로 나눈다.
            let result = billTotal * (1 + tip) / Double(persentageValue)
            let resultTo2DecimalPalces = String(format: "%.2f", result)
            totalValue = resultTo2DecimalPalces
            print(resultTo2DecimalPalces)
        }
        performSegue(withIdentifier: "goToResult", sender: nil)
    }

결과를 ResultVC로 전달 - Segue

1. CalculatorVCResultsVC 사이에 "Present Modally" segue로 이어준다.

2. 계산 버튼을 누르면 segue가 트리거 되고 화면이 ResultsViewController로 전환된다.

3. ResultsViewController에서 다시 계산 버튼을 누르면 이전 CalculateViewControllerdismiss 된다.

//  CalculateViewController.swift

import UIKit

class CalculatorViewController: UIViewController {
    
    @IBOutlet weak var billTextField: UITextField!
    @IBOutlet weak var zeroPctBtn: UIButton!
    @IBOutlet weak var tenPctBtn: UIButton!
    @IBOutlet weak var twentyPctBtn: UIButton!
    @IBOutlet weak var splitNumLabel: UILabel!
    
    var tip = 0.1
    var persentageValue = 2
    var billTotal = 0.0
    var totalValue: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        billTextField.keyboardType = .numberPad
        billTextField.endEditing(true)
    }
    
    @IBAction func tipChanged(_ sender: UIButton) {
        //textField
        billTextField.endEditing(true)
        
        //버튼을 false 상태로 지정
        zeroPctBtn.isSelected = false
        tenPctBtn.isSelected = false
        twentyPctBtn.isSelected = false
        
        // 선택된 sender만 true로 바뀜
        sender.isSelected = true
        
        let buttonTitle = sender.currentTitle!
        // 🔥 buttonTitle의 문자에서 제일 마지막 문자를 삭제한다. ( dropLast(n) 메서드 )
        let removeSymbolFromTitle = String(buttonTitle.dropLast())
        // 문자열을 Double로 변경
        let buttonTitleAsANumber = Double(removeSymbolFromTitle)!
        // buttonTitleAsANumber 을 100으로 나눠 소수점으로 표시되게 함
        tip = buttonTitleAsANumber / 100

    }
    
    @IBAction func stepperValueChanged(_ sender: UIStepper) {
        splitNumLabel.text = String(format: "%.0f", sender.value)
        persentageValue = Int(sender.value)
    }
    
    @IBAction func calculatePressed(_ sender: UIButton) {
        let bill = billTextField.text!
        
        if bill != "" {
            billTotal = Double(bill)!
            
            // 총 값에 터치페이 하기 때문에 1을 더한 팁을 곱한 후 인원수로 나눈다.
            let result = billTotal * (1 + tip) / Double(persentageValue)
            let resultTo2DecimalPalces = String(format: "%.2f", result)
            totalValue = resultTo2DecimalPalces
            print(resultTo2DecimalPalces)
        }
        performSegue(withIdentifier: "goToResult", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToResult" {
            let destination = segue.destination as! ResultViewController
            destination.totalValue = totalValue
            destination.tip = Int(tip * 100)
            destination.split = persentageValue
        }
    }
}
//  ResultViewController.swift

import UIKit

class ResultViewController: UIViewController {

    @IBOutlet weak var totalLabel: UILabel!
    @IBOutlet weak var settingLabel: UILabel!
    
    var totalValue: String?
    var tip = 0
    var split = 0
  
    override func viewDidLoad() {
        super.viewDidLoad()

        totalLabel.text = totalValue
        settingLabel.text = "\(tip)%의 팁으로 \(split)명의 사람들과 더치페이 합니다."
    }
    
    @IBAction func reCalcultatePressed(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)      
    }
}

완성 파일

Tipsy.zip
0.22MB


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.