用户
 找回密码
 立即注册

发帖

201507所学新技巧(1),iOS开发技巧

[复制链接]
  • TA的每日心情
    慵懒
    2025-11-24 10:46
  • 27

    主题

    6

    回帖

    669

    积分

    管理员

    积分
    669
    发表于 2015-7-26 00:00:00
    前言
    今天隔上一篇博文已经差不多有一个月了,感觉非常羞愧,因为这意味着我特么将近一个月里面没有学到新知识。其实呢,不是这样子的,做项目过程中肯定有遇到问题,也有解决问题,但是就是没有长记性,说白了点,就没有记下来。今天洗澡的时候,突然又创建了一句座右铭“你可以蠢,但是不能懒;你可以懒,但是不能没有责任感。”作为一个经常刷技术微博的我,肯定会学在大牛的博客里面了解到一点东西。“先转后看”,这就是我的原则。其实,这种想法、做法是非常浪费时间的,因为我平均一天要刷将近半个多小时的微博,在项目中很有可能会遇到以前在微博中看到过的东西,但是你还要去找啊找。就前几天,同事要做类似于黄易导航栏点击切换栏目的效果,我记得我有看到过,果不其然在微博中找到了它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?7 S- B( b$ L( ]% s: c  x
    1. /**4 y( ]7 Q4 B$ A
    2. *  获取View所在的控制器
      2 S; j0 s0 \& P0 _# L
    3. *
      8 E# j/ H7 K" ?+ S- B1 B6 |: J1 \
    4. *  @return <#return value description#>7 j4 \  |% \# n8 |  v& {5 l6 K0 F- ~5 {
    5. */6 P- a4 R6 u- c4 X$ G
    6. - (BaseViewController *)viewController {  m# y9 M. a" y& j& E
    7.     UIResponder *responder = self;
      6 m. x  Y  X, d9 q4 a2 Y
    8.     while ([responder isKindOfClass:[UIView class]]) {
      ' d0 t2 i* S/ a, v* `# @% u
    9.         responder = [responder nextResponder];* J3 |$ `5 O4 d/ X( ^
    10.     }8 f3 d+ ?* _! Q
    11.     return (BaseViewController *)responder;
      7 _. a, w0 O+ x: m" e+ c9 t. q3 U
    12. }
    复制代码
    Label不用 addSubView: 方法加载Image?
    在cell里面,在A状态下Z区域要显示文字,在B状态下Z区域要显示图片。这我得两个控件啊,在config data的时候根据状态来显示或隐藏某个控件。诶,label可不可以加载Image啊?嗯,在UILabel的文件里面肯定有属性的,于是command+F “Image”,诶,我去,没找到?!于是又把UILabel的头文件里面的东东扫了一次,还是没有。好吧,后面在so搜到了,label真的可以不用 addSubView: 方法加载image,不过是在iOS7上,像我们支持iOS6的苦逼dog还是老老实实的用两个控件的方法吧。9 a# i. Q3 w5 V& S+ |+ l3 r
    1. NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
      $ l: f! L* ^4 G: i) C
    2. attachment.image = [UIImage imageNamed:@"MyIcon.png"];
      " W1 C: _' _" }2 F

    3. - s- N1 X2 a5 H# B$ v
    4. NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];" C: S) ~2 p) |# ~: B! _
    5. , O' U1 }+ s4 W- C3 \
    6. NSMutableAttributedString *myString= [[NSMutableAttributedString alloc] initWithString:@"My label text"];7 P  [( e' ~' O* k* q6 }0 }
    7. [myString appendAttributedString:attachmentString];
      1 {4 z0 p# [! z! l
    8. 0 Q! \9 E) Z- g# u
    9. myLabel.attributedText = myString;
    复制代码
    如何简单的收键盘?
    我们可以自定义textfield或者textview子类,在初始化的时候设置它的inputAccessoryView属性,在它这个属性上面添加一个响应resignFirstResponder事件的按钮。可是有时候,你还得点击空白处也收键盘啊,可以在View上面添加一个手势啊,在相应手势的方法里面,让这个对象调用它的resignFirstResponder方法。如果在这个View上面UITextField对象很多个呢?那我肯定不会傻得一个个对象去调用resignFirstResponder方法啊,尽管第一响应者只能有一个,我以前觉得写了个很nice的方法:
    " P2 Y: A$ K/ O; V' i. T
    1. /**- Q5 d# F( J1 A5 m7 X
    2. *  放弃第一响应者2 ?, \7 m1 C% M3 m3 G4 e
    3. *
      * x) a/ a7 l: u. f' X5 j
    4. *  @param view view description
      & J# A* _7 m% M! V
    5. */0 D# T6 w& B* w3 E; e$ r
    6. - (void)resignAllFirstResponder:(UIView *)view {; K3 I1 f) ]* X" B4 E# u) P' E5 e
    7.     for (UIView *subView in view.subviews) {" Y2 E# T% K5 X+ [, u: [
    8.         if ([subView isKindOfClass:[UITextView class]] || [subView isKindOfClass:[UITextField class]]) {' O$ t' t1 U6 c" ?* W) n, L
    9.             [subView resignFirstResponder];7 F! F$ n1 E0 V3 \" P
    10.         } else {
      4 u9 @# q7 s; ]* F
    11.             [self resignAllFirstResponder:subView];
      6 c& f: o; [5 ^5 Y( |6 E" c
    12.         }
      ! d; ?* y4 m9 ~( u3 \4 Q5 j
    13.     }0 r& B5 J* Z& U8 m
    14. }
    复制代码
    还尼玛用到了递归,大学的数据结构重要有点用处了。可是,自从我在so上面看到这个,
      t0 F$ g# W0 Q' x. E
    1. - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
      ! H* R  @* P2 f9 i5 X- J- Y
    2.     [[self view] endEditing:YES];
      & B6 ?6 W1 d8 y' |* O
    3. }
    复制代码
    我就。。。。肯定是苹果baba自家的方法好用撒!!!
    怎么取出字符串中的URL?
    肯定不会自己@”http”一个个的去寻找,至少也得写个正则玩玩,自己不会写,但网上一搜一大把。但你有没有想过苹果baba有个方法就是让我们这么任性的玩ios find links from string
    5 H1 ^* P- c# R, u* p
    1. NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
      : S0 J, V& A8 P4 W' C# f4 U
    2. NSArray* matches = [detector matchesInString:source options:0 range:NSMakeRange(0, [source length])];
    复制代码
    关于代码规范
    以前一个人开发的时候,代码想怎么写就怎么写,一副老子天下第一的样子。但是现在团队开发不同啊,一个项目几个人开发,还有code review,你得尽量写好,不能拖团队开发的后腿啊。所以,第一,你得写注释!写注释!!写注释!!!重要的事情说三遍。当然还有编程风格,这里我推荐两篇写的比较好的风格指南。
    看完以后,你会发现原来网络请求写dict的时候,还可以这样:% X  l! y* c  j
    1. [self.bodyParams setObject:link ?: @"" forKey:@"Link"];
    复制代码
    调用block的时候,可以这样:
    . d% k7 I. a% ]! z+ x2 A+ G0 y
    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新标签页炫酷的插件,希望你能喜欢。
      0 A0 Z) h6 s) s- Y
    Google搜索技巧推荐
    上面说的东西,“不是我偷的,也不少我抢的,是我老乡从厂里面带出来的,现在便宜甩卖。。。”,(⊙o⊙)…,被这个促销口号洗脑了,这些都是我在网上找到。其实,个人觉得作为程序猿,你首先得善用网络资源,当然在吸取的时候,你也得付出、分享好的东西,共同促进一个美好的……姑且叫做“全球最大的同性交友世界”吧,这里我推荐一下Google的搜索技巧。当然你首先得学会FQ,如果你想要代理IP什么之类的,我可以给你一个网站Google全球缓存IP—中国红客联盟。当然,如果你想用着舒服,那肯定得用付费的撒,我用的是红杏(不好用,我也不会推荐给你撒),目前只支持Google浏览器,移动端的VPN还在内测中吧。/ n3 g& L: Y- m7 R4 p
    1. Site: 只搜索某个网址的页面。 如:牛易疯先森 site:github.io
      4 `( G; P4 v8 T% @4 c
    2. ~  同时搜索近义词。 如:iOS  webView ~crash% w0 C) Y4 C  ~- s; N. i; k
    3. -  排除某个关键字。 如:iOS  webView crash –baidu, n1 E+ [6 }& R* K. |7 j
    4. .. 显示指定年份时间段内搜索结果。如:apple 1995..2015
      7 I& B* I& g9 e! f6 v4 ?0 k
    5. “” 以整个短语为搜索关键字,而不是拆分成每个词。如:“iOS  webView crash”,它和 iOS  webView crash的搜索结果完全不一样。/ @6 J4 d/ L* u" O! p' }& G  A
    6. filetype: 指定搜索的文档类型。如:iOS filetype:pdf7 z8 ]8 A$ i& K, |9 Q$ g# v
    7. * 星号用来代替任意字符,这个就像数据库的查询语句一样。如:*iOS- r; \$ d5 C9 R! R% ~" w2 ?
    8. intitle: 只显示标题中包含指定关键字的搜索结果。如:intitle iOS
      ! \; t' @7 B4 F+ b% o9 }3 [
    9. define: 词句定义,如果你不知道这个词句什么意思,你就可以这么玩。 如:define:iOS
      : m# h& W7 {; ~" o3 R' P6 M1 T
    10. 数学计算。如:(2015*7)/15+23-22; [& u  M$ {# R. m8 z
    11. 单位换算。如:100人民币=? 美元
    复制代码
    小结
    昨晚三小时,今晚两小时。终于把平常积累的东东梳理一下,so nice!发现自己的印象笔记里面还是不少东西的,但整体水平不是很高,今天都是扯的一些东西的用法,没有深入研究某些东西,以后得多动动脑哈。。。
    原文链接:http://joakimliu.github.io/2015/07/26/new-skill-in-this-week-one/
    使用道具 举报 回复
    发表于 2016-6-16 16:58:53
    ( t# D, p( \1 b  n8 r6 |( x/ M6 q
    只是赚金币  别见怪
    使用道具 举报 回复 支持 反对
    严禁恶意灌水!!!拒绝伸手党!!!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    ض