2015-04-03 12 views
23

Ho il codice per creare e NSAlert in Objective-C ma vorrei ora crearlo in Swift.Creare un NSAlert con Swift

L'avviso è per confermare che l'utente desidera eliminare un documento.

Vorrei il pulsante "cancella" per eseguire la funzione di cancellazione e "cancella" per eliminare l'avviso.

Come posso scrivere in Swift?

Grazie

NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
    [alert addButtonWithTitle:@"Delete"]; 
    [alert addButtonWithTitle:@"Cancel"]; 
    [alert setMessageText:@"Delete the document?"]; 
    [alert setInformativeText:@"Are you sure you would like to delete the document?"]; 
    [alert setAlertStyle:NSWarningAlertStyle]; 
    [alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil]; 
+0

Si potrebbe prendere in considerazione che 'beginSheetModal (per: completionHandler:)' * non * è deprecato, in realtà può essere il modo più desiderabile per gestire la finestra di dialogo modale (in un blocco). Sarebbe anche più vicino al vecchio modo con 'didEndSelector' e non fermerà l'intera applicazione. – Patru

risposta

78

beginSheetModalForWindow:modalDelegate è deprecato in OS X 10.10 Yosemite.

Swift 2

func dialogOKCancel(question: String, text: String) -> Bool { 
    let alert: NSAlert = NSAlert() 
    alert.messageText = question 
    alert.informativeText = text 
    alert.alertStyle = NSAlertStyle.WarningAlertStyle 
    alert.addButtonWithTitle("OK") 
    alert.addButtonWithTitle("Cancel") 
    let res = alert.runModal() 
    if res == NSAlertFirstButtonReturn { 
     return true 
    } 
    return false 
} 

let answer = dialogOKCancel("Ok?", text: "Choose your answer.") 

Ciò restituisce true o false in base alla scelta dell'utente.

NSAlertFirstButtonReturn rappresenta il primo pulsante aggiunto alla finestra di dialogo, qui "OK".

Swift 3

func dialogOKCancel(question: String, text: String) -> Bool { 
    let alert = NSAlert() 
    alert.messageText = question 
    alert.informativeText = text 
    alert.alertStyle = NSAlertStyle.warning 
    alert.addButton(withTitle: "OK") 
    alert.addButton(withTitle: "Cancel") 
    return alert.runModal() == NSAlertFirstButtonReturn 
} 

let answer = dialogOKCancel(question: "Ok?", text: "Choose your answer.") 

Swift 4

Ora usa le enumerazioni per lo stile di allerta e la selezione del pulsante.

func dialogOKCancel(question: String, text: String) -> Bool { 
    let alert = NSAlert() 
    alert.messageText = question 
    alert.informativeText = text 
    alert.alertStyle = .warning 
    alert.addButton(withTitle: "OK") 
    alert.addButton(withTitle: "Cancel") 
    return alert.runModal() == .alertFirstButtonReturn 
} 

let answer = dialogOKCancel(question: "Ok?", text: "Choose your answer.") 
+1

Assicurati di "importare AppKit' (almeno in swift 3) – Claude

+1

@Claude Se stai facendo un avviso significa che stai facendo un'app Cocoa e significa che stai importando Cocoa che importa già AppKit. – Moritz

+0

Forse non dovrei attivare l'avviso da una classe non VC; ma volevo solo la visualizzazione degli errori di un povero uomo. Questa classe util non ha importato nulla tranne Foundation, quindi ho avuto bisogno dell'importazione (almeno ha reso XCode felice). – Claude

13

Penso che questo possa funzionare per voi ...

let a = NSAlert() 
    a.messageText = "Delete the document?" 
    a.informativeText = "Are you sure you would like to delete the document?" 
    a.addButtonWithTitle("Delete") 
    a.addButtonWithTitle("Cancel") 
    a.alertStyle = NSAlertStyle.WarningAlertStyle 

    a.beginSheetModalForWindow(self.view.window!, completionHandler: { (modalResponse) -> Void in 
     if modalResponse == NSAlertFirstButtonReturn { 
      print("Document deleted") 
     } 
    })