Swift에서 UIAlertView를 어떻게 만들 수 있습니까?


481

Swift에서 UIAlertView를 만들려고 노력했지만 어떤 이유로 든이 오류가 발생하여 문을 올바르게 얻을 수 없습니다.

제공된 인수를 허용하는 'init'에 대한 과부하를 찾을 수 없습니다.

내가 쓴 방법은 다음과 같습니다.

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message",
                     delegate: self, cancelButtonTitle: "OK", otherButtonTitles: nil)

그런 다음 사용하고 있습니다.

button2Alert.show()

현재로서는 충돌이 발생하고 구문을 올바르게 얻을 수없는 것 같습니다.


5
UIAlertView그리고 iOS 8에서 UIActionSheet대체되었습니다 UIAlertController. 이것을 보셨습니까?
Popeye

self소속 된 클래스가 프로토콜을 채택 하는지 확인하십시오 UIAlertViewDelegate(Swift에서 권장되는 방법은 확장명입니다).
Nicolas Miari

@Adam : 태그 재 지정을 되돌 렸습니다. swift3 태그입니다 "직접 애플의 신속한 프로그래밍 언어의 버전 3의 변화에 관한 질문입니다." 그리고 "답변이 질문의 문제가 질문자가 생각한 것 이외의 다른 원인에 의해 발생했다는 것을 명확하게하면 태그 재 지정이 매우 도움이됩니다." 에서 meta.stackoverflow.com/questions/252079/... 여기에 적용됩니다.
Martin R

1
@MartinR 현재 버전의 Swift에 적용되는 답변이 있음을 보여주기 위해 질문을 업데이트하는 방법을 모르겠습니다. 여기에는 오래되고 쓸모없는 것들이 많이 있으며 [swift]는 유용성과 함께 모든 것을 발견합니다. 이 태그가 되돌려지는 것에 대해 강하게 느끼지 않지만이 문제를 해결할 수있는 확실한 방법이 있었으면합니다. (답변에 태그가 있었으면 좋겠습니다.)
Adam Eberbach

답변:


897

로부터 UIAlertView클래스 :

// UIAlertView는 더 이상 사용되지 않습니다. 사용 UIAlertController 대신 UIAlertControllerStyleAlert의 preferredStyle와

iOS 8에서는 다음을 수행 할 수 있습니다.

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

지금 UIAlertController만들고 우리가 알고있는 것을와 상호 작용하기위한 하나의 클래스 UIAlertViewS와 UIActionSheet아이폰 OS 8들.

편집 : 작업을 처리하려면

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in
    switch action.style{
    case .Default:
        print("default")

    case .Cancel:
        print("cancel")

    case .Destructive:
        print("destructive")
    }
}}))

스위프트 3 편집 :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)

Swift 4.x 편집 :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
      switch action.style{
      case .default:
            print("default")

      case .cancel:
            print("cancel")

      case .destructive:
            print("destructive")


}}))
self.present(alert, animated: true, completion: nil)

3
UIAlertView가 더 이상 사용되지 않는 곳은 어디입니까? 설명서에 표시되지 않습니까?
BlueBear

9
Cmd + UIAlertView클래스를 클릭하면 주석이 클래스 선언 바로 위에 있습니다.
Oscar Swanros 2018 년

2
addAction (UIAlertAction (제목 : "취소", 스타일 : UIAlertActionStyle.Cancel, 핸들러 : {(ACTION : UIAlertAction!) in})))
altyus

5
취소 및 파괴 사례의 요점은 항상 지정한 것이므로 무엇 .Default입니까?
사용자

4
답변을 읽으면 스위치 케이스가 필요하지 않습니다 . 스위치는 유형 또는 제목이 하드 코딩되지 않은 경우에만 유용합니다. 즉, 동적입니다. 타이틀이 하드 코딩되지 않도록 일련의 동적 버튼이있을 수 있습니다. 그런 다음 핸들러는 선택한 제목을 다른 메소드 호출로 전달해야 할 수도 있습니다.
Honey

