用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

发帖

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

[复制链接]
  • TA的每日心情
    开心
    2020-8-4 16:45
  • 27

    主题

    33

    帖子

    645

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    645
    发表于 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?
    6 k0 w, n+ Z9 r# c1 O
    1. /**0 ^- U* O  Y. r) i* ^3 ]
    2. *  获取View所在的控制器9 }/ P& E1 ?1 a" k
    3. *
      + ~) p. C& d- t4 \9 ]2 y( [* i  Q$ V
    4. *  @return <#return value description#>$ t; q" Y% e, o; U( u
    5. */
      8 e  `% t! A! p9 p9 @/ S7 o1 F% H
    6. - (BaseViewController *)viewController {. R) w2 Z$ Y* o8 T
    7.     UIResponder *responder = self;
        y) B$ {6 O1 t, t6 s7 K* `# E1 p
    8.     while ([responder isKindOfClass:[UIView class]]) {1 I* Q4 n0 f% H# l
    9.         responder = [responder nextResponder];7 T) _- H# V1 e0 m. S
    10.     }
        y2 y6 s/ _; _  B9 p+ C' h
    11.     return (BaseViewController *)responder;
      4 ^8 g+ l9 _# h4 Y
    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 u! W; G. K" }% {% m7 {
    1. NSTextAttachment *attachment = [[NSTextAttachment alloc] init];3 C! n1 o, S: C5 j/ M
    2. attachment.image = [UIImage imageNamed:@"MyIcon.png"];
      : L7 c* O0 G0 \

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

    本版积分规则

    ض