项目总结-3

什么时候使用到storyBoard?

  • 描述静态单元格
  • 描述多个控制器的时候

监听TextField的编辑3种方式

  • 代理:注意不要让自己成为自己的代理
  • target
  • 通知

设置TextField占位文字的颜色

  • 方案一
  • 拿到占位文字控件(UILabel),设置UILabel的文字颜色,但是发现系统的TextFiel并没有向外提供这个属性,也就是这个属性是私有的,我们可以通过断点调试的方法来获取这个TextFiel的私有属性名,然后,通过KVC来获取它的值,然后改变文字颜色
UILabel *placeLabel = [self valueForKey:@"placeholderLabel"];
    placeLabel.textColor = [UIColor whiteColor];
  • 通过断点条调试的方法获取一个对象的私有属性的方法如下
  • 方案二:使用runtime

  • 在TextField的分类中写一个分类属性

#import <UIKit/UIKit.h>

@interface UITextField (Placeholder)

@property UIColor *placeholderColor;

@end
  • 在分类的.m文件中实现以下方法
//交换方法
+(void)load
{

    Method M1 = class_getInstanceMethod(self, @selector(setHMX_placeholder:));
    Method M2 = class_getInstanceMethod(self, @selector(setPlaceholder:));
    method_exchangeImplementations(M1, M2);
}

//设置占位文字
-(void)setHMX_placeholder:(NSString *)placeholder
{
    //设置占位文字
    [self setHMX_placeholder:placeholder];

    //设置占位文字颜色
    [self setPlaceholderColor:self.placeholderColor];

}

//设置占位文字颜色
-(void)setPlaceholderColor:(UIColor *)placeholderColor
{
    //1.把文字颜色先保存起来
    objc_setAssociatedObject(self, @"placeholderColor",placeholderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    //2.等真正设置文字的时候再去设置文字颜色
    //获取文字控件
    UILabel *place = [self valueForKey:@"placeholderLabel"];
    place.textColor = placeholderColor;

}

//获取文字颜色
-(UIColor *)placeholderColor
{
    return objc_getAssociatedObject(self, @"placeholderColor");
}
  • 方案三
   //设置占位文字的颜色(第一个参数表示要给哪个文字设置富文本属性)
    NSMutableDictionary *attri = [NSMutableDictionary dictionary];
    attri[NSForegroundColorAttributeName] = [UIColor lightGrayColor];
    self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attri];

分组样式的TableView注意点

  • 如果TableView是分组样式,默认每一组都会有头部和尾部间距,可以通过以下的属性来设置间距的大小
 self.tableView.sectionHeaderHeight = 0;
    self.tableView.sectionFooterHeight = 10;
  • 分组样式的第一个cell的frame的y值自动设置为35,如果想将所有的cell往上移动,可以通过contentInset属性来设置
self.tableView.contentInset = UIEdgeInsetsMake(-25, 0, 0, 0);

不能去手动设置TableView的滚动范围

  • tableView的滚动范围是系统自动根据内容去计算的,如果我们自己手动去设置,会出问题
  • 例如:
//请求数据

//collectionView作为TableView的底部视图,开始的时候设置collectionView的尺寸为0,当collectionView的数据加载完毕后,重新计算collectionView的高度,让TableView重新计算滚动范围,实现滚动

-(void)loadData
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    NSMutableDictionary *prame = [NSMutableDictionary dictionary];
    prame[@"a"] = @"square";
    prame[@"c"] = @"topic";
    [manager GET:@"http://url123" parameters:prame progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {//成功后回调

        //解析数据
        self.squareArray = [HMXSqaureItem mj_objectArrayWithKeyValuesArray:responseObject[@"square_list"]];


        //重新计算collectionView的高度(计算出有多少行cell)
        NSInteger count = self.squareArray.count;
        //行数
        NSInteger rows = (count - 1)/cols + 1;

        //collectionView的高度
        CGFloat collectionH = rows * itemWH + (rows - 1) * margin;

        self.collectionView.height = collectionH;

        //刷新collectionView
        [self.collectionView reloadData];

        //重新设置tableView的滚动范围
        self.tableView.tableFooterView = self.collectionView;


        //注意:当collectionView的数据加载完毕后,不能使用下面的方法手动设置TableView的contentSize,如果设置了,在当前页面,滚动范围会是准确的,但是当跳转到下一个控制器后再回来,发现contentSize又会恢复原来的尺寸,这是因为,TableView在显示的时候会根据当前的内容自动计算滚动范围,在一开始collectionView的尺寸为0,因此TableView不能滚动,手动设置后,跳转到下一个控制器再回来,TableView在即将显示的时候又会根据当前的内容自动计算滚动范围,而当时设置的collectionView尺寸为0,因此不能滚动,恢复了原样

       // self.tableView.contentSize = CGSizeMake(0, CGRectGetMaxY(self.collectionView.frame));

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {//失败后回调
        HMXLog(@"%@",error);
    }];
}

