想實現這樣一個NSTextField,當選擇了隱藏密碼時,該文本框中的內容顯示成NSSecureTextField的樣子;當選擇不隱藏時,該文本框的內容按照標準NSTextField內容顯示。
效果如圖:隱藏密碼時:
不隱藏密碼時:
剛開始試圖重載NSTextFieldCell,在drawWithFrame中根據是否顯示密碼的標識來更改cell,然後使用setcell動態加載。
這樣做NSTextField不僅消失了邊框,而且無法輸入。
後面我想了一個很笨的方法來實現:即在界面上顯示NSTextField的地方,重疊一個NSSecureTextField和一個NSTextField。
當需要隱藏密碼時,隱藏NSTextField,顯示NSSecureTextField,並將後者設置成firstResponder。
反之,採用類似的設定。
下面將具體實現描述一下:
首先在xib文件中將NSTextField,NSSecureTextField,checkBox Button,用來說明的label等擺放好。
然後在.h文件中加入聲明,並完成xib中控件與.h中標識的鏈接。
其中NSTextField和NSSecureTextField重疊在一起,但是各自有不同的標識,分別爲_textField和_secureTextField.
checkBox的動作綁定checkHideCode。
@interface ShowSecureTextAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
IBOutlet NSSecureTextField *_secureTextField;
IBOutlet NSTextField *_textField;
IBOutlet NSButton *_chkBtn;
}
-(IBAction)checkHideCode:(id)sender;
在.m文件中的代碼如下:
默認是隱藏密碼。
-(void)awakeFromNib
{
[_textField setHidden:YES];
[_secureTextField setHidden:NO];
[_secureTextField becomeFirstResponder];
[_chkBtn setState:NSOnState];
}
-(IBAction)checkHideCode:(id)sender
{
if ([_chkBtn state] == NSOnState)
{
NSString *str = [_textField stringValue];
[_textField setHidden:YES];
[_secureTextField setHidden:NO];
[_secureTextField setStringValue:str];
[_secureTextField becomeFirstResponder];
}
else
{
NSString *str = [_secureTextField stringValue];
[_secureTextField setHidden:YES];
[_textField setHidden:NO];
[_textField setStringValue:str];
[_textField becomeFirstResponder];
}
}
ok。保存編譯運行。隨意點擊checkBox,可以查看和隱藏密碼啦。