递归、数据本地存储、导航栏透明

  1. 递归处理数据、查找所有子节点
-(NSMutableArray *)childArray{
    if (!_childArray) {
        _childArray =[NSMutableArray array];
    }
    return _childArray;
}
/**
 加载菜单数据
 */
-(void) loadDataWithData:(NSArray *)AllArray{
    
    //完整的树形结构数据
    NSMutableArray * finalRes = [NSMutableArray array];
    for (NSDictionary * dictionary in AllArray) {
        
        NSMutableArray * reslut = [NSMutableArray array];
        //没有子菜单
        if (![[dictionary allKeys] containsObject:@"child"]){
            [reslut addObject:dictionary];
        }else{
            //有child菜单
            [reslut addObject:dictionary];//外层字典加入数组
            //写一个方法
            NSArray * allChildArr = [self cyclicAllChildArr:dictionary[@"child"]];
            [reslut addObjectsFromArray:allChildArr];
        }
        [finalRes addObject:reslut];
    }
    
    ////每个字典添加一个头字段
    NSMutableArray * addHeaderStrFinalReslutArray = [NSMutableArray array];
    
    for (int i = 0; i< finalRes.count; i++) {
        
        NSMutableArray * sectionArr = [NSMutableArray arrayWithArray:finalRes[i]];
        NSString * headerStr = sectionArr.firstObject[@"appname"];
        NSMutableArray * sectionIsHaveArr =[NSMutableArray array];
        for (NSDictionary * dic in finalRes[i]) {
            NSMutableDictionary * MutableDic =[[NSMutableDictionary alloc] initWithDictionary:dic];
            [MutableDic setObject:headerStr forKey:@"header"];
            [sectionIsHaveArr addObject:MutableDic];
        }
        [addHeaderStrFinalReslutArray addObject:sectionIsHaveArr];
    }
    self.moreAllPackedArray = addHeaderStrFinalReslutArray;
    
    [self menuHomeAndSectionData];
    
}

//查找所有子child
-(NSArray *) cyclicAllChildArr:(NSArray *) chlidArr{
    
//    NSMutableArray * childArray = [NSMutableArray array];
    for (NSDictionary * dic in chlidArr) {
        if (![[dic allKeys] containsObject:@"child"]){
            //不包含
            [self.childArray addObject:dic];
        }else{
            //包含child
            [self.childArray addObject:dic];//包含child的外层数据
            [self cyclicAllChildArr:dic[@"child"]];
        }
    }
    
    return  self.childArray;
    
}

2.项目中需要存储用户的偏好设置,菜单数据是数组嵌套字典,字典的某个key对应一个数组(self.inUseTitles writeToFile:<#(nonnull NSString *)#> atomically:<#(BOOL)#>直接写入不成功);分组数据就是数组里面装的字典(这种数据就可以直接用writeToFile 写入成功)。

        //本地缓存数据
//        NSString * docmentpath =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES).firstObject;
//        NSString *  menuHomePath = [docmentpath stringByAppendingPathComponent:@"menuSucess.plist"];
//        NSString *  secetionPath = [docmentpath stringByAppendingPathComponent:@"section.plist"];
        MenuDataTool * menuTool =[MenuDataTool sharedMenuDataToolManager];

        NSUserDefaults * defauts =[NSUserDefaults standardUserDefaults];
        NSString * menuStr = [menuTool jsonStrWithArray:self.inUseTitles];
        NSString * sectionStr = [menuTool jsonStrWithArray:self.unUseTitles];
        [defauts setObject:menuStr forKey:@"menuKey"];
        [defauts setObject:sectionStr forKey:@"sectionKey"];
        [defauts synchronize];

//       NSString * menuStr = [self jsonStrWithArray:self.inUseTitles];
//      BOOL menuSucess =  [menuStr writeToFile:menuHomePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
       
//        NSString * sectionStr = [self jsonStrWithArray:self.unUseTitles];
//        BOOL sectionSucess =  [sectionStr writeToFile:secetionPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//        if (menuSucess) {
//            NSLog(@"菜单写入成功");
//        }
//        if (sectionSucess) {
//            NSLog(@"下面组数据写入成功");
//        }

不管是NSUserDefaults 还是沙盒存储,最终都需要把存储的数据暴力转成json字符串才最终存储成功


//数组转换成JSON字符串
-(NSString *) jsonStrWithArray:(NSArray *)array{
    NSData *data= [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    return jsonStr;
}

// 将JSON串转化为字典或者数组
- (id)toArrayOrNSDictionary:(NSData *)jsonData{
    NSError *error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData
                                                    options:NSJSONReadingAllowFragments
                                                      error:&error];
    
    if (jsonObject != nil && error == nil){
        return jsonObject;
    }else{
        // 解析错误
        return nil;
    }
    
}

导航栏透明度-当想要展示导航栏上的barButtonItem,又想让导航栏透明

//设置导航栏
- (void)setNavigationControllerWithColor: (UIColor *)color

{
    
    [self.navigationController.navigationBar  setBackgroundImage:[self createImageWithColor:color] forBarMetrics:UIBarMetricsDefault];
    
    [self.navigationController.navigationBar  setShadowImage:[self createImageWithColor:color]];
    
    [self.navigationController.navigationBar  setTintColor:[UIColor whiteColor]];
    
    [self.navigationController.navigationBar  setTranslucent:YES];
    
}



-(UIImage *) createImageWithColor: (UIColor *) color

{
    
    CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    
    UIGraphicsBeginImageContext(rect.size);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    
    CGContextFillRect(context, rect);
    
    
    
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return theImage;
    
}

面试题

多线程
屏幕快照 2017-10-27 上午9.35.16.png
死锁
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 8,957评论 2 4
  • 沙盒 Plist Preference偏好设置 NSKeyedArchiver归档 / NSKeyedUnarch...
    追风者366阅读 8,774评论 0 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,990评论 25 709
  • 盖茨比热映时,刘同发了一条微博说,一直以为了不起的盖茨比描写的是比尔盖茨的发家史。此微博上热门,大概是很多人都这样...
    墨韵书香阅读 5,312评论 0 2

友情链接更多精彩内容