[一句秒懂]蒙板讲解(下)+优化点


关于蒙板哪一套逻辑和思路讲解数组

截图1:-------------------------------------------async

 

截图2:-------------------------------------------ide

 

 

截图3:-------------------------------------------优化

 

 

 

上面截图:--------------------------------------结束截图lua

 

 

1:首先蒙板那一套咱们可使用一套便可,蒙板外面只要传一个view控件内容、或者一个控制器:(而后在外面操做全部数据交互效果),关于蒙板的模版讲解在上册已经讲过,这里就再也不多说了spa

2:咱们在外面给蒙板传一个view或者控制器,咱们须要在view和控制器里面有一个block回调或者代理,看本身喜欢吧,这样是为了:在你谈下蒙板的时候,将选择的值传给当前控制器线程

3:这时候,你就只要和当前控制器弹出蒙板出来的之后的那个view或者控制器交互数据就能够了代理

4:三步曲==建立-传内容-显示code

5:请求数据==当咱们请求数据的时候,在蒙板里面选择数据之后,咱们通常都是将数据传到外面控制中,经过block或者代理-而后dismiss掉蒙板-而后请求接口(在当前控制器下)component

6:代码演示:

// 建立
    GoodsDetaiParameterView * goodsDetaiParameterView  = [GoodsDetaiParameterView goodsDetaiParameterView];
    MeSelectDateViewController *vc = [[MeSelectDateViewController alloc]init];
    vc.dataArr = [self.timeData copy];
    vc.model = self.model;  // 传模型
    vc.myBlock = ^ (NSString *year ,NSString *month, NSString *day) {
        
        YLLog(@"year=%@  month=%@  day=%@",year,month,day);
        [goodsDetaiParameterView dismiss];
        
        [self loadSelectYear:year month:month day:day];
    };
    goodsDetaiParameterView.contentController = vc;
    
    // 显示
    [goodsDetaiParameterView show];

 

 

额外点金:

1:获取当前手机端的真实年、月、日

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *myDate = [NSDate date];
    NSString *dateTime = [formatter stringFromDate:myDate];
    
    NSRange range = [dateTime rangeOfString:@"-"];
    if (range.length) {
      self.dateTimeArray = [dateTime componentsSeparatedByString:@"-"];
    }

 

2:根据哪一年哪一月计算多少天数

#pragma mark - 获取-天数组

- (NSMutableArray *)returnDayArray:(NSUInteger)count {
    [self.dayArray removeAllObjects];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i=1; i<=count; i++) {
            [self.dayArray addObject:[NSString stringWithFormat:@"%@",@(i)]];
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
            [self selectIndexPathForRow:[self modelWithIndex:self.index]];
        });
    });
    return self.dayArray;
}

#pragma mark - 获取那一年那一月共有多少天

- (NSUInteger)getNumberOfDaysOneYear:(NSDate *)date{
    NSCalendar *calender = [NSCalendar currentCalendar];
    NSRange range = [calender rangeOfUnit:NSCalendarUnitDay inUnit: NSCalendarUnitMonth forDate: date];
    return range.length;
}

#pragma mark - 传一个月份和一个年份字符串,返回一个NSDate

- (NSDate *)returnDateTimeWithMonthString:(NSString *)monthStr yearString:(NSString *)yearStr {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone localTimeZone];
    
    [formatter setTimeZone:timeZone];
    [formatter setDateFormat : @"M/yyyy"];
    
    // 格式示范:@"2/2035";
    NSString *stringTime = [NSString stringWithFormat:@"%@/%@",monthStr,yearStr];
    return [formatter dateFromString:stringTime];
}

 

3:选中哪一行:必需是刷新后才能看到效果,千万不能在刷新以前执行下面的代码

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[self.tempArray indexOfObject:object] inSection:0] animated:NO scrollPosition:UITableViewScrollPositionMiddle];

 

自定义选中颜色样式

UIView *selectedView  = [[UIView alloc]initWithFrame:self.frame];
        selectedView.backgroundColor = [UIColor YLColorBaby];
        self.selectedBackgroundView = selectedView;

 

系统选中颜色样式:

self.selectionStyle = UITableViewCellSelectionStyleNone;

4:初始化建立多个控件、遍历

- (instancetype)initWithdataArray:(NSArray *)arr {
    if (self = [super init]) {
        self.frame = CGRectMake(0, 0, YLScreenW, 101);
        self.backgroundColor = [UIColor YLColorWhite];
        
        if (arr.count==0) {
            arr = [NSArray arrayWithObjects:@"年",@"月",@"日",nil];
        }else {
            NSMutableArray *arr1 = [NSMutableArray array];
            [arr1 addObject:[NSString stringWithFormat:@"%@年",arr[0]]];
            [arr1 addObject:[NSString stringWithFormat:@"%@月",arr[1]]];
            [arr1 addObject:[NSString stringWithFormat:@"%@日",arr[2]]];
            
            arr = [arr1 copy];
        }
        
        CGFloat lblX = 0;
        CGFloat lblY = 50;
        CGFloat lblW = (int)(YLScreenW-lblX*2)/4;
        CGFloat lblH = 50;
        for (int i=0; i<arr.count; i++) {
            UIButton *btn = [[UIButton alloc]init];
            [btn setTitle:arr[i] forState:UIControlStateNormal];
            [btn setTitleColor:[UIColor YLColorGrayPrimary] forState:UIControlStateNormal];
            [btn setTitleColor:[UIColor YLColorRedIcon] forState:UIControlStateSelected];
            btn.titleLabel.font = [UIFont systemFontOfSize:13];
            btn.titleLabel.textAlignment = NSTextAlignmentCenter;
            btn.tag = 10000+i;
            
            
            btn.x = lblX +lblW*i;
            btn.y = lblY;
            btn.width = lblW;
            btn.height = lblH;
            self.dateBtn = btn;
            [self addSubview:btn];
            [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
            [self.btnArray addObject:btn];
            
            if (i==0 ) {
                btn.userInteractionEnabled = YES;
            }else {
                btn.userInteractionEnabled = NO;
            }
        }
        
        // 按钮的选中颜色
        UIButton *firstButton = self.subviews.firstObject;
        
        UIImageView *imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"product_list"]];
        imgV.width = 45;
        imgV.height = 3;
        imgV.centerX = firstButton.centerX;
        imgV.y = self.height - imgV.height;
        [self addSubview:imgV];
        self.imageView = imgV;
        
        // 自动计算好第一个按钮的文字宽度
        [firstButton.titleLabel sizeToFit];
        // 默认:选中第一个按钮
        [self btnClick:firstButton];
        
        [self setupUI];
    }
    return self;
}

 

