最近,做了一个小项目,到目前为止,除了真机测试,其他基本实现。在这里分享一下制作思路。
先看几张图片:
1.主界面,点击右上角的button跳到添加联系人界面
2.添加联系人界面
3.添加联系人过程
4.添加完成
5.假如文本框中没有输入任何数据就点击保存按钮,那么弹出提示框
6.个人资料界面(通过主界面,选中cell时执行的方法跳转到这)
7.是否删除提示框
8.如果点击“果断删除”,则执行下面这个方法,并弹出删除成功提示框,否则,返回个人资料界面
9.点击修改资料按钮,弹出这个界面
10.如果没有对数据进行任何修改就点击保存按钮,则弹出下面这个提示框
11.如果改动了其中任何一条数据,则弹出下面这个提示框
12.在“是否要修改提示框”上点击“我要改”弹出的提示框,如果点击的是“算了,不改你”,则还原数据。
13.修改成功后自动返回主界面,并显示修改的结果
截图演示到这里完毕。
下面分析一下制作通讯录要用到的一些知识,
1.导入系统库(libsqlite3.0.dylib),因为要用到数据库来存放名字、电话等数据
2.UIViewController(主界面、添加界面、浏览界面、修改界面)
3.自定义一个DataBase类,方便以后的数据操作
关键知识点:
在主界面ViewDidLoad方法中声明一个UITableView对象来展示联系人,在ViewWillAppear事件里面对UITableView进行刷新操作。只有这样,才能在每次跳转到第一主界面的时候看到最新的数据。
主界面:
点击添加,跳到添加界面,添加界面有两个textField,在填好数据点击保存的时候,肯定要把这两个数据保存起来。在这里,我用的是协议传值的方法。在主界面类里面,我写了一个插入方法:-(BOOL)insertIntoContactsWithPrex:(NSString *)prex andName:(NSString *)name andNumber:(NSString *)number;
在添加界面点击保存后,返回到主界面,并把值返回给主界面的插入方法,即传回上面的prex、name、和number。添加事件到此结束。
在主界面中,我写了一个获取字母数组的方法:-(NSArray *)selectHeaderNumbers;这个方法很关键,返回的是一个从数据库里面读出来的排好序的无重复的名字的首字母的数组。
首先解释一下我的表结构:contactsTable(ID integer primary key,prex test,name text,number text)
ID:主键 (用处很大,增删改查依据字段)
prex:name的首字母,用处很大,决定了tableView的每个section的header的显示内容
name:姓名
number:电话
我所说的字母数组指的是,假如contactsTable里面有这么几条数据:
ID prex name number
1 M Mary 15633201145
2 K Keni 12352330012
3 Z Zeni 15230112365
4 A Army 18856987458
5 A Any 15644523698
那么,通过我的-(NSArray *)selectHeaderNumbers方法,返回的数组是(A,K,M,Z);这个数组有什么用呢???
用处很大,也是关键的地方,他的个数决定了Section的个数。他的内容决定了Section的头视图里面要显示的内容。到后来,他还是填充数据的依据。。。
没时间了,要回家了,赶车呢,这里,把整个通讯录的最关键方法贴出来,希望大家能看得懂!
#pragma mark 查询分区视图的字母
-(NSArray *)selectHeaderNumbers
{
NSMutableArray *array=[NSMutableArray array];
sqlite3 *db=[Database openDB];
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(db, "select distinct(prex) from contactsTable", -1, &stmt, nil);
if (result==SQLITE_OK) {
while (sqlite3_step(stmt)==SQLITE_ROW) {
char *prex=( char *)sqlite3_column_text(stmt, 0);
//添加无重复字母
if ([array count]==0) {
[array addObject:[NSString stringWithUTF8String:prex]];
}
else
{
int i=0;
int pooo1;
for (i=0; i<[array count]; i++) {
char *pooo=(char *)[[array objectAtIndex:i] UTF8String];
pooo1=(int)*pooo;
if ((int)*prex==pooo1-32||(int)*prex==pooo1+32) {
// NSLog(@"prex=%c",*prex);
break;
}
else
{
// NSLog(@"arrayCount=%d",[array count]);
}
}
if ((int)*prex==pooo1-32){
[array removeObjectAtIndex:i];
[array addObject:[NSString stringWithUTF8String:prex]];
}
else if ((int)*prex==pooo1+32){
// NSLog(@"不作任何事情");
}
else
[array addObject:[NSString stringWithUTF8String:prex]];
// NSLog(@"array=%@",array);
}
}
//对数组内的字母进行从小到大的排序
for (int i=0; i<[array count]-1; i++) {
for (int j= i+1; j<[array count]; j++) {
char *cpI=(char *)[[array objectAtIndex:i] UTF8String];
int cccI=(int)*cpI;
// NSLog(@"cccI=%c,cccI=%d",*cpI,cccI);
char *cpJ=(char *)[[array objectAtIndex:j] UTF8String];
int cccJ=(int)*cpJ;
// NSLog(@"cccJ=%c,cccJ=%d",*cpJ,cccJ);
if (cccI>=97) {
cccI=cccI-32;
}
if (cccJ>=97) {
cccJ-=32;
}
if (cccI>cccJ) {
NSString *temp=[array objectAtIndex:i];
NSString *temp1=[array objectAtIndex:j];
[array replaceObjectAtIndex:i withObject:temp1];
[array replaceObjectAtIndex:j withObject:temp];
temp=nil;
temp1=nil;
}
}
}
// NSLog(@"arrayChange=%@",array);
return array;
}
sqlite3_finalize(stmt);
return nil;
}
#pragma mark 最关键的方法1,得到名字的二维数组
-(NSMutableArray *)findAllNames
{
NSMutableArray *array2=[[NSMutableArray alloc]init];
sqlite3 *db=[Database openDB];
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(db, "select name from contactsTable where prex=? order by name", -1, &stmt, nil);
if (result==SQLITE_OK) {
NSArray *tempArray=[self selectHeaderNumbers];
// NSLog(@"tempArray=%@",tempArray);
for (int i=0; i<[tempArray count]; i++) {
NSMutableArray *array1=[[NSMutableArray alloc]init];
NSString *tempStr=[tempArray objectAtIndex:i];
// NSLog(@"tempStr=%@",tempStr);
sqlite3_bind_text(stmt, 1, [tempStr UTF8String], -1, NULL);
while (sqlite3_step(stmt)==SQLITE_ROW) {
char *rst=(char *)sqlite3_column_text(stmt, 0);
[array1 addObject:[NSString stringWithUTF8String:rst]];
// NSLog(@"array1=%@",array1);
}
sqlite3_finalize(stmt);
sqlite3_prepare_v2(db, "select name from contactsTable where prex=? order by name", -1, &stmt, nil);
[array2 addObject:array1];
[array1 release];
// NSLog(@"array2=%@",array2);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return array2;
}
return nil;
}
通过分区视图首字母数组可以得到ID的数组的数组,,,为什么叫数组的数组?结构是这样的array=((Army,Any),(Keni),(Mary),(Zeni));
我们知道,在代理事件中,返回cell的那个方法里面,要对cell的text赋值,那么,我们可以从数组的数组中取值。。
这就是所有的思路。
注:判断点击的是那个cell的依据是section和row的值,缺一不可。