465

하나의 버튼

하나의 버튼 스크린 샷

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

두 개의 버튼

두 개의 버튼 경고

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

세 개의 버튼

여기에 이미지 설명을 입력하십시오

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

버튼 탭 처리

handler있었다 nil상기 예에서. 당신은 대체 할 수 nil로모그래퍼 폐쇄 사용자가 버튼을 탭하면 뭔가를 할 수 있습니다. 예를 들면 다음과 같습니다.

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in

    // do something like...
    self.launchMissile()

}))

노트

  • 여러 버튼이 반드시 다른 UIAlertAction.Style유형 을 사용할 필요는 없습니다 . 그들은 모두 될 수 있습니다 .default.
  • 세 개 이상의 단추에 대해서는 작업 시트 사용을 고려하십시오. 설정은 매우 유사합니다. 다음은 예입니다.

2
UIAlertController에 대리자 속성이 있습니까? UIAlertView에는 언젠가 자체로 설정 한 대리자 속성이 있습니다. UIAlertController에는 이와 같은 것이 있습니까? 나는 새로운, 도와주세요
ArgaPK

아름다운 답변-이제 핸들러 내에서 새로운보기로 전환하려면 어떻게해야합니까?
That1Guy

114

표준 생성자를 사용하여 UIAlert를 만들 수 있지만 '레거시'는 작동하지 않는 것 같습니다.

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()

8
UIAlertView는 더 이상 사용되지 않습니다. 기본 스타일 UIAlertControllerStyleAlert와 함께 UIAlertController를 대신 사용하십시오.
Zorayr

16
@Zorayr UIAlertController는 iOS 8 이상에서만 사용할 수 있습니다. 또한 사용을 제안 할 때 언급하십시오. iOS7 지원이 여전히 요구되고 사람들이 문제를 놓칠 수있는 상황이 있습니다. 더 이상 사용되지 않는다고해서 더 이상 사용하지 마십시오.
Sami Kuhmonen

2
앱이 여전히 iOS 7을 대상으로하는 경우 작동합니다. 그러나 UIAlertView는 UIAlertController를 사용할 수없는 경우에만 사용해야합니다. NSClassFromString ( "UIAlertController")! = nil {/ * UIAlertController 사용 * /} else {/ * UIAlertView 사용 * /}
phatblat

UIAlertview ()는 현재 아이폰 OS 9에서 더 이상 사용되지 않습니다
리즈 완 아메드을

31

Swift 4.2 및 Xcode 10에서

방법 1 :

간단한 경고

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

     let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
     alert.addAction(ok)
     let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
     })
     alert.addAction(cancel)
     DispatchQueue.main.async(execute: {
        self.present(alert, animated: true)
})

방법 2 :

공유 클래스에 대한 경고

당신이 공유 클래스 스타일을 원한다면 (한 번 쓸 때마다 쓰기)

import UIKit
class SharedClass: NSObject {//This is shared class
static let sharedInstance = SharedClass()

    //Show alert
    func alert(view: UIViewController, title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert.addAction(defaultAction)
        DispatchQueue.main.async(execute: {
            view.present(alert, animated: true)
        })
    }

    private override init() {
    }
}

이제 모든 도자기에서 이와 같이 경고하십시오.

SharedClass.SharedInstance.alert(view: self, title: "Your title here", message: "Your message here")

방법 3 :

모든 WINDOWS의 현재 알림 맨

모든보기 위에 경고를 표시하려면이 코드를 사용하십시오.

func alertWindow(title: String, message: String) {
    DispatchQueue.main.async(execute: {
        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert + 1

        let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert2.addAction(defaultAction2)

        alertWindow.makeKeyAndVisible()

        alertWindow.rootViewController?.present(alert2, animated: true, completion: nil)
    })
}

함수 호출

SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message")

방법 4 :

확장명이있는 경고

extension  UIViewController {

