ios 项目总结二
项目基本上完成:总结下:
代码写的比较乱,许多东西的代码全部写在了一个类了,导致一个类的代码行数超过千行,,发现写的时候容易,到后面再看的,维护的话出很麻烦, 所以以后最近写成工具类,多思考,这样代码才会整洁,有效,效率高,还有就是写代码前,要多思考,比没有目的的写代码强百倍,多思考,才会进步的更快,下面就是项目中常用的demo。
1 [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];//去掉导航
2 运用了UIviewcontrol添加子的 UIviewcontrol的类的方法实现:实现方法就是定义个父的UIViewController,然后添加子的UIViewController,添加的方式就是:
- (void)viewDidLoad { [super viewDidLoad]; UIView *contentView = [[UIView alloc]initWithFrame:CGRectMake(0, 60, 1024, 768-60)]; [contentView setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:contentView]; chanPinVC=[[ChanPinTuiJian_ViewController alloc]init]; [self addChildViewController:chanPinVC]; liuXingVC =[[LiuXing_ViewController alloc]init]; [self addChildViewController:liuXingVC]; guanZhuVC=[[GuanZhu_ViewController alloc]init]; [self addChildViewController:guanZhuVC]; vipVC=[[Vip_ViewController alloc]init]; [self addChildViewController:vipVC]; [contentView addSubview:chanPinVC.view]; currentViewController=chanPinVC; }
页面的跳转是在父的viewController里面进行的,
//页面跳转button点击事件 -(void)click:(UIButton *)sender{ //移除掉添加在产品页面的单品View; if (sender.tag==3) { [[NSNotificationCenter defaultCenter]postNotificationName:@"dataOne" object:nil]; } if ((currentViewController == chanPinVC && sender.tag == 1)||(currentViewController == liuXingVC && sender.tag == 2)||(currentViewController == guanZhuVC && sender.tag == 3)||(currentViewController == vipVC && sender.tag == 4)) { return;//此方法判断是防止重复点击 } UIViewController *oldViewController=currentViewController; switch (sender.tag) { case 1:{ //产品推荐 页面跳转的方法用的是transitionWithView [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ imagejiao.frame=CGRectMake(152, 58-8, 19, 8); }completion:NULL]; [self transitionFromViewController:currentViewController toViewController:chanPinVC duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ } completion:^(BOOL finished) { if (finished) { currentViewController=chanPinVC; }else{ currentViewController=oldViewController; } }]; } break; case 2:{ //流行趋势 [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ imagejiao.frame=CGRectMake(204+32, 58-8, 19, 8); }completion:NULL]; [self transitionFromViewController:currentViewController toViewController:liuXingVC duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ } completion:^(BOOL finished) { if (finished) { currentViewController=liuXingVC; }else{ currentViewController=oldViewController; } }]; } break; case 3:{ //产品关注 [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ imagejiao.frame=CGRectMake(290+32, 58-8, 19, 8); }completion:NULL]; [self transitionFromViewController:currentViewController toViewController:guanZhuVC duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{} completion:^(BOOL finished){ if (finished) { currentViewController=guanZhuVC; }else{ currentViewController=oldViewController; } }]; } break; case 4:{ //vip服务 [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{ imagejiao.frame=CGRectMake(376+32, 58-8, 19, 8); }completion:NULL]; [self transitionFromViewController:currentViewController toViewController:vipVC duration:0.2 options:UIViewAnimationOptionLayoutSubviews animations:^{} completion:^(BOOL finished){ if (finished) { currentViewController=vipVC; }else{ currentViewController=oldViewController; } }]; } break; default: break; } }
3 一个页面的多个tableview的实现:tableview的判断方法是根据tableview==的方法,判断,还有就是重绘tableview的时候,里面的数据源显示的时候有时会出现混乱,所以解决的方法就是把tableview的数据在cell方法中,写在if(cell==nil){}的外面,还有就是一个 NSString *identity=[NSString stringWithFormat:@"%d%d",indexPath.section,indexPath.row];这样写,
4 扫描二维码的实现:添加 libiconv.dylib库,还有就是ZBarSDK库,调用的方法:
//二维码显示 -(void)saoMiao{ ZBarReaderViewController *reader = [ZBarReaderViewController new]; reader.readerDelegate = self; // reader.readerView.torchMode = 1; ZBarImageScanner *scanner = reader.scanner; reader.supportedOrientationsMask = UIInterfaceOrientationPortrait; [scanner setSymbology: ZBAR_ISBN13 & ZBAR_ISBN10 config: ZBAR_CFG_ENABLE to: 1]; NSArray *ary=[reader.view subviews];//这个方法主要是去掉里面title 的button按钮的 UIView *readerSubview=[ary objectAtIndex:1]; NSArray *ary11=[readerSubview subviews]; UIToolbar *tooB=[ary11 objectAtIndex:0]; tooB.backgroundColor=[UIColor whiteColor]; NSArray *ary22=[tooB subviews]; UIButton *btn=[ary22 objectAtIndex:3]; btn.hidden=YES; UIView *bgview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; //bgview.alpha = 0.3; bgview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"zz.png"]];加一个全屏的框 [reader.view addSubview:bgview]; [self presentViewController:reader animated:YES completion:nil]; } - (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info { // 得到条形码结果 id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; ZBarSymbol *symbol = nil; for(symbol in results) // EXAMPLE: just grab the first barcode break; // 将获得到条形码显示到我们的界面上 textFields.text = symbol.data; // 扫描时的图片显示到我们的界面上 // resultImage.backgroundColor = [UIColor colorWithPatternImage:[info objectForKey: UIImagePickerControllerOriginalImage]]; // resultImage = [info objectForKey: UIImagePickerControllerOriginalImage]; // 扫描界面退出 // [reader dismissModalViewControllerAnimated: YES]; // [self performSelector:@selector(jianPanSearch) withObject:Nil afterDelay:0]; [self dismissViewControllerAnimated:NO completion:nil]; [self jianPanSearch]; }
5 实现九宫格的button,或者各种uiview 的实现简单的算法实现:
int width = scroll.frame.size.width/4; for (int i=0; i<arrysImage.count; i++) { int t=i/4;//t是行数,d是列数 int d=fmod(i, 4); UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(width*d +d*5+10, 300 * t+t*50, 225,300)]; btn.tag=i+5000; [btn addTarget:self action:@selector(imageClcik:) forControlEvents:UIControlEventTouchUpInside]; [scroll addSubview:btn]; [btn setImage:[UIImage imageWithData:[DataPist stringToByte:imageNames]] forState:UIControlStateNormal]; }
6 实现简单的上来刷新,用的也是EGORefreshTableHeaderView,这个比较简单的,就是先初始化,然后调用那几个方法,
//此方法是开始读取数据 - (void)reloadTableViewDataSource{ // should be calling your tableviews data source model to reload // put here just for demo _reloading = YES; NSLog(@"star"); number = arrysImage.count; // NSLog(@"%d",number); //打开线程,读取网络图片 [NSThread detachNewThreadSelector:@selector(requestLoadData) toTarget:self withObject:nil]; } //此方法是结束读取数据 结束读取数据在是在要显示的 view 的显示后面方法 - (void)doneLoadingTableViewData{ // model should call this when its done loading _reloading = NO; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:scroll]; NSLog(@"end"); } #pragma mark - #pragma mark UIScrollViewDelegate Methods - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; } #pragma mark - #pragma mark EGORefreshTableHeaderDelegate Methods - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{ [self reloadTableViewDataSource]; //[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:0.5]; } - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{ return _reloading; // should return if data source model is reloading } - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{ return [NSDate date]; // should return date data source was last changed }
还有一个就是加载数据后,显示在页面的view要调用 [scroll setContentSize:CGSizeMake(0,350*(arrysImage.count/4))];
_refreshHeaderView.frame=CGRectMake(0, scroll.contentSize.height, 1024, 700);,这个比较麻烦的就是_refreshHeaderView最后位置的判断,
还有一个问题就是数据的更新请求数据arrayByAddingObjectsFromArray方法,实现
-(void)requestLoadData{ NSString *post; post=[NSString stringWithFormat:@"%@/api/pull_down.php?page_number=%d&is_upcoming=%@",[DataPist shared].ipString,tag,type]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:post]]; NSURLResponse *urlResponce=nil; NSError *error=nil; NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponce error:&error]; if (error) { UIAlertView *alter=[[UIAlertView alloc]initWithTitle:@"提示" message:@"当前网络不可用,请稍后再试" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alter show]; return; } NSArray *arrys= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSArray *currentArrys=[[NSArray alloc]initWithArray:arrys]; if (arrys.count==0) { [self doneLoadingTableViewData]; // [_refreshHeaderView removeFromSuperview]; return; } arrysImage=[arrysImage arrayByAddingObjectsFromArray:currentArrys];//数组的组合添加在尾部 [self performSelectorOnMainThread:@selector(initImage:) withObject:@"smallImage" waitUntilDone:YES]; tag=tag+20; }
7 在ios中操作plist实现删除,添加,操作的实现,主要是参考别人的方法,谢谢那位高手,后面有时间找出他的文章,贴出来,写在一个类了,里面.h文件
@interface SavePList : NSObject + (SavePList *)sharedInstance; -(NSString*)getPlistPath:(NSString *)PlistName; -(BOOL) isPlistFileExists:(NSString *)PlistName; -(void)initPlist:(NSString *)plistName; ////判断key的书是否存在 -(BOOL)isBookExistsForKey:(NSString*)key name:(NSString *)plistName; -(void)removeBookWithKey:(NSString *)key name:(NSString *)plistName; -(void)deletePlist:(NSString *)plsitName; -(void)writePlist:(NSMutableDictionary*)dictionary forKey:(NSString *)key plsitName:(NSString *)plistName; -(NSMutableDictionary*)readPlist:(NSString *)plistName; -(void)readPlist:(NSMutableDictionary **)dictionary name:(NSString *)plistName; -(void)replaceDictionary:(NSMutableDictionary *)newDictionary withDictionaryKey:(NSString *)key name:(NSString *)plistName; @end
.m文件
#import "SavePList.h" @implementation SavePList static SavePList *g_instance = nil; + (SavePList *)sharedInstance { @synchronized(self) { if ( g_instance == nil ) { g_instance = [[self alloc] init]; } } return g_instance; } //获得plist路径 -(NSString*)getPlistPath:(NSString *)PlistName{ // //沙盒中的文件路径 // NSArray *storeFilePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // NSString *doucumentsDirectiory = [storeFilePath objectAtIndex:0]; // NSString *plistPath =[doucumentsDirectiory stringByAppendingPathComponent:@"data.plist"]; //根据需要更改文件名 // return plistPath; //写入library NSString *fileNamepath; NSString *path=[NSHomeDirectory() stringByAppendingPathComponent:@"Library"]; NSString *pathNext = [NSString stringWithFormat:@"%@/Caches",path]; if ([PlistName isEqualToString:@"dataOne"]) { fileNamepath=[pathNext stringByAppendingPathComponent:@"dataOne.plist"]; } if ([PlistName isEqualToString:@"dataTwo"]) { fileNamepath=[pathNext stringByAppendingPathComponent:@"dataTwo.plist"]; } if ([PlistName isEqualToString:@"dataThree"]) { fileNamepath=[pathNext stringByAppendingPathComponent:@"dataThree.plist"]; } if ([PlistName isEqualToString:@"numpluse"]) { fileNamepath=[pathNext stringByAppendingPathComponent:@"numpluse.plist"]; } return fileNamepath; } //判断沙盒中名为plistname的文件是否存在 -(BOOL) isPlistFileExists:(NSString *)PlistName{ NSString *plistPath =[[SavePList sharedInstance]getPlistPath:PlistName]; NSFileManager *fileManager = [NSFileManager defaultManager]; if( [fileManager fileExistsAtPath:plistPath]== NO ) { NSLog(@"not exists"); return NO; }else{ return YES; } } -(void)initPlist:(NSString *)plistName{ NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; //如果plist文件不存在,将工程中已建起的plist文件写入沙盒中 if (! [[SavePList sharedInstance] isPlistFileExists:plistName]) { //从自己建立的plist文件 复制到沙盒中 ,方法一 if ([plistName isEqualToString:@"dataOne"]) { NSError *error; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *bundle = [[NSBundle mainBundle] pathForResource:@"dataOne" ofType:@"plist"]; [fileManager copyItemAtPath:bundle toPath:plistPath error:&error]; } if ([plistName isEqualToString:@"dataTwo"]) { NSError *error; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *bundle = [[NSBundle mainBundle] pathForResource:@"dataTwo" ofType:@"plist"]; [fileManager copyItemAtPath:bundle toPath:plistPath error:&error]; } if ([plistName isEqualToString:@"dataThree"]) { NSError *error; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *bundle = [[NSBundle mainBundle] pathForResource:@"dataThree" ofType:@"plist"]; [fileManager copyItemAtPath:bundle toPath:plistPath error:&error]; } if ([plistName isEqualToString:@"numpluse"]) { NSError *error; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *bundle = [[NSBundle mainBundle] pathForResource:@"numpluse" ofType:@"plist"]; [fileManager copyItemAtPath:bundle toPath:plistPath error:&error]; } //方法二 // NSString *path = [[NSBundle mainBundle] pathForResource:@"WBBooks"ofType:@"plist"]; // NSMutableDictionary *activityDics = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; // [activityDics writeToFile:plistPath atomically:YES]; } } //判断key的书是否存在 -(BOOL)isBookExistsForKey:(NSString*)key name:(NSString *)plistName{ NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; NSMutableDictionary *WBBooksDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; //根目录下存在名为bookname的字典 if ([WBBooksDictionary objectForKey:key]) { return YES; }else{ return NO; } } //根据key值删除对应书籍 -(void)removeBookWithKey:(NSString *)key name:(NSString *)plistName{ NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; NSMutableDictionary *WBBooksDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; [WBBooksDictionary removeObjectForKey:key]; [WBBooksDictionary writeToFile:plistPath atomically:YES]; //删除后重新写入 NSLog(@"删除后%@",WBBooksDictionary); } //删除plistPath路径对应的文件 -(void)deletePlist:(NSString *)plsitName{ NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plsitName]; [fileManager removeItemAtPath:plistPath error:nil]; } //将dictionary写入plist文件,前提:dictionary已经准备好 -(void)writePlist:(NSMutableDictionary*)dictionary forKey:(NSString *)key plsitName:(NSString *)plistName{ NSMutableDictionary *plistDictionary = [[NSMutableDictionary alloc]init]; //如果已存在则读取现有数据 if ([[SavePList sharedInstance]isPlistFileExists:plistName]) { plistDictionary = [[SavePList sharedInstance]readPlist:plistName]; } //增加一个数据 [plistDictionary setValue:dictionary forKey:key]; //在plistDictionary增加一个key为...的value NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; NSLog(@"---%@",plistPath); if([plistDictionary writeToFile:plistPath atomically:YES]){ NSLog(@"write ok!"); }else{ NSLog(@"ddd"); } NSLog(@"plistDictionary=%@",plistDictionary); } // -(NSMutableDictionary*)readPlist:(NSString *)plistName{ NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; NSMutableDictionary *resultDictionary = [[NSMutableDictionary alloc]initWithContentsOfFile:plistPath]; return resultDictionary; } //读取plist文件内容复制给dictionary 备用 -(void)readPlist:(NSMutableDictionary **)dictionary name:(NSString *)plistName{ NSString *plistPath = [[SavePList sharedInstance] getPlistPath:plistName]; *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; } //更改一条数据,就是把dictionary内key重写 -(void)replaceDictionary:(NSMutableDictionary *)newDictionary withDictionaryKey:(NSString *)key name:(NSString *)plistName{ [[SavePList sharedInstance]removeBookWithKey:key name:plistName]; [[SavePList sharedInstance]writePlist:newDictionary forKey:key plsitName:plistName]; } -(NSInteger)getBooksCount:(NSString *)plistName{ NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; dictionary = [[SavePList sharedInstance] readPlist:plistName]; return [dictionary count]; } @end
因为我建立了3个plist文件,所以再项目中建立了3个plist ,有的问题的是,我必须得在项目中把3个对应名字的空的plist先建号,然后才能用,这点当时因为没时间多想,就那样了,上面主要是添加,删除,操作了,,
8 遍历沙盒文件夹里面的所有文件方法
- (NSArray*) allFilesAtPath:(NSString*) dirString {
// NSMutableArray* array = [NSMutableArray arrayWithCapacity:10];
NSFileManager* fileMgr = [NSFileManager defaultManager];
NSArray* tempArray = [fileMgr contentsOfDirectoryAtPath:dirString error:nil];
return tempArray;
}
9 删除沙盒下面所有文件夹的方法
//删除所有documents中的数据
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
// NSLog(@"%@",file);
if (file.count != 0) {
for (int i = 0; i < file.count; i++) {
NSString *str = [NSString stringWithFormat:@"%@/%@",myDirectory,[file objectAtIndex:i]];
[fileManage removeItemAtPath:str error:Nil];
}
}
10 在一个UIViewController里面点击按钮添加一个view
detailChanPinView=[[DetailChanPinView alloc]initWithFrame:CGRectMake(0, 0, 1024, self.view.frame.size.height)]; detailChanPinView.BigImageName=bigName; [UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self.view addSubview:detailChanPinView]; ; } completion:^(BOOL fisish){ }];
当时主要问题是传值的问题,不知道怎么搞的一直无法传过去,最后用简单的方法 NSUserDefaults,和消息注册实现的,
先写这吧,后面在写了,