学生管理系统
这次的任务是完成学生管理系统
功能需求也是非常简单,就是增删改查
首先还是要有登录界面,这里的完成和3gshare任务一样,都是协议传值和属性传值的应用,对数组中的数据进行判别。
这里的素材用了share任务的图标素材
登录注册的方法和share任务一样,这个参考share任务
没有什么需要多说的
主页面
这里面显示的是一个动态的cell
cell的数量会随着数组元素的数量发生改变,这也方便我们之后的增删改查排的功能的应用
在主界面的头文件中声明属性
@property (strong, nonatomic) NSMutableArray* nameArray;
@property (strong, nonatomic) NSMutableArray* classArray;
@property (strong, nonatomic) NSMutableArray* scoreArray;
这里一定要用关键字strong,这里如果不用strong的话,当你初始化数组数据后在进入这个函数里面你的数组并不会被识别
- (NSInteger) tableView:(UITableView *)tableView > numberOfRowsInSection:(NSInteger)section { return _nameArray.count;}
这里是要注意的点
在推出各个功能页面的时候要将主页面的数据传入到功能页面中,然后在功能页面中用协议传值再传回来,在协议函数中重新加载tableview
用函数
-
[_studentTableView reloadData];
-
[self.view addSubview:_studentTableView];
增加数据
这里主要展示添加功能的代码,其他功能的代码类似增加功能,这个还是简单的
在增加数据功能的页面中添加3个输入框和两个按钮,这里就不展示了,主要是展示一下,按钮的事件函数
- (void) pressRight {
int boo = 0;
for (int i = 0; i < _arrayName.count; i++) {
if ([_arrayName[i] isEqualToString:_nameTextField.text]) {
boo = 1;
break;
}
}
if (boo == 1) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"警告" message:@"重名了" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:sure];
[self presentViewController:alertController animated:YES completion:nil];
} else {
_arrayOfName = _nameTextField.text;
_arrayOfClass = _classTextField.text;
_arrayOfScore = _scoreTextField.text;
[_delegate AddData:_arrayOfName :_arrayOfClass :_arrayOfScore];
[self dismissViewControllerAnimated:YES completion:nil];
}
_nameTextField.text = nil;
_classTextField.text = nil;
_scoreTextField.text = nil;
}
- (void) pressCancel {
[self dismissViewControllerAnimated:YES completion:nil];
}
在添加按钮的事件中,当你增加完数据后,需要用该页面的代理去使用我们自定义的协议函数
在主页面推出添加页面的函数中一定要设置添加页面的代理,不然添加页面没法用代理去调用该协议函数,值也就传不过去
在代理下面的三行代码是属性传值需要的东西,将主页面的值传到其他页面
然后我们的协议函数也是要在主页面中实现的,去完成这个数组的添加功能,这里我的协议函数里的参数类型是NSString
如果你创建的参数类型是NSMutableArray的,那么可以用注释的方法去实现
删除
这里我设置的学生数据是不允许重名的(就这么点学生还重名emmmm)
如果需要不同班但同名的情况就多添加一个判别就行(额外再加一个输入框)如果添加的班级输入框的话,这里班级输入框里可以是空数据,班级数据只是作为一个辅助判别
- (void) pressRight {
int boo = 0;
int j = 0;
for (int i = 0; i < _arrayOfName.count; i++) {
if ([_arrayOfName[i] isEqualToString:_nameTextField.text]) {
j = i;
boo = 1;
}
}
if (boo == 1) {
[_arrayOfName removeObjectAtIndex:j];
[_arrayOfClass removeObjectAtIndex:j];
[_arrayOfScore removeObjectAtIndex:j];
}
[_delegate DeleteData:_arrayOfName :_arrayOfClass :_arrayOfScore];
[self dismissViewControllerAnimated:YES completion:nil];
_nameTextField.text = nil;
_classTextField.text = nil;
_scoreTextField.text = nil;
}
这里主要说一下,我们之前提到的strong关键字,这里声明的数组也还是必须要这个关键字的,如果不添加,那么转过来的值是无法在按钮事件函数中显示的,在便利数组查找对应的元素的时候,不要一找到,直接进行删除操作,这有可能会导致程序crash,这里的建议是先将要删除的下标存下来,便利完之后再执行删除操作。
更改
这个还是很简单的,也是便利数组就行,一样要注意的是,便利完之后再进行数据的修改,和其他和删除操作差不多
查询
这个应该是唯一一个不需要协议传值的一个页面吧,这里属性传值,传完之后直接用UILabel显示到屏幕上就行了,不需要太多的操作。
排序
这个就是属性传值传过来,然后点击排序按钮,实现按钮事件函数,进行一个简单的冒泡排序,再传回去就行了。
总结
这次的任务总的来说还是很简单的,就几个页面还有很多东西是可以通用的,不过出的一些关于属性关键字的bug让我认识到,我对于属性关键字的知识还是太薄弱了,再去学习一波属性关键字。