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,和消息注册实现的,

先写这吧,后面在写了,



  

原文地址:https://www.cnblogs.com/zhangsongbai/p/3296623.html