    func showAlert(withTitle title: String, withMessage message:String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
        })
        alert.addAction(ok)
        alert.addAction(cancel)
        DispatchQueue.main.async(execute: {
            self.present(alert, animated: true)
        })
    }
}

이제 이렇게 불러

//Call showAlert function in your class
@IBAction func onClickAlert(_ sender: UIButton) {
    showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere")
}

방법 5 :

텍스트 필드에 대한 경고

경고 할 텍스트 필드를 추가하려는 경우.

//Global variables
var name:String?
var login:String?

//Call this function like this:  alertWithTF() 
//Add textfields to alert 
func alertWithTF() {

    let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert)
    // Login button
    let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in
        // Get TextFields text
        let usernameTxt = alert.textFields![0]
        let passwordTxt = alert.textFields![1]
        //Asign textfileds text to our global varibles
        self.name = usernameTxt.text
        self.login = passwordTxt.text

        print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)")
    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })

    //1 textField for username
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter username"
        //If required mention keyboard type, delegates, text sixe and font etc...
        //EX:
        textField.keyboardType = .default
    }

    //2nd textField for password
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter password"
        textField.isSecureTextEntry = true
    }

    // Add actions
    alert.addAction(loginAction)
    alert.addAction(cancel)
    self.present(alert, animated: true, completion: nil)

}

방법 6 :

확장명이있는 SharedClass의 경고

//This is your shared class
import UIKit

 class SharedClass: NSObject {

 static let sharedInstance = SharedClass()

 //Here write your code....

 private override init() {
 }
}

//Alert function in shared class
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

이제 이렇게 직접 전화 해

self.showAlert(title: "Your title here...", msg: "Your message here...")

방법 7 :

별도의 클래스에서 확장 기능이있는 공유 클래스가없는 경우 경고합니다.

새로운 Swift 클래스를 하나 만듭니다 import UIKit. 아래 코드를 복사하여 붙여 넣으십시오.

//This is your Swift new class file
import UIKit
import Foundation

extension UIAlertController {
    class func alert(title:String, msg:String, target: UIViewController) {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) {
        (result: UIAlertAction) -> Void in
        })
        target.present(alert, animated: true, completion: nil)
    }
}

이제 모든 클래스 (한 줄)에서 이와 같은 경고 기능을 호출하십시오.

UIAlertController.alert(title:"Title", msg:"Message", target: self)

어때 ....


완벽 해! +1 타임 아웃이 통합 된 방법을 추가해 주시겠습니까? 감사!
PascalS

@ Passe, 죄송합니다. 이해할 수 없습니다. 간단히 설명해주세요.
iOS

'OK'버튼을 클릭하거나 시간 초과가 발생할 때까지 표시되는 alertController가 필요합니다. 방법 6 또는 7과 같지만 추가 입력 변수 'timeout'이 있습니다.
PascalS

확장 UIViewController {func alertWithTime (제목 : 문자열, msg : 문자열, timeInterval : TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (제목 : 제목, 메시지 : msg, preferredStyle : .alert) alert.addAction (UIAlertAction (제목 : "OK", 스타일 : .default, 핸들러 : nil)) self.present (경고, 애니메이션 : true, 완료 : nil) if #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval : timeInterval, 반복 : false , block : {_ alert.dismiss (animated : true, complete : nil)})} else {// 이전 버전의 폴백}}}}
iOS

1
이 경우 timeInterval 0을 언급하면 ​​경고를 닫지 않으려면 if 조건을 사용하십시오. if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS

19

보기 클릭

@IBAction func testClick(sender: UIButton) {

  var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
  self.presentViewController(uiAlert, animated: true, completion: nil)

  uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in
   println("Click of default button")
  }))

  uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in
   println("Click of cancel button")
  }))

}

두 개의 버튼으로 완료 확인 및 취소


12

iOS 7 8을 대상으로하는 경우 UIAlertViewiOS 8에서는 더 이상 사용되지 않지만 UIAlertControlleriOS 7에서는 사용할 수 없으므로 각 버전에 적합한 방법을 사용하려면 이와 같은 것이 필요합니다 .

