2015-05-16 17 views
20

Nie można znaleźć jasnego i informacyjnego wyjaśnienia tego.Gdzie znaleźć jasne wyjaśnienie na temat szybkiego alarmu (UIAlertController)?

+6

sformatować przepełnienie stosu wymaga pytanie. Jeśli chcesz odpowiedzieć na własne pytanie, możesz, ale najpierw musisz zadać pytanie. Zmień swój wpis w formie pytania, na które próbujesz znaleźć odpowiedź, a następnie przenieś powyższy wpis do odpowiedzi. – vacawama

+0

Możesz użyć kontrolera "UIAlertController" zarówno dla alertu, jak i arkusza akcji. Przykłady to najłatwiejszy sposób zrozumienia działania. Oto [przykład alertu] (https://stackoverflow.com/a/33340757/3681880) i tutaj jest [przykład arkusza czynności] (https://stackoverflow.com/a/32991999/3681880). – Suragch

Odpowiedz

61

Po wyszukaniu chwilę na obiekcie I nie znaleźć jasne wyjaśnienie, nawet w swojej klasie odniesienia UIAlertController Reference

Jest ok, ale nie wystarczająco jasne dla mnie.

Więc po zebraniu kilku peaces postanowiłem zrobić własny wyjaśnienie (Mam nadzieję, że to pomaga)

Więc tu idzie:

  1. UIAlertView jest przestarzała jak zauważył: UIAlertView in Swift
  2. UIAlertController powinien być użyty w iOS8 + , więc aby utworzyć najpierw, musimy go utworzyć, Konstruktor (init) otrzymuje 3 parametry:

2,1 Tytuł: String -> big-pogrubiony tekst wyświetlany na górze okna dialogowego alertu

2,2 komunikatów: String -> mniejszy tekst (dość dużo wyjaśnia to self)

2,3 prefferedStyle:UIAlertControllerStyle - > zdefiniować styl okno dialogowe, w większości przypadków: UIAlertControllerStyle.Alert

  1. teraz rzeczywiście pokazać go do użytkownika, możemy użyć showViewController lub presentViewController i przekazać naszą alertu jako parametr

  2. Aby dodać trochę interakcji z użytkownikiem możemy użyć:

4,1 UIAlertController.addAction do tworzenia przycisków

4.2 UIAlertController.addTextField do tworzenia pól tekstowych

Edit uwaga: przykłady kodu poniżej, zaktualizowana do szybkiego składni 3

Przykład 1: Prosty 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); 
} 

Przykład 2: Dialog z jeden tekst wejściowyField & dwa przyciski

@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); 
} 

Przykład 3: Jeden dostosowane textField wejście & jeden przycisk

@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); 
} 

nadzieję, że pomoże i powodzenia ;-)

+2

Cieszę się, że podzieliłeś się tym, czego się nauczyłeś !! dziękuję bardzo za wyjaśnienia krok po kroku .. jak myślący;) – swiftBoy

+0

http://iosdevcenters.blogspot.in/2016/03/uialertcontroller-in-swift.html –

+0

Używam Xcode 7.3.1 i testuję na iOS9 . Podczas korzystania z showViewController (alert, sender: self) z pierwszego przykładu z UINavigationController (bez tego ok) zaczynało mnie dziwne zachowanie. Dodaje widok alertu do paska nawigacji. Korzystanie z self.presentViewController (alert, animowany: true, zakończenie: zero) działa poprawnie. – pls

10

Instancja UIAlertController można przedstawić modally na ekranie, tak jak każdy inny UIViewController przy użyciu presentViewController: animated: completion: method. Co sprawia, że ​​instancja UIAlertController rozróżnia pracę jako ActionSheet lub jako AlertView jest parametrem stylu, który przekazujesz podczas tworzenia.

Nie więcej delegacja

Jeśli używany UIActionSheet lub UIAlertView, wiesz, że sposób, aby uzyskać wywołania zwrotnego z niego jest dla klasy (w większości przypadków ViewController) w celu wdrożenia protokołu UIActionSheetDelegate lub UIAlertViewDelegate. Istnieje kilka projektów open source, które zastąpiły ten schemat delegacji callbackami opartymi na blokach, ale oficjalne interfejsy API nigdy nie były aktualizowane. UIAlertController nie używa delegacji. Zamiast tego ma zbiór elementów UIAlertAction, które używają zamknięć (lub bloków, jeśli używasz Objective-C) do obsługi danych wprowadzanych przez użytkownika.

Na karcie Akcja

@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) 
} 

Dla AlertView z pola tekstowego

@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) 
} 
+0

Dziękuję za wkład, nawet ja już odpowiedziałem to pół roku temu. Nadal jest to bardzo dobra odpowiedź, więc z przyjemnością głosowałem ;-) BTW, możesz również pokazać alert za pomocą metody showViewController - mniej elastyczny, ale sensowny, gdy ukończenie nie jest potrzebne –

+0

Czy wyświetlenie alertu wymaga tak dużego czytania? NIE. – chrisl08

1

Niektóre składni zmieniła się od oryginalnych odpowiedzi. Oto przykładowy kod, który ostrzega użytkownika, jeśli nie jest zalogowany do usługi iCloud.

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") 
 
      } 
 
     }

Powiązane problemy