如何在可可中显示通知NSTextField的弹出窗口不能为空?

时间:2011-12-02 09:59:25

标签: objective-c cocoa

如何在cocoa中显示通知NSTextField的弹出窗口不能为空?

如果用户单击“应用”并且NSTextField为空,则会显示一个弹出窗口,指出该字段不能为空。

感谢

3 个答案:

答案 0 :(得分:5)

@beryllium的回答只讲述了故事的一部分。

事实上,要正确验证Cocoa中的文本字段输入,您应该使用附加到文本字段单元格的NSFormatter,然后在NSTextFieldDelegate中应该实现该方法:control:didFailToFormatString:errorDescription: 。在此委托方法中,您可以提示用户更正其输入。

您在NSFormatter子类中需要做的就是这样:

@implementation RKTextFormatter

- (NSString*)stringForObjectValue:(id)object 
{
    return (NSString*)object;
}

- (BOOL)getObjectValue:(id*)object forString:(NSString*)string errorDescription:(NSString**)error {

    BOOL stringPassesTest = NO;

    //put your test here 

    if(!stringPassesTest)
    {
        //set the error and return NO
        if(error)
            *error = [NSError errorWithDomain:@"YourErrorDomain" code:1 userInfo:[NSDictionary dictionaryWithObject:@"It's a bingo" forKey:NSLocalizedDescriptionKey]];
        return NO;
    }

    //otherwise, just assign the string
    *object = string;
    return YES;
}
@end

您可以将格式化程序分配到文本字段,如下所示:

RKTextFormatter* formatter = [[RKTextFormatter alloc] init];
[[textField cell] setFormatter:formatter];

然后在你的NSTextFieldDelegate处理任何无效的输入:

- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(NSString *)error
{
//display an alert, obviously it would be more useful than this
NSAlert* alert = [NSAlert alertWithMessageText:@"You have failed me for the last time" defaultButton:@"Revise Input" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@",error];

[alert beginSheetModalForWindow:control.window modalDelegate:nil didEndSelector:NULL contextInfo:NULL];

//if you return NO here, the user's input will not be accepted
//and the field will remain in focus
return NO;
}

答案 1 :(得分:5)

  

如果用户单击“应用”并且NSTextField为空,则应弹出一个弹出窗口   看来该字段不能为空。

拜托,请不要这样做。你可以比那更聪明。

不要花时间编写警告对话框来处理“意外”情况,而是投入创建一种方法来防止问题首先发生:禁用Apply按钮直到在文本字段中输入了正确的值

此外,正如提到的@Rob Keniger,您应该考虑使用NSFormatter来验证输入,以确保它是合适的类型。

答案 2 :(得分:0)

尝试使用此代码:

- (IBAction)pushBtn:(id)sender {

    if(self.textfield.stringValue.length == 0){
        NSAlert * alert = [NSAlert alertWithMessageText:@"Error"
                                          defaultButton:@"OK"
                                        alternateButton:nil
                                            otherButton:nil
                              informativeTextWithFormat:@"Enter a text into text field"];

        [alert beginSheetModalForWindow:self.window
                          modalDelegate:self
                         didEndSelector:@selector(alertDidHidden:)
                            contextInfo:nil]; 
        //[alert runModal]; - more simple way
    }
}

-(void)alertDidHidden:(NSAlert *)alert{

}