func alert(title: String, message: String) {
    if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8
        let myAlert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(myAlert, animated: true, completion: nil)
    } else { // iOS 7
        let alert: UIAlertView = UIAlertView()
        alert.delegate = self

        alert.title = title
        alert.message = message
        alert.addButtonWithTitle("OK")

        alert.show()
    }
}

또는 UIAlertViewiOS 7에 대한 지원을 중단 할 때까지 시간을 절약하고 사용할 수 있습니다 . Apple은 이에 대한 앱을 거부하지 않습니다.
cprcrack

2
더 이상 사용되지 않는다는 것은 "이것을 사용하지 마십시오"또는 "잘못된 방법"이라는 의미는 아닙니다. 단지 나중에 작동하지 않을 것입니다. 기본 알림 만 필요한 경우 iOS8에서 특별히 UIAlertController를 사용할 필요가 없습니다. 그들은 전처럼 작동합니다. iOS4 또는 5에서 더 이상 사용되지 않고 여전히 iOS8에서 작동하는 많은 API가 있습니다. 그러나 물론 더 높은 iOS 수준을 대상으로하는 앱은이를 사용해서는 안되므로 사용 중단 경고가 표시됩니다.
Sami Kuhmonen

1
@SamiKuhmonen 아니요,하지만 왜하고 있는지 왜 더 명확하게하고 최소 버전이 그렇게 높을 때 더 이상 사용되지 않는 메소드에 대한 지원을 쉽게 제거 할 수 있습니다.
AstroCB

12

Swift 2의 프로토콜 확장을 사용하면 뷰 컨트롤러에 기본 구현을 제공하는 프로토콜을 만들 수 있습니다.

ShowAlert.swift

import UIKit

protocol ShowsAlert {}

extension ShowsAlert where Self: UIViewController {
    func showAlert(title: String = "Error", message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
        presentViewController(alertController, animated: true, completion: nil)
    }
}

ViewController.swift

class ViewController: UIViewController, ShowsAlert {
    override func viewDidLoad() {
        super.viewDidLoad()
        showAlert(message: "Hey there, I am an error message!")
    }
}

1
완벽하게 작동합니다. Swift3의 경우 'presentViewController'를 'present'로 변경하십시오.
Vincent

11

빠른 언어로 UIAlertView 표시 :-

프로토콜 UIAlertViewDelegate

let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete")
alert.show()

빠른 언어로 UIAlertViewController 표시 :-

let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

11

생성자에 otherButtonTitle을 제공하지 마십시오.

let alertView = UIAlertView(title: "Oops!", message: "Something
happened...", delegate: nil, cancelButtonTitle: "OK")

alertView.show()

그러나 Oscar에 동의합니다.이 클래스는 iOS 8에서 더 이상 사용되지 않으므로 iOS 8 전용 앱을 사용하는 경우 UIAlertView를 사용하지 않습니다. 그렇지 않으면 위의 코드가 작동합니다.


9

이걸 찾았어요

var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
alertView.message = "message";
alertView.show();

그래도 좋지는 않지만 작동합니다 :)

최신 정보:

하지만 헤더 파일에서 다음과 같이 발견했습니다.

extension UIAlertView {
    convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...)
}

누군가가 이것을 설명 할 수 있습니다.


분명히 UIAlertView는 iOS 8에서 더 이상 사용되지 않으며 이제는 선호하는 스타일의 UIAlertControllerStyleAlert와 함께 UIAlertController를 사용합니다.
BlueBear

6
iOS7.1과 호환되는 앱을 실행하고 Swift에서 작성하는 경우 UIAlertController가 대상 장치를 중단시킵니다. iOS7 용 레거시 UIAlertViews를 지원해야합니다.
Joe

Swift가 충돌을 일으키는 것은 아니라고 생각합니다. 오히려 iOS 8 이전에는 UIAlertController를 사용할 수 없습니다.
Frédéric Adda

