2010-02-04 4 views
3

Je souhaite demander des informations supplémentaires à l'utilisateur pendant le NSOpenPanel, mais je dois valider cette information avant la fin de l'ouverture de l'écran. Par exemple, je souhaite autoriser l'utilisateur à ajouter une note sur le fichier dans la sélection du panneau ouvert, mais doit valider que ce commentaire n'est pas vide.Validation de l'entrée dans la vue accessoire NSOpenPanel

J'ai une vue accessoire dont les contrôles sont liés à un NSObjectController dont l'objet de contenu est à son tour lié à l'objet représenté du NSViewController que j'utilise pour charger la plume de la vue accessoire. L'objet représenté a des méthodes de validation conformes à NSKeyValueCoding (par exemple -(BOOL)validateKey:error:). La validation est correctement gérée (et les violations signalées via une boîte de dialogue modale) lorsque l'utilisateur modifie les valeurs des contrôles.

Mon problème est que je ne peux pas comprendre comment obtenir la validation si l'utilisateur n'entre pas rien dans la vue des accessoires. Par exemple, disons que j'ai un seul champ de texte dans la vue accessoire dont l'objet lié valide que le texte a une longueur différente de zéro. Si l'utilisateur entre le texte (la validation réussit), puis supprime le texte, la validation échoue et l'utilisateur est présenté avec l'erreur. Cependant, si l'utilisateur n'entre pas de texte, le panneau ouvert se ferme sans erreur. Comment puis-je valider que le texte est différent de avant le panneau ouvert se ferme?

Répondre

3

Vous devez enregistrer votre contrôleur en tant que délégué du panneau ouvert, puis implémenter la méthode de délégation -panel:isValidFilename:. Renvoyer NO à partir de cette méthode vous permet d'empêcher la fermeture de la boîte de dialogue ouverte:

- (BOOL)panel:(id)sender isValidFilename:(NSString *)filename 
{ 
    //validate the field in some way, in this case by making sure it's not empty 
    if([[textField stringValue] length] == 0) 
    { 
     //let the user know they need to do something 
     NSAlert *alert = [[NSAlert alloc] init]; 
     [alert setMessageText:@"Please enter some text."]; 
     [alert addButtonWithTitle:@"OK"]; 
     [alert beginSheetModalForWindow:sender modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; 
     //return NO to prevent the open panel from completing 
     return NO; 
    } 
    //otherwise, allow the open panel to close 
    return YES; 
} 
Questions connexes