能打开网页的控制器或View

  • 1.safari

    • 缺点:跳转到safari应用,离开当前应用
    • 优点:有很多自带的功能,前进,后退,刷新,网址
  • 2.UIWebView

    • 优点:在当前应用就可以打开
    • 缺点:前进,后退,刷新等这些功能必须要手动去实现,而且进度条做不了,以前在WebView上面看到的进度条都是假象
  • 3.WKWebView(UIWebView的升级版)

    • 优点:在当前应用就可以打开,自带前进,后退,刷新等功能,并且可以监听真正的进度
  • 4.SFSafariViewController

    • iOS9新出来的控制器,在当前应用打开网页,功能同safari一样,这个控制器在storyboard中还没有集成,所以只能通过代码手动创建,使用时:导入头文件#import <SafariServices/SafariServices.h>
  SFSafariViewController *safari = [[SFSafariViewController alloc] initWithURL:url];
  //一定要使用modal的方式跳转到这个控制器,因为苹果在方法的声明前写的很清楚,当使用modal的方式的时候,在modal控制器点击Done的时候系统会自动dismiss掉modal控制器控制器回到上一个控制器
    [self presentViewController:safari animated:YES completion:nil];

抽取业务类的规范

  • 在.h文件的头部说明该工具类主要用来干嘛

  • 在方法的声明前最好写上有提示功能的注释,方便别人使用

  • .h文件

// 该类专门用于文件的处理

#import <Foundation/Foundation.h>

@interface FileManager : NSObject

/**
 *  获取文件夹尺寸
 *
 *  @param directoryPath 文件夹全路径
 *
 *  @return 文件夹的尺寸
 */

+(NSInteger)getDirectorySize:(NSString *)directoryPath;
/**
 *  删除文件夹下所有文件
 *
 *  @param directoryPath 文件夹全路径
 */
+(void)removeDirectoryPath:(NSString *)directoryPath;

@end

  • .m文件
#import "FileManager.h"

@implementation FileManager

//获取文件大小
+(NSInteger)getDirectorySize:(NSString *)directoryPath
{

    //获取文件管理者
    NSFileManager *fileManager = [NSFileManager defaultManager];

    //如果用户传入的不是文件夹或者该文件不存在就报错
    BOOL isDirectory;
    BOOL isExist = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDirectory];
    if (!isExist || !isDirectory)
    {
        NSException *exception = [NSException exceptionWithName:@"filePathError" reason:@"请传入符合规范的文件夹路径" userInfo:nil];
        [exception raise];
    };


    //获取这个文件路径下所有的文件
    NSArray *subPaths = [fileManager subpathsAtPath:directoryPath];

    NSInteger totalSize = 0;

    //遍历数组
    for (NSString *subPath in subPaths) {

        //拼接全文件路径
        NSString *fileFullPath = [directoryPath stringByAppendingPathComponent:subPath];

        //排除文件夹和不存在的文件
        BOOL isDirectory;
        BOOL isExist = [fileManager fileExistsAtPath:fileFullPath isDirectory:&isDirectory];
        if (!isExist || isDirectory) continue;

        //排除隐藏文件
        if ([fileFullPath containsString:@".DS"] ) continue;

        //获取指定路径下的文件属性
        NSDictionary *artt = [fileManager attributesOfItemAtPath:fileFullPath error:nil];
        NSInteger size = [artt fileSize];
        totalSize += size;
    }

    return totalSize;
}

//删除文件
+(void)removeDirectoryPath:(NSString *)directoryPath
{
    //获取文件管理者
    NSFileManager *fileManager = [NSFileManager defaultManager];

    //如果用户传入的不是文件夹或者该文件不存在就报错
    BOOL isDirectory;
    BOOL isExist = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDirectory];
    if (!isExist || !isDirectory)
    {
        NSException *exception = [NSException exceptionWithName:@"filePathError" reason:@"请传入符合规范的文件夹路径" userInfo:nil];
        [exception raise];
    };

    //获取cachePath文件路径下所有的一级文件夹
    NSArray *subPaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:nil];

    //拼接全路径
    for (NSString *subPath in subPaths) {

        NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
        //移除该文件夹下所有的文件
        [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
    }

}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 这是项目总结第三篇,前两篇分别为:1. Android 项目总结(1)- 之弧形ViewPager 和弧形Head...
    依然范特稀西阅读 3,929评论 0 59
  • 今夜,我微笑再作一次回眸,寻访着那颗曾彷徨凄凉的心。 今晚,让我再对你道一次珍重,以慰藉着那颗摇摇欲晃的心灵。 那...
    笨笨的布谷鸟阅读 244评论 0 2
  • 最近读了一本书,《舍弃》, 臼井由妃的作品,书中提到成功人士都有一个大号垃圾桶,清理自己的多余物品,延伸清理自己的...
    leoliwinner阅读 324评论 0 0
  • 下面这道题目考验的是逻辑思维,据说只有百分之五的人才能看出来。 一天,主角E将百斤重弯月形石块,推下斜坡。除E推下...
    牧童出山阅读 857评论 0 51