7

들어 SWIFT4 , 나는 확장, 생각 UIViewController과 가장 우아한 방법을 재사용 확인 컨트롤입니다 생성.

UIViewController아래와 같이 확장 할 수 있습니다 .

extension UIViewController {

func AskConfirmation (title:String, message:String, completion:@escaping (_ result:Bool) -> Void) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    self.present(alert, animated: true, completion: nil)

    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in
        completion(true)
    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
        completion(false)
    }))
  }
}

그런 다음 언제든지 사용할 수 있습니다.

 AskConfirmation(title: "YOUR MESSAGE TITLE", message: "YOUR MESSAGE") { (result) in
        if result { //User has clicked on Ok

        } else { //User has clicked on Cancel

        }
    }

5
    class Preview: UIViewController , UIAlertViewDelegate
    {
        @IBAction func MoreBtnClicked(sender: AnyObject)
        {
            var moreAlert=UIAlertView(title: "Photo", message: "", delegate: self, cancelButtonTitle: "No Thanks!", otherButtonTitles: "Save Image", "Email", "Facebook", "Whatsapp" )
            moreAlert.show()
            moreAlert.tag=111;
        }

        func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int)
        {
            if alertView.tag==111
            {
                if buttonIndex==0
                {
                    println("No Thanks!")
                }
                else if buttonIndex==1
                {
                    println("Save Image")
                }
                else if buttonIndex == 2
                {
                    println("Email")
                }
                else if buttonIndex == 3
                {
                    println("Facebook")
                }
                else if buttonIndex == 4
                {
                    println("Whatsapp")
                }
            }
        }
    }

많은 양의 코드를 작성하는 것은 그리 유용하지 않습니다. 질문에 대답 할 때 (특히 허용되는 답변을 포함하여 몇 가지 답변이있는 오래된 질문) 하나 이상의 코드를 작성하십시오. 코드의 기능, 질문에 대한 답변 방법 및 다른 답변과 다른 점 (또는 더 나은)에 대한 설명을 추가하십시오.
AdrianHHH

5

또 다른 트릭이 있습니다. 로그 아웃 경고를 적용 할 클래스가 5 개 있다고 가정합니다. 신속한 수업 확장 프로그램을 사용해보십시오.

File- New- Swift class- 이름을 지정하십시오.

다음을 추가하십시오.

public extension UIViewController
{

    func makeLogOutAlert()
    {
        var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.Alert)

        refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .Default, handler: { (action: UIAlertAction!) in
            self.navigationController?.popToRootViewControllerAnimated(true)
        }))

        refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in
            refreshAlert .dismissViewControllerAnimated(true, completion: nil)
        }))

        presentViewController(refreshAlert, animated: true, completion: nil)
    }
}

self.makeLogOutAlert ()를 사용하여 구현하십시오. 도움이 되길 바랍니다.


5

나는 앱의 어느 곳에서나 편리하게 사용할 수 있도록 싱글 톤 클래스를 만들었습니다 : https://github.com/Swinny1989/Swift-Popups

그런 다음 다음과 같이 여러 개의 버튼으로 팝업을 만들 수 있습니다.

Popups.SharedInstance.ShowAlert(self, title: "Title goes here", message: "Messages goes here", buttons: ["button one" , "button two"]) { (buttonPressed) -> Void in
    if buttonPressed == "button one" { 
      //Code here
    } else if buttonPressed == "button two" {
        // Code here
    }
}

또는 다음과 같은 단일 버튼이있는 팝업 :

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")

감사. 나는 거기에 약간의 문제를 제출
djdance

1
안녕하세요 @ Swinny89이 솔루션을 우리와 공유해 주셔서 감사합니다. 나는 폐쇄 문제에 갇 혔고 당신은 나를 구했다!
Bruno Campos

5

스위프트 3

다음은 Swift 3에서 하나의 버튼으로 간단한 경고를 만드는 방법에 대한 간단한 예입니다.

