chaneeii / iOS-Study-Log

✨ iOS에 대해 공부한 것들을 기록합니다 ✨
19 stars 0 forks source link

UIAlertController ( Alert 와 ActionSheet) #12

Open chaneeii opened 2 years ago

chaneeii commented 2 years ago

UIAlertController

UIAlertController에는 크게 두가지 Alert 와 ActionSheet가 있다. 과거에는 UIAlertView, UIActionSheet 클래스가 구분되었으나 iOS 8.0 이후로 두 객체를 통합한 UIAlertController가 등장하였다.

Alert 와 ActionSheet 의 차이

Alert(알림창)

ActionSheet

알림창이 표시되는 동안 코드는 계속 실행된다. 알림창이 화면에 표시되고 있는 동안 앱의 다른 기능을 사용할 수 없는 범위는 사용자의 터치 또는 드래그와 같은 이벤트로 제한된다. 애플리케이션이 자체적으로 실행하는 내용이 있다면 이는 알림창이 떠있더라도 계속실행한다. => UIAlertController는 비동기방식으로 실행되기 때문

AlertController 만들어보기


  @IBAction func alert(_ sender: Any) {

    // UIAlertController 인스턴스를 생성한다.
    // preferredStyle : .alert / .actionSheet
    let alert = UIAlertController(title: "선택", message: "항목을 선택해주세요", preferredStyle: .alert) //alert
    let alert = UIAlertController(title: "선택", message: "항목을 선택해주세요", preferredStyle: .actionSheet) //actionsheet

    // 버튼 액션 객체 생성 
    let cancel = UIAlertAction(title: "취소", style: .cancel){ (_) in
      self.result.text = "취소 버튼을 클릭했습니다."
    }
    let ok = UIAlertAction(title: "확인", style: .default){ (_) in
      self.result.text = "확인 버튼을 클릭했습니다."
    }
    let exec = UIAlertAction(title: "실행", style: .destructive){ (_) in
      self.result.text = "실행 버튼을 클릭했습니다."
    }
    let stop = UIAlertAction(title: "중지", style: .default){ (_) in
      self.result.text = "중지 버튼을 클릭했습니다."
    }

    // 버튼을 컨트롤러에 등록
    alert.addAction(cancel)
    alert.addAction(ok)
    alert.addAction(exec)
    alert.addAction(stop)

    // 메세지 창 실행
    self.present(alert, animated: false)

  }

More about UIAlertController

? 네트워크가 연결되지않은 경우 등 화면이 뜨자마자 메세지 창을 띄워야하는 경우 viewDidLoad() 메소드 내에서 메세지 창을 구현하면 런타임 오류 발생

  • 이유 : 아직 메세지창을 처리해줄 뷰가 화면에 구현되지 않은 상태에서 화면전환을 시도했기 때문이다.
  • Solution : 뷰 객체가 메모리에만 올라온 상태에서 호출되는 viewDidLoad() 대신 뷰가 완전히 화면에 표시되고 난 후 호출되는 viewDidAppear(_:) 메소드를 이용하여야함
    override func viewDidAppear(_ animated: Bool){
    // 메시지 창을 처리하기 적절한 위치
    let alert = UIAlertController (..)
    }

Alert메세지창 with textfield

@IBAction func login(_ sender: Any) {
    let title = "카카오톡에 로그인"
    let message = "사용자의 kakao ID chaneeii@chaneeii.com 의 암호를 입력하세요"

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let cancel = UIAlertAction(title: "취소", style: .cancel)
    let ok = UIAlertAction(title: "확인", style: .default) { (_) in
      // when ok button is clicked
        if let tf = alert.textFields?[0] { // or alert.textFields?.first 
          print("입력받은 값 : \(tf.text)")
        }else{
          print("입력받은 값이 없습니다.")
    }

  }

    alert.addAction(cancel)
    alert.addAction(ok)

    // ✅present 호출 위에 textfield 추가
    alert.addTextField(configurationHandler: { (tf) in
      tf.placeholder = "암호"
      tf.isSecureTextEntry = true //비밀번호이니깐!

    })
    self.present(alert, animated: false)

  }

References