0%

这周所学新技巧(1)

#前言
今天隔上一篇博文已经差不多有一个月了,感觉非常羞愧,因为这意味着我特么将近一个月里面没有学到新知识。其实呢,不是这样子的,做项目过程中肯定有遇到问题,也有解决问题,但是就是没有长记性,说白了点,就没有记下来。今天洗澡的时候,突然又创建了一句座右铭“你可以蠢,但是不能懒;你可以懒,但是不能没有责任感。”作为一个经常刷技术微博的我,肯定会学在大牛的博客里面了解到一点东西。“先转后看”,这就是我的原则。其实,这种想法、做法是非常浪费时间的,因为我平均一天要刷将近半个多小时的微博,在项目中很有可能会遇到以前在微博中看到过的东西,但是你还要去找啊找。就前几天,同事要做类似于黄易导航栏点击切换栏目的效果,我记得我有看到过,果不其然在微博中找到了它WMPageController,但如果时间隔很久,那我岂不是要找很久,这就是浪费时间啊!以前转发微博的时候,会@我的印象笔记,当然这比较容易搜索,但是东西多了,你总得要花点时间去找到自己想要的那个东西。所以吧,“好记性,不如烂笔头”,古人的话总没错。这又让我想起了我们家那边的老话,“出门带好下雨伞”,然后然后我就想起了前天周五湿身的感觉,fuck!!!幸亏有好心同事救济我。前几天在cc上面看到一篇文章如何坚持每周写一篇博客,个人觉得写地挺好的,一想到自己隔这么久没有写博客了,就感到非常羞愧,所以吧,要坚持!因为你是男人嘛。好了,废话了这么久,实在不像是一个程序猿,下面来扯扯这周所学到的新技巧。

##怎么获取View所在的Controller?
当然这里不是指Controller的View属性这么简单。有的时候,你会遇到这样的需求:控制器顶部有两个按钮,点击切换不同的界面。这种效果实现的方法有很多,而我的做法是ViewController + ScrollView + View & View。而View上面的跳转事件,你可以定义block、delegate、notification来操作,但是如果我想在View里面获取Controller里面的某个属性呢?我可以在View里面定义一个Controller类型的对象啊,没错这就是我以前的做法,很傻逼!其实有更好的方法Given a view, how do I get its viewController?

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 获取View所在的控制器
*
* @return <#return value description#>
*/
- (BaseViewController *)viewController {
UIResponder *responder = self;
while ([responder isKindOfClass:[UIView class]]) {
responder = [responder nextResponder];
}
return (BaseViewController *)responder;
}

##Label不用 addSubView: 方法加载Image?
在cell里面,在A状态下Z区域要显示文字,在B状态下Z区域要显示图片。这我得两个控件啊,在config data的时候根据状态来显示或隐藏某个控件。诶,label可不可以加载Image啊?嗯,在UILabel的文件里面肯定有属性的,于是command+F “Image”,诶,我去,没找到?!于是又把UILabel的头文件里面的东东扫了一次,还是没有。好吧,后面在so搜到了,label真的可以不用 addSubView: 方法加载image,不过是在iOS7上,像我们支持iOS6的苦逼dog还是老老实实的用两个控件的方法吧。

1
2
3
4
5
6
7
8
9
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"MyIcon.png"];

NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];

NSMutableAttributedString *myString= [[NSMutableAttributedString alloc] initWithString:@"My label text"];
[myString appendAttributedString:attachmentString];

myLabel.attributedText = myString;

##如何简单的收键盘?
我们可以自定义textfield或者textview子类,在初始化的时候设置它的inputAccessoryView属性,在它这个属性上面添加一个响应resignFirstResponder事件的按钮。可是有时候,你还得点击空白处也收键盘啊,可以在View上面添加一个手势啊,在相应手势的方法里面,让这个对象调用它的resignFirstResponder方法。如果在这个View上面UITextField对象很多个呢?那我肯定不会傻得一个个对象去调用resignFirstResponder方法啊,尽管第一响应者只能有一个,我以前觉得写了个很nice的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 放弃第一响应者
*
* @param view view description
*/
- (void)resignAllFirstResponder:(UIView *)view {
for (UIView *subView in view.subviews) {
if ([subView isKindOfClass:[UITextView class]] || [subView isKindOfClass:[UITextField class]]) {
[subView resignFirstResponder];
} else {
[self resignAllFirstResponder:subView];
}
}
}