let alert = UIAlertController(title: "Title",
                              message: "Message",
                              preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
present(alert, animated: true)

위의 예제에서 단추를 클릭하면 하나의 단추가있는 경보보기의 기본 동작이 사라지기 때문에 조치의 핸들 콜백이 생략되었습니다.

다음은 "alert.addAction (action)"을 사용하여 경고에 추가 할 수있는 다른 작업을 만드는 방법입니다. 다른 스타일은 .default, .destructive 및 .cancel입니다.

let action = UIAlertAction(title: "Ok", style: .default) { action in
    // Handle when button is clicked    
}

4

UIAlertView오류없이 컴파일 할 다음 초기화 코드를 얻었습니다 (마지막으로 다양한 부분이 까다로울 수 있습니다). 그러나 self( 클래스로 전달 하는) 클래스가 UIAlertViewDelegate컴파일 오류를 없애기 위해 프로토콜을 채택하고 있는지 확인해야했습니다 .

let alertView = UIAlertView(
                  title: "My Title",
                  message: "My Message",
                  delegate: self,
                  cancelButtonTitle: "Cancel",
                  otherButtonTitles: "OK"
                )

그건 그렇고, 이것은 내가 얻은 오류입니다 (Xcode 6.4 현재) :

'(title : String, message : String, delegate : MyViewController, cancelButtonTitle : String, otherButtonTitles : String)'유형의 인수 목록을 허용하는 'UIAlertView'유형의 초기화 프로그램을 찾을 수 없습니다.

다른 사람들이 언급했듯이 iOS 8.x +를 대상으로 할 수 있다면 UIAlertController로 마이그레이션해야합니다. iOS 7을 지원하려면 위 코드를 사용하십시오 (iOS 6은 Swift에서 지원되지 않습니다).


4
 let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .alert)
    let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in
        print("Default is pressed.....")
    }
    let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
        print("Cancel is pressed......")
    }
    let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in
        print("Destructive is pressed....")

    }
    alertController.addAction(action1)
    alertController.addAction(action2)
    alertController.addAction(action3)
    self.present(alertController, animated: true, completion: nil)

}

4

이 간단한 확장명은 n 개의 버튼과 swift4 이상 관련 작업으로 사용할 수 있습니다

extension UIViewController {
    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

당신은 그것을처럼 사용할 수 있습니다

self.popupAlert(title: "Message", message: "your message", actionTitles: ["first","second","third"], actions:[
            {action1 in
                //action for first btn click
            },
            {action2 in
                //action for second btn click
            },
            {action3 in
                //action for third btn click
            }, nil]) 

중복 답변을 게시하지 마십시오. 답변을 편집하려면
iOS

훌륭한 답변입니다. 이것이 내가 필요한 것입니다. 감사합니다!
그레고리 윌슨 Pullyattu

3

함수에 전달한 일부 값이 올바르지 않아 작동하지 않는 이유. swift는 Objective-C를 좋아하지 않으므로 제한없이 클래스 유형의 인수에 nil을 넣을 수 있습니다. 인수 otherButtonTitles는 유형이 끝에 (?)가없는 비 선택적으로 정의됩니다. 구체적인 가치를 전달해야합니다.


3
@IBAction func Alert(sender: UIButton) {

    var alertView:UIAlertView = UIAlertView()
    alertView.title = "Alert!"
    alertView.message = "Message"
    alertView.delegate = self
    alertView.addButtonWithTitle("OK")

    alertView.show()

}

이 시도


3

이 코드를 사용하여 경보보기를 표시하십시오.

  let alertController = UIAlertController(title: "Hello  Coders", message: "your alert message", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil)
        alertController.addAction(defaultAction)

