2011-09-12 11 views
15

En mi aplicación, quiero crear un cuadro de diálogo con un campo de texto y un botón, , a través del cual puedo solicitar al usuario y recuperar el valor ingresado por el usuario.Cómo crear y obtener el valor devuelto desde el cuadro de diálogo Cocoa?

¿Cómo puedo hacer esto en Cocoa, Objective-C?

No encontré ningún método predefinido para eso.

+2

No hay un método predefinido para eso porque eso es malo IU . Eso debería ser solo un campo. –

Respuesta

40

Puede llamar a un NSAlert y poner el NSTextField ya que es accessoryView como este"

- (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; 
    } 
} 
+0

No se olvide de liberar el NSTextField si lo está creando mediante alloc-init. –

+0

@SebastianHojas ¿todavía necesitan hacer eso si usan ARC para la administración de memoria? – rd108

+0

@ rd108 No se necesita/se permite ninguna versión cuando se utiliza ARC. –

7

creo que lo que busca es una hoja. Echa un vistazo a la documentación Sheet Programming Topics

I' Sólo he actualizado un proyecto Github Sample. Puede ingresar texto en un campo en la hoja y devolverlo a la ventana principal.

Este ejemplo muestra cómo crear una vista en una punta y usar una clase de controlador de hoja personalizada que h usa un bloque como devolución de llamada, en lugar de tener que crear y pasar un selector.

14

EN 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) { 

    } 
4

Un ejemplo en Swift como de Xcode 7.2.1 y 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)\"") 
    } 
}) 
Cuestiones relacionadas