第一个项目总结

时间:2023-01-13 15:03:02

项目总结

part 1. cocoapod管理

在这一个项目中,所用到的第三方部分是用cocoapod下载的.在podfile中,键入以下代码:

pod 'FMDB'
pod 'MJRefresh'
pod 'AFNetworking'

如果你想用cocoapod下载某一个第三方的SDK却不知道名字是什么,那么你可以在终端键入以下代码:

pod search `关键字`

在这个项目,有一个分享功能,我是用shareSDK来实现分享功能,因为代码已经封装好了,所以使用起来非常简单.如何使用shareSD呢?在这里我就不作说明了,大家可以到http://wiki.mob.com/快速集成指南/这里查看.
如果你要做的项目是需要在Appstore上架的话,那么个人建议不要用类似于shareSKD或者友盟SDK这种第三方,因为在上架时可能会因为某些广告问题而被拒.因此推荐直接到官网去下载对应的SDK,如:腾讯开发者平台http://wiki.open.qq.com/wiki/website/SDK下载下载TencentAthorOpenAPI.

part 2. 使用FMDB进行数据库操作

难点1:在数据库文件已经存在的情况下获取数据库路径

我用的是:

NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"dictionary" ofType:@"sqlite"];

来获取数据库的路径,但是一开始却怎样都获取不了数据库中的数据,排查错误后,发现是数据库文件在项目中的存放位置不正确.如下图所示:
第一个项目总结
在mainBundle中查找文件,必须把文件放到根目录下.如下图:
第一个项目总结

难点2:数据库操作

1.在pinyin表中,前26项是不需要显示在tableView中的,而且相同字母开头的要放在tableView中的同一个分区中,这时候就需要在数据库进行查找数据的操作中进行处理.我使用的是大数组套小数组的方法,截取查找出来的字符串string的第一个字符c,如果字符c与26个字母的其中一个相同,就加进alphbetArray中

NSMutableArray *alphabetAry = [NSMutableArray array];
Model *m1 = [[Model alloc] init];
Model *m2 = [[Model alloc] init];
for (int i = 0; i < 26; i++) {
m1 = array[i];
tmpArray = [NSMutableArray array];
for (int j = 26; j < array.count; j++) {
m2 = array[j];
if ([m1.py_pinyin isEqualToString:[m2.py_pinyin substringWithRange:NSMakeRange(0, 1)]]) {
[tmpArray addObject:array[j]];
}
}
[alphabetAry addObject:tmpArray];

2.每一次的查询,都会把查询的字加入到最近搜索表(Search)中.一开始,我直接在dictionary.sqlite进行insert操作,然后就会报一个no such table的错误提示.于是我改为新建一个数据库,将这一些操作在新建的数据库中执行,即每次进行数据库的增,删,改操作时,都调用以下方法:

+(BOOL)creat{
BOOL flag = NO;
NSString* docsdir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* dbpath = [docsdir stringByAppendingPathComponent:@"user.sqlite"];

FMDatabase* db = [FMDatabase databaseWithPath:dbpath];
[db open];
NSString *sqlCreateTable = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('simp' TEXT,'pinyin' TEXT, 'bushou' TEXT, 'bihua' TEXT)",COLLECTION];

if ([db open]) {
flag = [db executeUpdate:sqlCreateTable];
[db close];
}
return flag;
}

3.向Search表和collection表中插入数据,如果将要插入的数据已经存在,那么放弃当前的插入操作.

BOOL flag = NO;

[DetailModel createSearch];
NSArray *array = [DetailModel findFromSearch];
if (array.count != 0) {
for (int i = 0; i < array.count; i++) {
DetailModel *DM = array[i];
if ([simp isEqualToString:DM.simp]) {
return flag;
}
}
}

part 3. 使用AFNetworking进行网络请求.

难点1:数据处理,字段名要相对应.比如:在网络请求回来的数据中一个title字段,那么相对应地就要有:

@property (nonatomic,strong) NSString *title;

难点2:网络请求的结果有成功和失败两种.当请求成功时,直接把网络请求得到的数据经过处理后再显示在tableView上.当请求失败时,屏幕会显示加载数据失败.

+(void)netWorkWithPath:(NSString *)path Params:(NSDictionary *)params CallBack:(CallBack)callback{

path = [DomainString stringByAppendingString:path];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

callback(responseObject,SuccessType);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:error.debugDescription,@"info", nil];
callback(info,FailedType);
}];
}

执行网络语法方法后,如成功即SuccessType;如失败即FailedType.然后用这两个type进行逻辑处理即可.

part 3. 索引表

索引表的话,IOS也有属于自己的索引表,但是系统的索引表并不能满足我们.那我们怎么做呢?
自定义一个imageView,并在上面设置按钮,点击按钮跳转至对应的分区.

难点:点击按钮后,要根据什么条件才能跳转到对应的分区呢?使用UITableView的scrollToRowAtIndexPath方法.

[myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:分区位置]
atScrollPosition:UITableViewScrollPositionTop animated:YES];

part 4. 字体

在这项目中,我需要用到楷体用为UILabel的字体.但是系统提供的字体中并没有楷体,这时候就需要用第三方字体了,那我们应该怎么做呢?
Step1:下载楷体的ttf文件,导入项目中.Tips:字体下载地址http://font.niutuku.com/TTF/
Step2:在Info.plist文件中,添加新项Fonts provided by application,再新增一个items,即下载的ttf文件名
第一个项目总结

part 5. 音频播放

使用ios自带的多媒体播放声音.由于播放声音时会卡UI,所以要用多线程的方式播放声音.

#import <AVFoundation/AVFoundation.h>
-(void)playSoundAction:(UIButton *)sender{
[NSThread detachNewThreadSelector:@selector(soundAction) toTarget:self withObject:nil];
}

-(void)soundAction{
AVSpeechUtterance *utterance = [AVSpeechUtterance
speechUtteranceWithString:self.sound];

utterance.voice=[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];//设置语言
utterance.volume = 0.5;
utterance.rate = 0.01;
utterance.pitchMultiplier = 1.0;

AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init];
[synth speakUtterance:utterance];
}

part 6. 适配和布局

在iphone6 plus上布局最为困难,用简单的frame布局不能满足需求,因此需要AutoLayout与frame相结合.
分享至QQ,QQ空间等,需要添加白名单.方法为在Info.plist中加入以下代码:

<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>QQ</string>
<key>CFBundleURLSchemes</key>
<array>
<string>QQ41DB72F4</string>
</array>
</dict>
</array>

part 7. 搜索

在文本框中输入单个汉字,部首,拼音,都可得到对应的查询结果.难点:如何检测用户输入的是单个汉字?还是部首?还是拼音?
<1>.检测用户输入的是汉字还是拼音

NSString *string = [textField.text substringToIndex:1];
const char *cString = [string UTF8String];
if (strlen(cString) == 3) {
if (textField.text.length != 1) {
[[[UIAlertView alloc] initWithTitle:@"注意" message:@"请输入单个汉字" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil] show];
flag = NO;
return flag;
}
}

<2>检测用户输入是否为部首

NSArray *array = [Model findBushou];
if([textField.text isEqualToString:m.title]){...}

part 8. 截图

- (UIImage *) captureScreen {
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}