平时的警告框就是弹出一个警告,没想着可以输入,发现能输入文字并处理也是蛮方便的。
以注册一个用户为例,首先看看头文件需要的东西
@interface ViewController :UIViewController<UIAlertViewDelegate>{
UITextField *_username;
UITextField *_password;
UIAlertView *loginAlert;
UIActivityIndicatorView *indicator;
}
@end头文件里需要两个输入框,用户名和密码,然后一个警告框,一个模态进度指示器(这个可以不要),UIAlertViewDelegate这个代理让我们处理点击按钮后的事件
实现扩展(参考书上的例子)
@interface UIAlertView (extended)
- (UITextField *) textFieldAtIndex: (int) index;
- (void) addTextFieldWithValue: (NSString *) value label: (NSString *) label;
@end
然后是实现,先在导航控制器上添加注册按钮,嘿嘿,点击它会触发registerUser这个方法。
self.navigationItem.rightBarButtonItem = [[UIBarButtonItemalloc] initWithTitle:@"注册"style:UIBarButtonItemStyleBorderedtarget:selfaction:@selector(registerUser)];
看方法的实现
//注册用户
- (void)registerUser{
if (!loginAlert) {
loginAlert = [[UIAlertViewalloc]
initWithTitle: @"注册"
message:@"请输入用户信息"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK",nil];
[loginAlertaddTextFieldWithValue:@""label:@"用户名"];
[loginAlertaddTextFieldWithValue:@""label:@"密码"];
// Name field
UITextField *usernameTxt = [loginAlerttextFieldAtIndex:0];
usernameTxt.clearButtonMode =UITextFieldViewModeWhileEditing;
usernameTxt.keyboardType =UIKeyboardTypeAlphabet;
usernameTxt.keyboardAppearance =UIKeyboardAppearanceAlert;
usernameTxt.autocapitalizationType =UITextAutocapitalizationTypeWords;
usernameTxt.autocorrectionType =UITextAutocorrectionTypeNo;
UITextField *passwordTxt = [loginAlerttextFieldAtIndex:1];
passwordTxt.clearButtonMode =UITextFieldViewModeWhileEditing;
passwordTxt.keyboardType =UIKeyboardTypeAlphabet;
passwordTxt.keyboardAppearance =UIKeyboardAppearanceAlert;
passwordTxt.autocapitalizationType =UITextAutocapitalizationTypeWords;
passwordTxt.autocorrectionType =UITextAutocorrectionTypeNo;
}
[loginAlert show];
}看看点击后的效果,额,不会旋转,见谅啊
在代理中处理用户交互后的事件。
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//ok
if (buttonIndex==1) {
NSString *username = [[alertView textFieldAtIndex:0] text];
NSString *password = [[alertView textFieldAtIndex:1] text];
if ([self isInvalidInput:username andText:password]) {
NSMutableString *sql = [NSMutableStringstringWithFormat:@"%@",@"WHERE name = '"];
[sqlappendFormat:@"%@",username];
[sql appendFormat:@"' AND password = '"];
[sqlappendFormat:@"%@' ",password];
//查询数据库中是否已经有这个用户了
User *u = (User *)[UserfindFirstByCriteria:sql];
if (u) {
alertView.message =@"数据库中已有此用户,请重新输入";
[alertViewtextFieldAtIndex:0].text =@"";
[alertViewtextFieldAtIndex:1].text =@"";
[[alertView textFieldAtIndex:0]becomeFirstResponder];
[indicatorstartAnimating];
[selfperformSelector:@selector(finishIndicator)withObject:nilafterDelay:1.0f];
}else{
User *user = [[Useralloc] init];
user.name = username;
user.password = password;
[usersave];
[indicatorstartAnimating];
[selfperformSelector:@selector(successRegister)withObject:nilafterDelay:1.0f];
}
}
//cancel
}elseif(buttonIndex==0){
//用户注册成功的alert
if (alertView.tag ==1000) {
[alertViewrelease];
}
}
}这边顺便提一下模态进度指示器吧,在这里,我的效果是,不管用户输入的正确不正确,警告框都会消失,出现一个模态指示器,大概一秒钟,表示正在处理(我这里实在查询数据库什么的,嘿嘿),处理结束,显示你输入的是否正确,如果输入空值或者已有这个用户了,就显示对应的错误,并且再次显示警告框让你重新输入
看效果,中间那个灰色的菊花
主要是这个方法 [selfperformSelector:@selector(finishIndicator)withObject:nilafterDelay:1.0f];
- (void)finishIndicator{
[indicator stopAnimating];
[loginAlert show];
}
- (void)successRegister{
[indicator stopAnimating];
UIAlertView *sucessAlert = [[UIAlertView alloc]
initWithTitle: nil
message:@"注册成功,请登录"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
sucessAlert.tag = 1000;
[sucessAlert show];
}
- (BOOL)isInvalidInput:(NSString *)name andText:(NSString *)pwd{
if (name == nil || [name isEqualToString:@""]) {
loginAlert.message = @"名字不能为空,请重新输入";
[loginAlert textFieldAtIndex:0].text = @"";
[[loginAlert textFieldAtIndex:0] becomeFirstResponder];
[indicator startAnimating];
[self performSelector:@selector(finishIndicator) withObject:nil afterDelay:0.5f];
return NO;
}
if (pwd == nil || [pwd isEqualToString:@""]) {
loginAlert.message = @"密码不能为空,请重新输入";
[loginAlert textFieldAtIndex:1].text = @"";
[[loginAlert textFieldAtIndex:0] resignFirstResponder];
[[loginAlert textFieldAtIndex:1] becomeFirstResponder];
[indicator startAnimating];
[self performSelector:@selector(finishIndicator) withObject:nil afterDelay:0.5f];
return NO;
}
return YES;
}
看看不成功之后出现的提醒输入用户名
差不多就是到这里,中间对于数据库的操作就忽略吧
2590



被折叠的 条评论
为什么被折叠?



