Как создать и получить значение возврата из Cocoa Диалог?

В моем приложении я хочу создать диалоговое окно с одним текстовым полем и кнопкой, через который я могу запросить пользователя и вернуть введенное пользователем значение.

Как это сделать в Cocoa, Objective-C?

Я не нашел для этого предопределенного метода.

Ответы

Ответ 1

Вы можете вызвать NSAlert и поместить NSTextField в качестве аксессуарного вида как это "

- (NSString *)input: (NSString *)prompt defaultValue: (NSString *)defaultValue {
    NSAlert *alert = [NSAlert alertWithMessageText: prompt
                                     defaultButton:@"OK"
                                   alternateButton:@"Cancel"
                                       otherButton:nil
                         informativeTextWithFormat:@""];

    NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
    [input setStringValue:defaultValue];
    [input autorelease];
    [alert setAccessoryView:input];
    NSInteger button = [alert runModal];
    if (button == NSAlertDefaultReturn) {
        [input validateEditing];
        return [input stringValue];
    } else if (button == NSAlertAlternateReturn) {
        return nil;
    } else {
        NSAssert1(NO, @"Invalid input dialog button %d", button);
        return nil;
    }
}

Ответ 2

В OS X 10.10:

    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"Permission denied, sudo password?"];
    [alert addButtonWithTitle:@"Ok"];
    [alert addButtonWithTitle:@"Cancel"];

    NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
    [input setStringValue:@""];

    [alert setAccessoryView:input];
    NSInteger button = [alert runModal];
    if (button == NSAlertFirstButtonReturn) {
        password = [input stringValue];
    } else if (button == NSAlertSecondButtonReturn) {

    }

Ответ 3

Я считаю, что вы ищете лист. Ознакомьтесь с Документами по программированию листов.

Я только что обновил проект Github Sample. Вы можете ввести текст в поле на листе и передать его обратно в главное окно.

В этом примере показано, как создать представление в nib и использовать собственный класс контроллера листа, который использует блок как обратный вызов, вместо того, чтобы создавать и передавать селектор.

Ответ 4

Пример в Swift с Xcode 7.2.1 и OS X 10.11:

let a = NSAlert()
a.messageText = "Please enter a value"
a.addButtonWithTitle("Save")
a.addButtonWithTitle("Cancel")

let inputTextField = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24))
inputTextField.placeholderString = "Enter string"
a.accessoryView = inputTextField

a.beginSheetModalForWindow(self.window!, completionHandler: { (modalResponse) -> Void in
    if modalResponse == NSAlertFirstButtonReturn {
        let enteredString = inputTextField.stringValue
        print("Entered string = \"\(enteredString)\"")
    }
})