        presentViewController(alertController, animated: true, completion: nil)

참조 : UIAlertController를 사용하여 신속한 경고 표시


3

xcode 9에서

let alert = UIAlertController(title: "Alert", message: "message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)

3

SWIFT 4 : 다음과 같이 UIViewController에 대한 확장을 작성하십시오.

extension  UIViewController {        
    func showSuccessAlert(withTitle title: String, andMessage message:String) {
        let alert = UIAlertController(title: title, message: message,
                                  preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "OK".localized, style:
        UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

이제 ViewController에서 UIViewController가 제공하는 것처럼 위 함수를 직접 호출하십시오.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")

일반적으로 코드의 목적과 다른 언어를 도입하지 않고 문제를 해결하는 이유에 대한 설명이 포함되어 있으면 답변이 훨씬 유용합니다. 답변의 참조 값을 개선하고 더 이해하기 쉽게 해주셔서 감사합니다!
Tim Diekmann 2016 년

2

이 시도. 벨로우즈 코드를 버튼에 넣습니다.

let alert = UIAlertController(title: "Your_Title_Text", message: "Your_MSG", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Your_Text", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated:true, completion: nil)

1

다음은 Swift의 재미있는 예입니다.

private func presentRandomJoke() {
  if let randomJoke: String = jokesController.randomJoke() {
    let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil))
    presentViewController(alertController, animated:true, completion:nil)
  }
}

1

Swift에서 AlertView의 매우 간단한 기능은 다음과 같습니다.

class func globalAlertYesNo(msg: String) {
        let alertView = UNAlertView(title: "Title", message: msg)

        alertView.messageAlignment = NSTextAlignment.Center
        alertView.buttonAlignment  = UNButtonAlignment.Horizontal

        alertView.addButton("Yes", action: {

            print("Yes action")

        })

        alertView.addButton("No", action: {

            print("No action")

        })

        alertView.show()

    }

이 함수를 사용하는 경우 메시지를 문자열로 전달해야합니다.


1

옛날 방식 : UIAlertView

let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alertView.alertViewStyle = .Default
alertView.show()

// MARK: UIAlertViewDelegate

 func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
 switch buttonIndex {

    // ...
   }
  }

새로운 방법 : UIAlertController

let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert)

let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in
// ...
 }
 alertController.addAction(cancelAction)

 let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
 }
 alertController.addAction(OKAction)
 self.presentViewController(alertController, animated: true) {
 // ...
}

1

iOS 9 에서이 작업을 수행 할 수 있습니다

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)

1

// UIAlertView의 제네릭 클래스

//MARK:- MODULES
import Foundation
import UIKit

//MARK:- CLASS
class Alert  : NSObject{

static let shared = Alert()

var okAction : AlertSuccess?
typealias AlertSuccess = (()->())?
var alert: UIAlertController?

/** show */
public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)
        alert?.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil);
    }
}

/** showWithCancelAndOk */
public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) {
    let version:NSString = UIDevice.current.systemVersion as NSString;

    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)

        alert?.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in

            if let cancelAction = cancelAction {
                cancelAction()
            }
        }))
        alert?.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert!, animated:true, completion:nil);
    }
}

/** showWithTimer */
public func showWithTimer(message : String?, viewController : UIViewController?) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: "", message: message, preferredStyle:.alert)
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil)
        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline: when){
            self.alert?.dismiss(animated: true, completion: nil)
        }
    }
}
}

사용하다:-

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self) //without ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action
                        }) // with ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action 
}, cancelAction: {
 //cancel action
}) //with cancel and ok action

Alert.shared.showWithTimer(message : "This is an alert with timer", viewController : self) //with timer

1
  // UIAlertView is deprecated. Use UIAlertController 
  // title = title of the alert view.
  // message = Alert message you want to show.
  // By tap on "OK" , Alert view will dismiss.

 UIAlertView(title: "Alert", message: "Enter Message here.", delegate: nil, cancelButtonTitle: "OK").show()

게시 한 코드에 설명을 추가해 주시겠습니까? 현재 귀하의 답변은 실제로 SO 규칙에 의한 좋은 답변으로 인정되지 않습니다.
니코 반 벨

경보보기가 swift 4.use 경보 컨트롤러에서 변경되었습니다.
Sandeep Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.