티스토리 뷰

오늘은 (마지막 시간이 되길 바라는) 마지막 시간,,,

초기화 버튼과 구매하기 버튼을 누르면 alert창이 뜨도록 해볼게욧.

 

[swift] stepper 및 alertController 연습하기 1 (in Code)

[swift] stepper 및 alertController 연습하기 2 (in Code)


 

1. 초기화 버튼 구현

버튼에 touchUpInside 이벤트가 발생하면 alert창이 구현되도록 해야겠죠?

스텝퍼를 구현했던 extension 아래에 써보도록 할게요.

 

이름은 resetBtnTapped입니다.

 

그리고 지난 번에 연습했던 것이 있죠?

alert창! 이 과자 주문을 위해 연습을 했던 거였어요.

 

먼저 UIAlertController의 객체를 alert라는 이름으로 찍어내줍니다.

그리고 타이틀에 들어갈 이름은 "내 지갑", 그 아래 메시지는 "남은 돈은?"을 입력, 그리고 스타일은 alert로  ㄱ ㄱ ㄱ

 

 

 

그리고 alert창에 addTextField 메서드를 사용하여 textFeild를 넣어줄게요.

이때 저는 "가진 돈 입력하기"라는 가이드 메시지가 있었으면 좋겠어서, placeholder도 설정해주었어요!

 

 

 

 

let alert = UIAlertController(title: "내 지갑", message: "남은 돈은?", preferredStyle: .alert)
alert.addTextField { $0.placeholder = "가진 돈 입력하기" }

 

그런 후에는 아래 "입력" 버튼을 만들어줍니다.

입력 버튼을 만드는 건 어렵지 않은데, 우리는 여기에서 textField에 입력되었던 값을 다시 totalPriceLbl에 넣어줘야해요.

그래서 좀 코드가 길어집니다.

고고링

 

 

// "입력" 버튼 만들기 & 버튼 입력 시 발생할 이벤트 
let okAction = UIAlertAction(title: "입력", style: .default) { [weak self] (textField) in 
	//버튼 클릭 시
}

 

 

우선 UIAlertAction의 객체를 okAction라는 이름으로 찍어내주고, 버튼이 눌렸을 때 해야할 일은 handler에서 구현해줄게요.

 

 

UIAlertController에는 쓰인 텍스트필드의 값을 배열로 받아오는 textFields가 있어요.

그래서 사용된 텍스트필드를 인덱스 0, 1, 2... 순서로 저장을 하져.

저는 이번에 하나의 텍스트 필드만 사용했기 때문에 [0]이나 first로 접근할 수 있겠습니다요.

 

 

⭐️그리고 옵셔널 형태이기 때문에 사용을 위해서는 바인딩을 해주어야 해요.

 

우선 alert.textFields를 fieldList라는 상수에 넣구요,

우리가 필요한 첫 번째 값(fieldList.first)을 textField라는 상수에 넣어줍니다!

그러면 이제 바인딩된 안전한 textField가 탄생해요!

//textfield값 바인딩
if let fieldList = alert.textFields {
	if let textField = fieldList.first {
            if let safeData = textField.text {
        	if let safeData2 = Int(safeData) {
            	    let safeNum = numberFormatter.string(for: safeData2)
                    self?.totalPrice.text = safeNum! + "원"
            }
                        
        }
    }
}

그리고 이 값의 text 값을 다시 safeData에,

그리고 이 값을 정수로 바꾸기 위해 다시 safaData2에 넣습니다. 

(아마 더 간단한 방법이 있을텐데,,,저는 초보니까요,,,혹시 있다면 알려주시면 감사하겠어여 ㅠㅠ)

 

그리고 진짜 안전해진 Int 값을 NumberFormatter.string(for:)을 이용해 다시 decimal 형태로 바꿔주고,

마지막으로 totalPrice의 text 값으로 "원"을 붙여서 넣어줍니다!!

 

휴우~!

 

그리고 리셋 버튼을 한 번만 누르진 않겠죠?

 

다시 내 지갑의 예산을 수정하게 되면 가격이 나타나는 모든 레이블들과 스텝퍼 값도 초기화를 해주어야 해요!

아니면 값이 누적되거든요!!

//수량 레이블 "0개"로 초기화
[self?.num1Lbl, self?.num2Lbl, self?.num3Lbl].forEach {
	$0!.text = "0개"
}

//마지막 합계 레이블 초기화
self?.endTotalLbl.text = "0원"
            
//각 과자값이 저장되던 상수도 0으로 다시 초기화            
self?.firstMenu = 0
self?.secondMenu = 0
self?.thirdMenu = 0
            
//스텝퍼 값 초기화            
self?.firstStepper.value = 0
self?.secondStepper.value = 0
self?.thirdsSepper.value = 0

foreach문을 사용하면 여러가지 작업을 한 꺼번에 하기 좋답니다!

더 알고 싶다면 여기를!!

[swift] foreach 사용해보기

 

 

그리고 마지막으로 우리가 만든 alertAction을 우리가 만든 alert에 추가해주도록 해요.

그리고 alert를 나타내줍니다.

alert.addAction(okAction)
present(alert, animated: true, completion: nil)

 


왜 이렇게 할 말이 많은거져?!!

버튼 하나 쓰는데 이렇게 오래 걸리고 난리람;;

"구매하기"버튼은 더 긴데,,,

4편으로,,,

 

전체코드 보기

더보기
    @objc func resetBtnTapped(_ sender: UIButton) {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        
        let alert = UIAlertController(title: "내 지갑", message: "남은 돈은?", preferredStyle: .alert)
        alert.addTextField { $0.placeholder = "가진 돈 입력하기" }
        let okAction = UIAlertAction(title: "입력", style: .default) { [weak self] (textField) in
            if let fieldList = alert.textFields {
                if let textField = fieldList.first {
                    if let safeData = textField.text {
                        if let safeData2 = Int(safeData) {
                            let safeNum = numberFormatter.string(for: safeData2)
                            self?.totalPrice.text = safeNum! + "원"
                        }
                        
                    }
                }
            }
            //let price = Int(textField.text)
            //let test = numberFormatter.string(for: price)
            //self!.totalPrice.text = test! + "원"
            
            
            [self?.num1Lbl, self?.num2Lbl, self?.num3Lbl].forEach {
                $0!.text = "0개"
            }
            self?.endTotalLbl.text = "0원"
            
            
            self?.firstMenu = 0
            self?.secondMenu = 0
            self?.thirdMenu = 0
            
            
            self?.firstStepper.value = 0
            self?.secondStepper.value = 0
            self?.thirdsSepper.value = 0
            
            
        }
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
        
    }

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크