it-swarm.com.de

Wo finden Sie eine klare Erklärung zu Swift Alert (UIAlertController)?

Konnte keine klare und informative Erklärung dafür finden.

19
Nikita Kurtin

Nachdem ich eine Weile nach einem Thema gesucht hatte, fand ich keine eindeutige Erklärung, selbst in der Klassenreferenz UIAlertController-Referenz

Es ist in Ordnung, aber für mich nicht klar genug.

Nachdem ich einige Stücke gesammelt hatte, beschloss ich, meine eigene Erklärung zu machen. (Hoffe, es hilft) 

So geht es also:

  1. UIAlertView ist wie angegeben veraltet: UIAlertView in Swift
  2. UIAlertController sollte in iOS8 + verwendet werden. Um einen zu erstellen, müssen wir ihn instanziieren. Der Konstruktor (init) erhält 3 Parameter: 

2.1 title: String -> Großer Fettdruck, der oben im Dialogfeld des Alarms angezeigt wird

2.2 message: String -> kleinerer Text (erklärt ziemlich genau, dass er selbst ist)

2.3 prefferedStyle:UIAlertControllerStyle -> Definieren Sie den Dialogfeldstil in den meisten Fällen: UIAlertControllerStyle.Alert

  1. Um es nun tatsächlich dem Benutzer anzuzeigen, können wir showViewController oder presentViewController verwenden und unseren Alert als Parameter übergeben

  2. Um eine Interaktion mit einem Benutzer hinzuzufügen, können wir Folgendes verwenden:

4.1 UIAlertController.addAction zum Erstellen von Schaltflächen

4.2 UIAlertController.addTextField zum Erstellen von Textfeldern

Edit note: Codebeispiele unten, aktualisiert für die Swift 3-Syntax

Beispiel 1: Einfacher Dialog

@IBAction func alert1(sender: UIButton) {
     //simple alert dialog
    let alert=UIAlertController(title: "Alert 1", message: "One has won", preferredStyle: UIAlertControllerStyle.alert);
    //show it
    show(alert, sender: self);
}

Beispiel 2: Dialog mit einem Eingabetextfeld und zwei Schaltflächen

@IBAction func alert2(sender: UIButton) {
    //Dialog with one input textField & two buttons
    let alert=UIAlertController(title: "Alert 2", message: "Two will win too", preferredStyle: UIAlertControllerStyle.alert);
    //default input textField (no configuration...)
    alert.addTextField(configurationHandler: nil);
    //no event handler (just close dialog box)
    alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.cancel, handler: nil));
    //event handler with closure
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in
        let fields = alert.textFields!;
        print("Yes we can: "+fields[0].text!);
    }));
    present(alert, animated: true, completion: nil);
}

Beispiel 3: Ein benutzerdefiniertes Eingabetextfeld und eine Schaltfläche

@IBAction func alert3(sender: UIButton) {
   // one input & one button
   let alert=UIAlertController(title: "Alert 3", message: "Three will set me free", preferredStyle: UIAlertControllerStyle.alert);

    //configured input textField
    var field:UITextField?;// operator ? because it's been initialized later
    alert.addTextField(configurationHandler:{(input:UITextField)in
        input.placeholder="I am displayed, when there is no value ;-)";
        input.clearButtonMode=UITextFieldViewMode.whileEditing;
        field=input;//assign to outside variable(for later reference)
    });
    //alert3 yesHandler -> defined in the same scope with alert, and passed as event handler later
    func yesHandler(actionTarget: UIAlertAction){
        print("YES -> !!");
        //print text from 'field' which refer to relevant input now
        print(field!.text!);//operator ! because it's Optional here
    }
    //event handler with predefined function
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: yesHandler));

    present(alert, animated: true, completion: nil);
 }

Hoffe es hilft und viel Glück ;-)

63
Nikita Kurtin

Eine Instanz des UIAlertControllers kann wie jeder andere UIViewController, der die Methode presentViewController: animated: completion: verwendet, modal auf dem Bildschirm dargestellt werden. Die UIAlertController-Instanz unterscheidet zwischen der Arbeit als ActionSheet oder als AlertView den Stilparameter, den Sie beim Erstellen übergeben.

Keine Delegation mehr

Wenn Sie ein UIActionSheet oder UIAlertView verwendet haben, wissen Sie, dass der Aufruf eines Callbacks für eine Klasse (in den meisten Fällen der ViewController) das UIActionSheetDelegate- oder UIAlertViewDelegate-Protokoll implementiert. Es gibt einige Open-Source-Projekte, die dieses Delegierungsmuster durch blockbasierte Rückrufe ersetzt haben. Die offiziellen APIs wurden jedoch nie aktualisiert. UIAlertController verwendet keine Delegierung. Stattdessen gibt es eine Sammlung von UIAlertAction-Elementen, die mit Closures (oder Blöcken, wenn Sie Objective-C verwenden) zur Verarbeitung von Benutzereingaben verwendet werden.

Für Aktionsblatt

@IBAction func showActionSheet(sender: AnyObject) {
  //Create the AlertController
  let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .ActionSheet)

  //Create and add the Cancel action
  let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
    //Just dismiss the action sheet
  }
  actionSheetController.addAction(cancelAction)
    //Create and add first option action
  let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .Default) { action -> Void in
    //Code for launching the camera goes here
    }
  actionSheetController.addAction(takePictureAction)
  //Create and add a second option action
  let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .Default) { action -> Void in
    //Code for picking from camera roll goes here
    }
  actionSheetController.addAction(choosePictureAction)

  //Present the AlertController
  self.presentViewController(actionSheetController, animated: true, completion: nil)
}

Für AlertView mit Textfeld

@IBAction func showAlert(sender: AnyObject) {
  //Create the AlertController
  let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert)

  //Create and add the Cancel action
  let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
    //Do some stuff
    }
  actionSheetController.addAction(cancelAction)
    //Create and an option action
  let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in
    //Do some other stuff
    }
  actionSheetController.addAction(nextAction)
  //Add a text field
  actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
       //TextField configuration
     textField.textColor = UIColor.blueColor()
   }

   //Present the AlertController
   self.presentViewController(actionSheetController, animated: true, completion: nil)
}
11
Omer Waqas Khan

Ein Teil der Syntax hat sich seit den ursprünglichen Antworten geändert. Hier ein Beispielcode, der den Benutzer darauf hinweist, wenn er nicht bei iCloud angemeldet ist.

CKContainer.default().accountStatus { (accountStatus, error) in
        switch accountStatus {
        case .available:
            print("iCloud Available")
        case .noAccount:
            print("No iCloud account")
            //simple alert dialog
            let alert=UIAlertController(title: "Sign in to iCloud", message: "This application requires iClound. Sign in to your iCloud account to write records. On the Home screen, launch Settings, tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don't have an iCloud account, tap Create a new Apple ID", preferredStyle: UIAlertControllerStyle.alert);
            //no event handler (just close dialog box)
            alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil));
            //show it
            self.present(alert, animated: true, completion: nil)
        case .restricted:
            print("iCloud restricted")
        case .couldNotDetermine:
            print("Unable to determine iCloud status")
        }
    }
1
CliffAnd