2015-04-03 5 views
23

У меня есть код для создания и NSAlert в Objective-C, но теперь я хотел бы создать его в Swift.Создайте NSAlert с Swift

Предупреждение должно подтвердить, что пользователь хотел бы удалить документ.

Я бы хотел, чтобы кнопка «удалить» запустила функцию удаления и «отменила», чтобы закрыть предупреждение.

Как это записать в Swift?

Благодаря

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

Вы можете рассмотреть вопрос о том, что 'beginSheetModal (для: completionHandler:)' * не * осуждается, на самом деле это может быть более желательный способ обработки вашего модального диалога (в блоке). Он также будет ближе к старому с помощью 'didEndSelector', и он не остановит все приложение. – Patru

ответ

78

beginSheetModalForWindow:modalDelegate осуждается в OS X 10.10 Йосемити.

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

Это возвращает true или false по выбору пользователя.

NSAlertFirstButtonReturn представляет собой первую кнопку, добавленную в диалог, здесь «ОК».

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

Мы теперь использовать для перечислений стиля начеку и выбора кнопки.

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

Убедитесь, что 'import AppKit' (по крайней мере, в swift 3) – Claude

+1

@Claude Если вы делаете предупреждение, это означает, что вы делаете приложение Cocoa, и это означает, что вы импортируете Cocoa, который уже импортирует AppKit. – Moritz

+0

Возможно, я не должен запускать предупреждение из класса, отличного от VC; но я просто хотел показать ошибку бедного человека. Этот класс util не импортировал ничего, кроме Foundation, поэтому мне нужен был импорт (по крайней мере, он сделал XCode счастливым). – Claude

13

Я думаю, что это может работать для вас ...

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") 
     } 
    }) 
Смежные вопросы