5:若是咱们想要拿到刚开始初始化一次性建立的多个按钮,咱们能够将其放在一个数组中保存起来,经过不一样下标取出里面的按钮,就能够改变每个按钮的内容了,

#pragma mark - 外部修改方法

- (void)configBtn:(NSInteger)index title:(NSString *)title {
    NSString *newTitle = nil;
    switch (index-1) {
        case 0:
            newTitle = [NSString stringWithFormat:@"%@年",title];
            break;
        case 1:
            newTitle = [NSString stringWithFormat:@"%@月",title];
            break;
            
        default:
            break;
    }
    
    
    UIButton *btn = self.btnArray[index-1];
    [btn setTitle:newTitle forState:UIControlStateNormal];
    
    UIButton *btn1 = self.btnArray[index];
    [self changeButtonStatus:btn1];
    
    for (int i=0; i<=index; i++) {
        UIButton *button = self.btnArray[i];
        button.userInteractionEnabled = YES;
    }
}

6:一排按钮的点击状态修改:

#pragma mark - 公用方法提取出来

- (void)changeButtonStatus:(UIButton *)sender {
    // 设置当前按钮的状态
    self.dateBtn.selected = NO;
    // 设置传入的按钮为选中状态
    sender.selected = YES;
    // 设置当前按钮为传入的按钮
    self.dateBtn = sender;
    
    // 指示器
    [UIView animateWithDuration:0.25 animations:^{
        self.imageView.width = 45;  //sender.titleLabel.width;
        self.imageView.centerX = sender.centerX;
    }];
}

 

7:优化处理:

后期我将全部的数据都是经过模型去修改,也就是说在这里面的年、月、日都是经过模型传来传去,在模型里面操做数据的根本,很方便

/**
 *  时间戳转换为时间
 */
- (NSString *)ctime {
    
    NSTimeInterval interTime = [_ctime doubleValue] + 0;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:interTime];
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    //[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
    NSString *str = [formatter stringFromDate:date];
    return str;
}

 

8:---判断年月日数据为空或者其余类型的时候,还有不能为0的字符串的判断---

#import "YLStrTool.h"

@implementation YLStrTool


+ (BOOL)isEmpty:(NSString *)str{
    if(str.length<=0 || str==nil ||[str isKindOfClass:[NSNull class]]){
        return YES;
    }
    return NO;
}


#pragma mark - 是否合法

- (BOOL)islegal:(NSString *)str {

    if ([YLStrTool isEmpty:str]) {  //是空的
        return YES;
    }else { //不是空的
        if ([str isEqualToString:@"0"]) {
            return YES;
        }else {
            return NO;
        }
    }
}

 

9:---这两个get方法都试模型数据的get方法:目的是给模型数据从新加工处理之后,才输出给咱们,好比说06月->6月---

/**
 * 判断06月 -> 6月
 */

- (NSString *)b_month {
    if ([_b_month hasPrefix:@"0"]) {
        return [_b_month substringFromIndex:1];
    }else {
        return _b_month;
    }
}


- (NSString *)b_day {
    if ([_b_day hasPrefix:@"0"]) {
        return [_b_day substringFromIndex:1];
    }else {
        return _b_day;
    }
}

 

10-将6月-6,正则匹配而后进行裁剪

#pragma mark -  数字和中文组合的字符串:提取纯数字 // self为当前字符串

- (NSString *)stringToNumberStr {
    NSString * regex = @"^[0-9]*$";
    NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if ([pred evaluateWithObject:self]) {  //是纯数字
        return self;
    } else {  // 不是纯数字
        return [self substringToIndex:self.length-1];
    }
    return nil;
}

 

11-遍历数组for循环的时候,最好是开启一个子线程-如

dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i=0; i<distanceValue; i++) {
            long originDate = [dateTime longLongValue];
            long newDate = originDate - i;
            [self.yearArray insertObject:[NSString stringWithFormat:@"%@",@(newDate)] atIndex:0];
        }
        
        NSMutableArray *latestDateArray = [NSMutableArray array];
        for (int j=distanceValue; j>0; j--) {
            long originDate = [dateTime longLongValue];
            long newDate = originDate + j;
            [latestDateArray insertObject:[NSString stringWithFormat:@"%@",@(newDate)] atIndex:0];
        }
        
        [self.yearArray addObjectsFromArray:latestDateArray];
        self.tempArray = self.yearArray;
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
            
              [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[self.tempArray indexOfObject:[self modelWithIndex:self.index]] inSection:0] animated:NO scrollPosition:UITableViewScrollPositionMiddle];
        });
    });
相关文章
相关标签/搜索