iOS 開發知識點 2—— 登錄界面#
按鈕的實時響應:登錄的時候,需要當用戶有輸入時按鈕才能響應(可點擊),如果有一個輸入框為空,則按鈕不可響應。以前我以為用的是 textfield 的代理方法直接判斷,後來發現那樣不好。有另一種方法
// 首先給textfield添加addTarget方法,注意最後的controlEvents是EditingChanged
[self.accountTextField addTarget:self action:@selector(handleTextDidChange:) forControlEvents:UIControlEventEditingChanged];
[self.passwordTextField addTarget:self action:@selector(handleTextDidChange:) forControlEvents:UIControlEventEditingChanged];
// 然後實現這個方法
- (void)handleTextDidChange:(id)sender
{
NSString * accountStr = self.accountTextField.text;
NSString * passwordStr = self.passwordTextField.text;
if (accountStr.length > 0 && passwordStr.length > 0) {
// 登錄可響應
self.loginButton.userInteractionEnabled = YES;
[self.loginButton setTitleColor:btnEnabledColor forState:UIControlStateNormal];
} else {
// 登錄不可響應
self.loginButton.userInteractionEnabled = NO;
[self.loginButton setTitleColor:btnUnabledColor forState:UIControlStateNormal];
}
}
輸入框長度限制:當輸入手機號或者驗證碼時,通常會有長度限制,我們想要的是,11 位的手機號或者 6 位的驗證碼,所以最多只能輸入這麼多,當超出時,不能再顯示,便於用戶理解。
// 這是通過textField的代理方法實現的
_smsPhoneTextField.delegate = self;
_smsCirtifyTextField.delegate = self;
#pragma mark - 輸入長度限制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string isEqual:@"\n"]) {
return YES;
}
NSString * aString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if (textField == _smsCirtifyTextField) {
if (aString.length > 6) {
aString = [aString substringToIndex:6];
return NO;
}
}
if (textField == _smsPhoneTextField) {
if (aString.length > 11) {
aString = [aString substringToIndex:11];
return NO;
}
}
return YES;
}
手機號的正則表達式:我收藏了一個常用的正則表達式的博客,很不錯,只需要針對自己的需求在他的基礎上改一下,就可以使用
常用的正則表達式
#pragma mark - 手機號驗證
- (BOOL)validateMobile:(NSString *)mobile
{
// 手機號以13、15、18、17開頭,八個 \d 數字字符
NSString * phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9])|(17[0,0-9]))\\d{8}$";
NSPredicate * phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
return [phoneTest evaluateWithObject:mobile];
}