还尼玛用到了递归,大学的数据结构重要有点用处了。可是,自从我在so上面看到这个,

1
2
3
4
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[[self view] endEditing:YES];
}

我就。。。。肯定是苹果baba自家的方法好用撒!!!

##怎么取出字符串中的URL?
肯定不会自己@”http”一个个的去寻找,至少也得写个正则玩玩,自己不会写,但网上一搜一大把。但你有没有想过苹果baba有个方法就是让我们这么任性的玩ios find links from string

1
2
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches = [detector matchesInString:source options:0 range:NSMakeRange(0, [source length])];

###关于代码规范
以前一个人开发的时候,代码想怎么写就怎么写,一副老子天下第一的样子。但是现在团队开发不同啊,一个项目几个人开发,还有code review,你得尽量写好,不能拖团队开发的后腿啊。所以,第一,你得写注释!写注释!!写注释!!!重要的事情说三遍。当然还有编程风格,这里我推荐两篇写的比较好的风格指南。

看完以后,你会发现原来网络请求写dict的时候,还可以这样:

1
[self.bodyParams setObject:link ?: @"" forKey:@"Link"];

调用block的时候,可以这样:

1
!self.saveDataBlock ?: self.saveDataBlock(data);

##以前的一些杂东西
有些东西是在以前的开发过程中记录的,但忘记是在哪里找到解决方案的了

  • 如何查看.a文件信息? 在终端找到相关路径:lipo -info xxx.a ;也可以 file xxx.a; 还可以这么详细地看:lipo -detailed_info xxx.a;
  • pod更新过慢? 你可以尝试下面的语句:pod install --verbose --no-repo-update 或者 pod update --verbose --no-repo-update
  • 如何更形象化的理解约束constraints? 这里有个很形象的网站
  • 想要找很多第三方工具? 这个你得找百度
  • 旧的Xcode版本到哪里下载啊? 这个肯定找苹果baba啊,不过你得有开发者账号
  • 想看历年wwdc的相关资料? 这个网站你肯定会喜欢(虽然我还没用过。。。。)
  • 想看第三方源码? 这个想法好!很好!!非常好!!! 那么推荐你用UIViewController-SwizzledYNClassNameDaiMethodTracing。请记得star!!!
  • 你是个Google重度使用者? 推荐几款让Chrome新标签页炫酷的插件,希望你能喜欢。

##Google搜索技巧推荐
上面说的东西,“不是我偷的,也不少我抢的,是我老乡从厂里面带出来的,现在便宜甩卖。。。”,(⊙o⊙)…,被这个促销口号洗脑了,这些都是我在网上找到。其实,个人觉得作为程序猿,你首先得善用网络资源,当然在吸取的时候,你也得付出、分享好的东西,共同促进一个美好的……姑且叫做“全球最大的同性交友世界”吧,这里我推荐一下Google的搜索技巧。当然你首先得学会FQ,如果你想要代理IP什么之类的,我可以给你一个网站Google全球缓存IP—中国红客联盟。当然,如果你想用着舒服,那肯定得用付费的撒,我用的是红杏(不好用,我也不会推荐给你撒),目前只支持Google浏览器,移动端的VPN还在内测中吧。

1
2
3
4
5
6
7
8
9
10
11
Site: 只搜索某个网址的页面。 如:牛易疯先森 site:github.io
~  同时搜索近义词。 如:iOS  webView ~crash
-  排除某个关键字。 如:iOS  webView crash –baidu
.. 显示指定年份时间段内搜索结果。如:apple 1995..2015
“” 以整个短语为搜索关键字,而不是拆分成每个词。如:“iOS  webView crash”,它和 iOS  webView crash的搜索结果完全不一样。
filetype: 指定搜索的文档类型。如:iOS filetype:pdf
* 星号用来代替任意字符,这个就像数据库的查询语句一样。如:*iOS
intitle: 只显示标题中包含指定关键字的搜索结果。如:intitle iOS
define: 词句定义,如果你不知道这个词句什么意思,你就可以这么玩。 如:define:iOS 
数学计算。如:(2015*7)/15+23-22
单位换算。如:100人民币=? 美元

#小结
昨晚三小时,今晚两小时。终于把平常积累的东东梳理一下,so nice!发现自己的印象笔记里面还是不少东西的,但整体水平不是很高,今天都是扯的一些东西的用法,没有深入研究某些东西,以后得多动动脑哈。。。