티스토리 뷰
오늘은 (마지막 시간이 되길 바라는) 마지막 시간,,,
초기화 버튼과 구매하기 버튼을 누르면 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)
}
'iOS 개발자 되기' 카테고리의 다른 글
[swift] 왕기초적인 API 받아오기 3 (URLSession) (0) | 2022.01.16 |
---|---|
[swift] stepper 및 alertController 연습하기 3-2 (in Code) (0) | 2021.12.04 |
[swift] stepper 및 alertController 연습하기 2 (in Code) (0) | 2021.11.30 |
[swift] stepper 및 alertController 연습하기 1 (in Code) (0) | 2021.11.24 |
[swift] 간단한 TabBarController In NavigationController 만들어보기 (Code) (0) | 2021.11.23 |
- Total
- Today
- Yesterday