일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- weak var
- MKMapItem
- 러닝타이머
- font book
- 러닝기록앱
- App Store Connect
- CLLocationManagerDelegate
- CoreLocation
- weatherKit
- UICollectionViewFlowLayout
- Xcode
- Required Reason API
- dispatchsource
- Timer
- Startign Assignments
- MKMapViewDelegate
- 영문 개인정보처리방침
- 클로저의 캡슐화
- xcode로 날씨앱 만들기
- 단일 책임원칙
- addannotation
- 한국어 개인정보처리방침
- AnyObject
- WeatherManager
- RunningTimer
- Protocol
- swift
- SwiftUI Boolean 값
- 서체관리자
- UIAlertAction
- Today
- Total
VesselWheel
UIAlertController를 이용한 alert창 띄우기 본문
사용 목적
아이폰에서 일반적으로 프로퍼티를 선택했을 때 선택을 안내하거나 경고창을 알릴 때 사용하는 매서드
present(_:animated:completion:)
이 클래스를 사용하여 표시하려는 메시지와 선택할 작업이 포함된 경고 및 작업 시트를 구성합니다. 원하는 작업과 스타일로 경고 컨트롤러를 구성한 후 메서드를 사용하여 표시합니다 . UIKit은 앱 콘텐츠에 대해 모달 방식으로 경고와 작업 시트를 표시합니다.
addAction(_:)
사용자에게 메시지를 표시하는 것 외에도 작업을 경고 컨트롤러와 연결하여 사람들에게 응답 방법을 제공할 수 있습니다. 메서드를 사용하여 추가하는 각 작업에 대해 경고 컨트롤러는 작업 세부 정보가 포함된 버튼을 구성합니다. 사람이 해당 작업을 탭하면 경고 컨트롤러는 작업 개체를 만들 때 제공한 블록을 실행합니다. 다음 코드는 단일 작업으로 경고를 구성하는 방법을 보여줍니다.
let alert = UIAlertController(title: "My Alert", message: "This is an alert.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { _ in
NSLog("The \"OK\" alert occured.")
}))
self.present(alert, animated: true, completion: nil)
스타일로 경고를 구성할 때 경고 인터페이스에 텍스트 필드를 추가할 수도 있습니다. 경고 컨트롤러를 사용하면 표시하기 전에 텍스트 필드를 구성하기 위한 블록을 제공할 수 있습니다. 경고 컨트롤러는 나중에 해당 값에 액세스할 수 있도록 각 텍스트 필드에 대한 참조를 유지합니다.
단일 책임원칙으로 매서드화
import UIKit
func actionAlert(in view: UIViewController, title: String, message: String, cancelButton: Bool = true, okHandler: @escaping () -> Void = {}) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let ok = UIAlertAction(title: "네", style: .default) {_ in
okHandler()
}
let cancel = UIAlertAction(title: "아니오", style: .destructive) {_ in
}
alert.addAction(ok)
if cancelButton == true {
alert.addAction(cancel)
}
view.present(alert, animated: true)
}
1. actionAlert 메서드는 UIKit 프레임워크에서 제공하는 UIAlertController를 사용하여 알림창을 표시하는 기능을 구현한 것입니다.
2. 매개변수
- view: 알림창이 표시될 뷰 컨트롤러
- title: 알림창의 제목
- message: 알림창에 표시될 메시지
- cancelButton: 취소 버튼의 유무를 나타내는 Bool, 기본값은 true로 설정
- okHandler: 확인 버튼을 눌렀을 때 실행될 클로저, 기본값으로 빈 클로저가 설정
3. actionAlert 메서드는 위에서 받은 매개변수를 사용하여 UIAlertController를 생성하고, 확인 버튼과 취소 버튼을 추가,
확인 버튼을 누를 경우 okHandler 클로저가 실행되도록 설정
4. UIAlertAction 인스턴스인 ok와 cancel을 생성합니다. ok는 "네"라는 제목과 .default 스타일로 생성되며, 확인 버튼을 눌렀을 때 okHandler 클로저가 실행되도록 설정되어 있습니다.
5. cancel은 "아니오"라는 제목과 .destructive 스타일로 생성되며, 취소 버튼을 눌렀을 때 특별한 동작을 하지 않도록 비워둔 상태입니다.
6. 마지막으로, ok 액션은 항상 알림창에 추가되고, cancelButton이 true인 경우 cancel 액션도 알림창에 추가됩니다. 그리고 생성한 알림창을 view 뷰 컨트롤러에 표시하여 화면에 보여줍니다.
7. 이렇게 actionAlert 메서드를 호출하면 해당 뷰 컨트롤러에 원하는 내용의 알림창이 표시되며, 사용자의 동작에 따라 okHandler 클로저가 실행되는 기능을 구현할 수 있습니다.
ViewController의 extension에서 활용한 모습
// MARK: - MenuViewDelegate
extension ViewController: MenuViewDelegate { //ViewController에서 MenuViewDelegate로 위임받은 매소드 didTapcollectionView()
func didTapcollectionView() {
actionAlert(in: self, title: "메뉴를 추가하였습니다.", message: "잠시만 기다려주세요.", cancelButton: true)
self.orderView.setTotalOrderInfo()
} //actionAlert매소드로 선언된 구현부에 따라 UIAlertController를 실행
}
- extension이 MenuViewDelegate의 규약을 따르면서 단일 책임원칙으로 매소드화한 actionAlert 기능을 구분호출하여 사용하였다.
protocol MenuViewDelegate: AnyObject { //delegate pattern으로 생성한 프로토콜 MenuViewDelegate
func didTapcollectionView () // 클로져로 생성하여 ViewController에 위임하기 위한 매소드
}
- ViewController가 아닌 MenuView에서 프로토콜을 정의하고 didTapcollectionView() 클로져로 정의하여 ViewController에 위임한다.
https://developer.apple.com/documentation/uikit/uialertcontroller
'Xcode Study' 카테고리의 다른 글
Code로 쓰는 UI와 StroyBoard 로 쓰는 UI의 장점과 단점(from. 권영호 튜터) (0) | 2024.01.04 |
---|---|
클로저로 만드는 타이머 매서드(feat. 비동기화) (1) | 2024.01.04 |
Double 타입의 숫자를 화폐단위로 표시하기(ex. 5,000원) (1) | 2024.01.02 |
UICollectionView의 UICollectionViewFlowLayout (0) | 2024.01.02 |
OrderListView와 MenuView 간의 데이터 연결(feat. 델리게이트, 약한참조) (0) | 2024.01.02 |