这周仿写了oc语言版的学生信息管理系统,实现了增删改查和排序以及字符串的合法判定功能。虽然这个项目比较简单,但是同样学到了oc语言中NSScanner和NSPredicate这两个类和有关于正则表达式的一些知识,这是两个非常好用的类,通过与正则表达式结合,可以非常方便地实现对集合类进行过滤、对字符串进行判定等非常强大的功能,有关这些的知识之后会有博客来详细地讲解,这篇博客先在用到时简单讲解一下。
接下来开始讲解学生信息管理系统
登录注册
这里的登录注册与3Gshare的写法类似,只是多添加了账密合法判定的功能,这里关于字符串合法判定的功能全部放到增加学生的部分去讲解。
主页
主页部分的布局十分简单,就是一个数据视图和下方一系列功能按钮。接下来一次讲解各个功能。
增加
增加功能在按下增加按钮后,要将输入的信息,添加到数组中,并且更新数据视图数据源,重新加载数据视图,这里还需要在前后界面进行传值,以确保增加界面与其他界面学生信息同步,这些都是之前写过的功能,这里主要讲一下非法输入的判定。
- (void)confirm {
BOOL namePerfect = [self nameInputShouldChinese:self.nameTextfield];
BOOL classPerfect = [self classInputShouldNumber:self.classTextfield];
BOOL numberPerfect = [self numberInputShouldNumber:self.numberTextfield];
if ([self.nameTextfield.text isEqualToString:@""] || [self.classTextfield.text isEqualToString:@""] || [self.numberTextfield.text isEqualToString:@""]) {
UIAlertController* alertFailed = [UIAlertController alertControllerWithTitle:@"添加失败!" message:@"不允许有空的输入!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertFailed addAction:confirm];
[self presentViewController:alertFailed animated:YES completion:nil];
return;
}
if (!namePerfect) {
UIAlertController* alertFailed = [UIAlertController alertControllerWithTitle:@"添加失败!" message:@"只能输入中文名!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertFailed addAction:confirm];
[self presentViewController:alertFailed animated:YES completion:nil];
return;
}
if (!classPerfect) {
UIAlertController* alertFailed = [UIAlertController alertControllerWithTitle:@"班级格式不规范!!!" message:@"请按示例输入:计科2302" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertFailed addAction:confirm];
[self presentViewController:alertFailed animated:YES completion:nil];
return;
}
if (!numberPerfect) {
UIAlertController* alertFailed = [UIAlertController alertControllerWithTitle:@"学号格式不规范!!!" message:@"请输入以24开头的五位数字!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertFailed addAction:confirm];
[self presentViewController:alertFailed animated:YES completion:nil];
return;
}
for (int i = 0; i < self.numberMutableArray.count; i++) {
if ([self.numberMutableArray[i] isEqualToString:self.numberTextfield.text]) {
UIAlertController* alertFailed = [UIAlertController alertControllerWithTitle:@"存在相同学号!!!" message:@"请检查当前学号!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
return;
}];
[alertFailed addAction:confirm];
[self presentViewController:alertFailed animated:YES completion:nil];
return;
}
}
[self.nameMutableArray addObject:self.nameTextfield.text];
[self.classMutableArray addObject:self.classTextfield.text];
[self.numberMutableArray addObject:self.numberTextfield.text];
[self.tableview reloadData];
[self.delegate pass:self.nameMutableArray And:self.classMutableArray And:self.numberMutableArray];
}
#pragma mark tellTheTextOfTextfield
- (BOOL)nameInputShouldChinese:(UITextField*)textfield {
NSString *regex = @"[\u4e00-\u9fa5]+";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if (![pred evaluateWithObject:textfield.text]) {
return NO;
}
return YES;
}
- (BOOL)numberInputShouldNumber:(UITextField*)textfield {
NSString *regex = @"^24\\d{3}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if (![pred evaluateWithObject:textfield.text]) {
return NO;
}
return YES;
}
- (BOOL)classInputShouldNumber:(UITextField*)textfield {
NSString *regex = @"^[\u4e00-\u9fa5]{2,4}\\d{4}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if (![pred evaluateWithObject:textfield.text]) {
return NO;
}
return YES;
}
这里使用下方代码封装的三个函数,可以很简便的实现对字符串合法性的判定,函数中用到的主要是NSpredicate和正则表达式。
在添加学生时,首先对文本输入框判空,不允许有任何一项为空,接着再设置三个BOOL类变量,调用函数为其赋值,根据BOOL变量的状态,来执行接下来的操作。还需要注意,由于学号不可能重复,所以需要遍历存放学号的数组,将当前输入的学号与数组中每一个学号比较,如果有相同的,则添加失败跳出函数。
删除
删除功能比较简单,输入学号后遍历数组,找到该学生并删除对应数据即可,这里不需要做非法判定,如果有非法输入就找不到该学生。
更改
这里更改的逻辑是:输入学号,更改班级和姓名,因为学号是不可能改变的,只有班级和姓名可能改变。那其实要实现就与删除功能类似,只需要根据学号找到对应学生数据时,更改学生的姓名和班级即可。这里同样要做非法输入判定。
查找
这里的查找实现的是班级和姓名都可以查找,也就是说当输入班级和姓名时,叫这个名字的同学和这个班的同学都会出现,所以要注意判重,不然我在输入一个人的姓名和班级时,就会弹出两个这个人的单元格。这里不需要传值出去,也不需要判定非法输入。
排序
排序功能比较简单,这里实现的是按学号排序,也可以去实现通过给班级排序,来将不同班级学生归类,通过冒泡排序就可以实现了
退出
退出功能很简单,通过exit()函数就可以实现了
总结
这个项目虽然很简单,但是还是让我学到了一些很有用的知识的,有关NSPredicate和正则表达式的知识,之后会再继续深入学习