这一年

离职阿里巴巴已一年,非常清楚记得那天把笔记本、工牌上交场景,我似乎有一种失落感。在离职前一段时间,很多同学问我,出去做什么,我说做智能硬件这块,他们都很诧异,因为做数据库出身的我,怎么会去涉足智能硬件呢?其实在2012年我就有打算去做智能硬件这块,技术出身的我,总喜欢把所有技术技能自己能够hold住,在浙江图书馆借《数字电路》、《模拟电路》、《单片机》的相关书籍,我想做为一个智能硬件研发公司TL,至少要最基本硬件常识有些了解。同时联系我初中同学沈林忠,看看我们是否有合伙的可能。一天中午,我约他在文三路吃饭,聊了一个小时多,菜是我喜欢吃的萧山菜,但对硬件理解太狭隘了,以为做硬件和做智能硬件就是一回事。我同学是做传统变压器等硬件研发,他确定在这方面没有经验,而且他在公司里有自己的目标。后来联系上杭电毕业一朋友小裘,通过小裘认识她朋友发财哥,非常亢奋,因为再次看到了曙光,和发财哥聊了聊,他主要做医疗设备的嵌入式开发,对智能硬件研发这块也爱莫能助,但他提到他同事demon是做医疗硬件研发,应该对这块会比较了解。第二天和demon约在支付宝大楼(晚上8点以后)见个面,聊聊我的想法,那天我写了18页ppt,详细讲了讲我对未来产品的一些看法,滔滔不绝讲了近一个小时,再次进入亢奋状态。最终结果:demon相信我讲的产品未来会有市场,但他不看好以后会大卖,他愿意兼职帮我来做这块硬件工作,但我委婉拒绝了,因为我找得是合伙人。

时间进入2014年初,一直在寻找合适的人,去做自己更喜欢做的事,但内心也担心智能硬件浪潮发展太快,会错过大家所谓的风口。喜欢丁肇中先生的一句话,意思大概是这样的:大多数认为既定事实,但我还是不这样认为。

2014年4月通过同事介绍认识目前合伙人骆超,这小伙在大华主要做嵌入式研发,按他的话说:在嵌入式开发中最懂硬件的,在硬件研发中最懂嵌入式开发的。这么自信?后来交往中,也发现确实是一个自信的小伙。我告诉他,想做一款智能甲醛检测仪,可以通过手机来进行控制,超标后实时告警。现在市面的产品都是单点,而且丑陋,想把做成联网、精美,就像Apple手机。

2014年5月晚上跑到骆超住的地方,想问问他的想法,是否愿意一起去做这件事情,并把事情做好。他给我的回复是,想兼职帮我做硬件块的研发。那天走的时候,我让他再好好想想。因为我到目前为止,没有发生哪家公司的员工是兼职做事做成的。当然我也充分考虑到他的经济压力,毕竟刚毕业两年,接下要买房买车,如果出来和我一起干,短时间可能就没有多少收入。做任何事情都不是在选择吗?看自己选择是否靠谱。我记得他两周后给我答复的,愿意出来和我一起干。他申请在6月中旬离职,同时我也申请了离职。在这段时间里,骆超已经做出一个简单demo,可能并不完美,但至少把研发产品过程中重要环节打通了(后来我才发现,硬件研发真的不是我做软件那样的)。那段时间,我、骆超、小朱三个在小朱的出租房讨论公司的商标、品牌等。Bbrain:The B-brain, the bridge to your brain;我们就做人的第二大脑。大家觉得都不错,但发现品牌、域名啥的,都被注册的了,放弃。

2014年6月,天好热。因为要解决办公场所问题,我骑着电驴,把三墩、良渚、拱墅都跑了遍,都没有找到合适的,不是价格太贵,就是太偏(没地方吃饭)。在回家路上,路过良渚硅谷,字好显眼,于是就跑到这栋楼去问一下,说前两年,房子免租,但有税收要求(ZF不会给你免费午餐),上面写得很清楚,不到多少万,要清退的。当时那管那么多,能免两年也不错,去看一下房子,顿时石化,这些房子本来是商住两用的Loft,都是拿来卖的。因为这几年房产不景气,政府从开发商哪里租过来的,楼层太高,让我想到是装修成本要增加,而不是空间宽敞,55平米的空间,使用面积只有35,够坑爹的。能免租两年的诱惑,让我决定了这是我们第一个办公场所。在公司事务、产品上主要完成以下几件事

1.外观设计方案确定 2.公司品牌、Logo、域名申请、公司名称、公司网站再次讨论 3.电池方案确定(wifi or ble4.0)4.传感器如何采购
5.app所有bug fixed 6.app界面美化讨论 7.app和甲醛传感器联调方案讨论8.app在22日出一新版本(美化后),月底之前定型 9.app文案确认
10.预售方式讨论
11.一次推多个产品(CO、烟雾)12.蓝牙偶尔连不上问题 确认

2014年7月,公司营业相关所有证件都办好,拿了这些证件去申请办公场所。好吧,等待呗,大家都知道ZF的办事效率。最让无语的事,一个街道的事,居然不能一个地方办完,要两头跑。取公司名,那正是个挑战,取了50名字,哪到工商所一个一个查,全部被毙,回来后,又想到20个,其中就有凹凸、圆缺、甜饼,再去工商所一查,这三个全部都可以,但前面两个寓意不是很好,所以公司名字就确定下来了。为什么取名甜饼?只要你愿意动手,就能做出各式甜饼。
寓意:迈出创业第一步,创造丰富多彩的世界。开始联系装修公司,确定装修方案。1.App第二版开发完成 2.公司的品牌的信息进一步确认 3.完成竞争对手的分析

2014年8月,装修完成,用了环保材料,所以装修完10多天后,就搬进来了,坐在一起办公效率更高。采购办公桌、办公椅,书架等,其中最难忘两件事:我和骆超把组合办公座椅装起来搞到晚上12点,直到保安来说,晚上不能用电钻,影响周围人休息;150多平米的面积地垫是我们自己铺的,还有贴脚线都自己搞定。我开玩笑说,原来我们也可以去接搞装修业务了。终于在这个月把wisheal这个字母造出来了,wisdom和health的组合,现在想找个靠谱的单词几乎没戏,要考虑读起来顺口、域名、商标、寓意。本月还讨论公司产品研发的先后顺序,但在今年年初时,我才发现对硬件研发评估太过乐观,后来遇到一系列的奇葩的事情,让我觉得硬件研发,真的是那么痛苦,痛苦并快乐着。

2014年9月,小朱设计公司的logo、wisheal字体、app美化。硬件成品就差一外壳。中间有小插曲,第一版出来的时候,感觉PCB板设计有点大,人的手不太容易握住,建议把PCB板继续减小到直径7.5cm,我们把研发出的PCB装到我们手板中,感觉设备好轻,只有45g左右,让我一个搞设计朋友胡军看一下,手感如何?太轻,建议加配重块,这个大小物品,最好在70g左右,人的手感会是最好的。产品还做很多优化,如何让纽扣电池工作持续一年;温度的采集等。结构设计金兄开始介入,金兄和一样,都是82年,已有10年结构设计经验。骆超联系了中国计量研究院,开始为自己研发的产品去拿证书,在这样大环境下,证书成了打开销路必要条件之一(国家没有强制要求),我们目标校准证书,但在后来比较意外,拿到检定证书(国家最高计量证书)。

2014年10月,app最后一版定稿,并修改完成。这个月,我、骆超、小朱、金兄一起在找模具供应商,余姚、台州黄岩、深圳、广州、东莞、昆山、苏州,把中国模具实力强的城市都寻找了一边,余姚、台州黄岩主要做粗模,精度做的不行,后来跑了趟余姚,发现余姚模具人都非常钦佩广东那边模具公司,报价一般,不算贵,但精度不符合我们要求。昆山、苏州精度还是能满足我们的要求,但价格偏贵。决定在1688.com上找广东那边模具厂,不是说1688上不好,有时1688成了不诚信的帮凶,1688.com找了家“东莞市坚胜实业”,诚信记录在同行中,属于最好的。于是联系厂家,安排骆超实地去考察一下,实力如何?骆超从东莞回来后,反馈这家模具厂实力还是非常强,在团队内部讨论后,决定在这家公司做。原因:实力强,价格合理。麻烦才刚刚开始,遇到没有契约精神的“坚胜实业”,后来导致我们的产品一拖再拖。电子原件的采购,我们尽量通过合理避税的方式来减少成本。因为我们传感器用的全球最好dart甲醛传感器,如果从中国供应商这边拿的话,150元RMB一个,如果从dart官网预定,成本可以控制在135元(加增值税及关税),当然你如果有货代的朋友认识,你懂的,成本控制在100元以内,如果从dart直接进甲醛传感器的膜片,当然一个传感器成本可以控制在60以内,当然你要把膜片加工一下。量大的情况下,这个很能节约生产成本。从英国寄过dart传感器在10天后终于收到,当然都是没有校正,说白了,就是测试甲醛的时候,会不准确。校准过的,卖得还要贵好几欧元一个,像我们这样农民家,只能自己去深圳dart中国办事处做校准,可以省下300欧元。骆超去深圳把dart传感器做了校准,并且那边有dart的人告诉你如何去校准,一切顺利。还有一件事,让我们耗了不少时间,就是外壳的表面处理。我们看到很多外壳做的非常漂亮,大多数是进行表面处理,就是上过漆。漆的成份中就有甲醛、TVOC等,当我们手板上过漆,放了一个月后,检测甲醛还是严重超标的。油性漆不行,我考虑到水性漆,找几家水性漆供应商,拿了检测,通通不行。结论:我们的产品是不能表面处理的。不表面处理后,外观上确实逊色很多。但装饰圈一定需要表面处理,不然实在太难看了,我们起先想,有没有银色的注塑料,拿了很多样品,色差实在太大,无法接受。小朱后来提到,能否镀锌?为了验证这个,我们让厂家把电镀后的成品拿来,发现全部不行。正在为这事为难时,厂家建议我们用RoHS认证原料试试,抱着一线希望,我们继续测试,发现这个效果确实不错,甲醛含量很低,又一难题解决。我们又开始怀疑abs的原料是不是也会有甲醛含量,但这个很快被否认了,因为甲醛检测仪的产品市面不上就有吗,他们是怎么做到的,后来有个注塑工说,只要不是回收料,问题会好些。那么我们把市面上比较好的abs注塑原材料拿来,一个一个做检测,最后效果不错,只要不是回收料,甲醛含量还是比较低的。最后结论:表面不处理,用模具工艺解决;装饰圈用电镀,电镀用RoHS认证原料;注塑颗粒要好。

2014年11月,我又对我们的产品又做一次全面分析,我们的产品优势到底在哪里:携带方便、实时检测、外观大气、蓝牙操控,数据可永久存储。做为一个学计算机是不是都要会计算机相关工作呢?答案是肯定的,必须都会。开始做公司网站。看了很多互联网公司,都是做非常大气,大图加HTML5,做得非常漂亮,对于我只要会点PHP要求有点高呀。淘宝上真的什么都有,只有你想不到。在淘宝上找一个模板,测试一把后,效果不错。在阿里云买了空间、数据库把模板布了上去。开始个性化修改,改一个多星期,把网站搞定。这个过程中,小朱做了不少事情,因为图片都他一个人搞定,做工业设计的,要让他做UI,App图片也他搞定,挺厉害的。公司小,一个人干多人活,大家都挺辛苦的。因为我比较重视知识产权,开始申请各种专利,现在申请专利也挺方便,淘宝上有代理,中国专利很有中国特色的,只要外观专利、实用专利基本在都是100%通过,发明专利也在80%左右,说得直白一点,就是交钱,拿专利。专利等待时间也是够长的,基本在一年以上才能拿到证书。甲醛检测仪包装设计也是小朱搞的,也做非常大气。设计完后,联系包装生产厂家,一直怀疑包装中甲醛含量也会比较高,所以把候选的厂家包装都拿过测一遍,后来在温州苍南做的,价格合理,纸张效果不错,两周后交货。

2014年12月,确定了模具生产厂家并签了合同。结构、硬件工程师和模具厂充分沟通后,模具制作开始,45天加工期,因为中间隔了春节(模具厂放假两周),在2015年3月初才成拿到外壳。当然这其中有模具界所说的T1、T2。为了能节约PCB生产成本,骆超在Taobao上多家店铺进行比较,并把各种原器件的成本及性能达到最优。同时也学到硬件电路板生产主要环节:1、pcb生产 2、元器件购买 3、pcb贴上元器件。最终找华强快捷,货全、价低、质量有保障。在深圳做校准,知道了如果去校准dart传感器的流程。在Taobao上很多甲醛检测仪都校准不规范或根本就没有校准,但运营做的好,产品也卖得不错。很多消费者被这些无耻广告所蒙蔽,所以我们决定在自己宝贝detail页面来揭露这些事实,希望能改变目前这样现状。3月份就能见到一款产品,那是非常亢奋,筹划一系列事情,如何在B2C店铺上展示宝贝信息、如何运营店铺及论坛、如何强调我们的优质服务。我们还讨论做智能健康产品垂直市场未来发展,现在像阿里、京东都已在做智能硬件的垂直市场,当然在这个市场里还可以细分,要做的就是专一,因为资源有限,暂时不去做这个事情。

进入2015,像我们第一款蓝牙甲醛检测仪,在外国需要拿到认证或许可,再才能国外市场上销售,如蓝牙标识、无线通讯。我们意识到,不会在国内也需要这样认证吧(经验不足)。咨询3C认证,给得明确答复是,类似我们这样产品目前国内还有强制认证。还有蓝牙标识,不能随便用,后来了解到,国内也是有要求的:制造商的设备必须符合蓝牙技术联盟的标准才能以“蓝牙设备”的名义进入市场。你懂的,在国内市场就是这样的,条条框框很多,执行力不够,也就是条条框框。检测仪上有个问题,就是安装电池不太方便,都需要一元钱硬币才能把电池仓打开,影响用户体验,我建议,再增加一个部件,这样用户不会为安装电池,需要找一元钱硬币去打开电池仓,同时在这个部件上增加公司信息,也做宣传的作用,而且没有增加成本。小威的包装还有一点,让我担心的:就是甲醛传感器会中毒现象。传感器的中毒会导致传感器不能正常工作。我们测试几个传感器,几乎每天传感器都会中毒,但是恢复正常工作的时间,每天传感器就相差很多。有的传感器半小时就解毒了,可以正常工作,但有的传感器放在通风的地方,48小时都不解毒不了。咨询dart技术人员,这是很普遍现象,他们建议电路放电,加快解毒,使用传感器工作正常。既然直接放在包装盒内会导致传感器中毒(纸盒的材质用的是最环保的),那我们是否可以在设备外面套个袋子,隔绝和纸盒接触呢?那首先需要去人袋子是没有问题的。拿食品级保鲜袋,在测试中,确实没有问题的,但放了一个晚上,甲醛传感器还是会中毒,因为把设备闭袋在袋子里,外壳本身多少会释放甲醛,虽然很微量,但时间一长,在狭小密闭袋子里,甲醛浓度也会快速上升,看来这个方案也不行。后来我们得出结论,既然都会有中毒现象,我们只能做的,在用户拿出设备后,能够快速解毒,恢复正常工作。经过测试,大多数设备,如果放在通风处,基本能在30分钟后,正常工作。以为小威事情基本就这样定了,所以开始花精力到下一个产品的智能空气净化,说实话,团队没有空气净化的基因,做事情就要从头开始,这样也会导致产品研发的速度变慢,最好是能找到这样人一起合作,找了很久,也没有找到,还是自己来吧,什么粗滤、精滤,使用什么材料来做这样过滤,效果最好?1688上也有很多做OEM、ODM的。我的基本思路这样:产品外观设计、结构设计都自己搞定,核心部件滤芯找专业人设计,其他都OEM。这样可以做到让每个人做最擅长的事。1月份的天气真的很冷,没有空调,手都不敢伸出来敲键盘,买了个小太阳,也无济于事,这里空调一开起,那个电费真是惊人,都没人愿意开。唯有坚持。

2月进入春节季,传统行业很早就放假,模具厂不也例外。挨踢企业还是在忙碌的。因为刚开始做产品的时候,成本并不是最重要的,设备稳定还是第一,所以采用了TI的芯片,价格稍贵,但文档比较全,遇到问题,能够快速解决。因为我们有100台的样机要做活动,需要100块蓝牙芯片,代理商以样品的方式免费帮我们搞定,小企业能省则省。我喜欢这样代理商,能站在小企业立场去考虑问题,后来我们和他们合作,价格两方都可以接受。公司放假10天,我也没有出去,回了趟老家,把公司的产品给他们试用,就当做些宣传吧。

3月期待的模具交付时间了,但模具迟迟不能交付,坚胜实业每天都能给出很多解释,发了N多道歉信,在模具就是没办法交付。我们给了不止4次机会,还是没办法交付,要知道1次机会,就要等7天时间,因为修模最小周期就是7天,修完后,寄过来,还是没有把老问题解决掉。这让我想到小时候上学,有个女同学不太爱学习,老师让她去黑板解个数学题,第一次解错了,老师也和她讲哪里不对,该如何解,那位女生也点头明白了。第二天,老师又叫她去黑板解题,她还是解错,还是按她一套在解。老师后来也只能呵呵了。坚胜实业就是这样。万事具备,只差外壳,坚胜能力不行,导致我们的产品一次次延期。前同事一次次问我,我们的产品什么时候能够上市,拿来试用一下,有时我都不好意思说了。其实我们考察坚胜的时候,从表面上看,感觉实力还是不错的,但从操作流程上,坚胜公司就不是很规范。我们拿到T1阶段的试模,发现了不下10处问题,尽然没有按图纸来,上下盖都盖不起来,这个错误都能犯,非常无语。自己都没有装配过,就直接发过来,我们一装,根本就装不起来,这里可以看出极不负责。按正常流程,这10多处的问题应该是模具厂先发现,联系我们结构工程师,和我们工程师讨论解决方案。而现在变成了,我们(客户)发现寄过的试样品,反馈问题给模具厂,模具厂的人才会和我们再次沟通,还不是很积极。问题两方都确认一下,以为下一次问题都解决,原来是我想多了。

又给坚胜实业一个月时间,4月又是心累的一月,骆超一直在跟进这个模具的问题。金兄看到坚胜做出模具,彻底无语,品质实在不敢恭维,金兄可是有10年结构设计经验,他感叹道:他们确实没有用心去做。在4月底,团队内部讨论,放弃坚胜的这套模具,因为遥遥无期,对于没有契约精神的企业,我们唯一能做的,就是终止合同。当我们做下这个决定的时候,坚胜已经违约64天。我打电话给坚胜戴总电话,我们已要求终止合同,按违约责任进行赔偿。坚胜戴总在电话里还说要给他们一次机会呢,那我请问戴总,谁给我们机会的,甲醛检测仪的销售时间已过,即使我们再把产品做出来,销量也会收到影响。进过两个多礼拜的协商,他们把模具钱加违约金赔付我们,这个事就了了,但事情又不是这样发展的。说实话,我也不想再这个没有结果的事情上,多花精力。和坚胜鉴定终止合同后,我们分析为什么这次合作会失败:1、没有专人在他们公司盯着这事2、没有深入了解对方(最好能通过熟人介绍)。 想了很多办法去找下家模具厂,有次发现硬蛋能够解决上下供应商的问题,交100元会员费,注册后,发起寻找靠谱模具厂。硬蛋网客服在3个工作日就给出2个供应商,我说我希望多点,客服又给我介绍3个。还有我一个朋友介绍1个,一共6个。开始一个个联系,计划再跑广东一趟。骆超去北京拿中国计量研究院甲醛检测仪认证证书,因为我们检测仪增加校正功能,所以检测非常精准,出乎意料拿到最高等级的。后来我们拿了市面上很多甲醛检测仪做了对比,发现很多检测仪基准调得很高(包括天猫上卖的最好一款),说白了,就是检测是不精准的,但销量还是非常好。所以当你的产品不行时,把运营做好,如果运营没有做好,没事,还有一招,低价,当然我可以明确告诉大家,买低价或基准调得很高的产品,其实就是买心安。他还去山东看望一白血病女孩,因为我们想在我们淘宝众筹加入感情因素,公司承诺众筹的16%会交给女孩继续看病。小女孩他爸怀疑是幼儿园新装修,导致他女儿患上白血病,骆超还特地去了小女孩幼儿园,但没办法进入幼儿园实测,但听小女孩说,幼儿园的气味有点重。这个月我开始做Android版的开发,我发现上众筹的,基本都有iOS、Android版,我们不能“歧视”Android用户吧,Java已有N久没碰,花3天时间回顾Java基础、10天左右时间学Android开发,就开始上手了,有时想想自己,还真佩服自己的,每天写代码到凌晨,头发又白很多。有一天发小来看我,一看到我说,老了很多呀。还是那句话:创业者没有周末,不要说没有时间,时间自己想办法。不要说办事人不够,说不够的人说明自己能力不行。

5月和坚胜退回模具款及违约金迟迟没有打入公司账户,无诚信可言。为了保护自己权益,每次电话我都会把录音录下来,要回模具款花了近20天时间,但违约金到现在还没有要回来,让一个律师朋友帮我去跟这个事情,真的心累,遇到这样垃圾的公司。一朋友说的是,做硬件的供应链的任何一个环节出问题,你都没办法去快速解决,只能等。锤子手机也遇到过同样的问题,这不是公司大小的问题。和做软件不一样,你加个班,东西就可能赶出来了。硬蛋那边给供应商都联系后,骆超和金兄再一去广东。当然我们做更人性化的优化,特别是指示灯:为了防止误触,长按3s后,才会打开蓝牙,有人会问,为啥蓝牙打开后,蓝牙灯就灭掉呢,因为我们为降低能耗,我们做过测试,如果把蓝牙灯常亮,纽扣电池只能连续工作一个多月。还有告警指示灯我们做时间限制,如果甲醛超标,我们不会一直让它告警,电池消耗也快,我们做连续告警600s。我们努力让产品更人性化,因为这是唯一我们能够控制的。第一版Android开发完成,测试OK后,上传到google play、豌豆荚、小米等,小米审核让人蛋痛,来回折腾很久,买了小米Pad,测试也OK的,后来告知上小米Pad需要横竖屏,但我的app根本就没必要横屏呀。小米开发客户也挺有意思的,建议我只提交手机,pad就不要提交,给我审核通过了。好吧,每家公司标准都不一样,只能按每个公司标准来。开发这个app最大收获:Android设计太复杂,能学一下iOS吗?蓝牙4.0也不够稳定,为了解决一个蓝牙连不上的问题,Android你可知道我stackoverflow里面ble4.0文章都看遍,Android文档中ble4.0熟读10遍以上,最后居然在Android的bug库里找到了,这个bug好几年了,google都没解决,最终通过迂回的方式,暂时规避这个问题。

6月确定了和深圳明昌丰合作。6个候选中,我们给每个公司做了评分,从规模、样品品质、加工设备、技术,深圳明昌丰排名第二、为啥会选择深圳明昌丰呢?主要还是技术方面确实给我们一种新的开模方式,其他5家都没有提到这种方式,金兄确认后,确实这种开模效果会不错,而且成本还可以减少。工期45天,估计在8月初能够拿到成品。骆超刚从深圳回来,反馈消息说,模具生产已完成70%左右了,非常期待。我花的最多时间是在考虑公司的方向:是卖硬件 or 做检测平台。人家说要想把公司方向想清楚,写BP是不错方式,确实我花了两个星期,把BP写完,公司方向也确定了。天开始热起来,依旧没有空调,热的时候,只能电扇,唯有坚持。

流水的方式,简单记录一下这一年干的事情。生活方式比以前变差,以前在Ali的时候,没有事情的话,基本晚上12左右就睡了,现在基本1点以后才睡,还是希望自己能够调整好作息,这样才能更持久呀。

iOS 7 statusbar 需要知道的

最近在用sharesdk的过程遇到一个很奇怪问题:http://bbs.mob.com/thread-317-1-1.html
点分享按钮时,弹出modal view会把statusbar从白色改成黑色,几乎把http://stackoverflow.com/上关于statusbar的帖子都看完了,还是没有解决。
只能自己解决,从两方面入手
1、自己写个modal view,同样方式跳出,会不会把statusbar改变
2、和sharesdk的人确认,是否对navigationbar进行修改,把案列代码发给sharesdk

从上面帖子中,可以发现,自己写modal view没有改变statusbar,那就是sharesdk的问题?把sharesdk的demo拿下来一跑,奇怪了,尽量正常的,测底无解了?

sharesdk的开发同学联系我说,他们新建project后,把我发给他们代码import过去后,是没有问题的,但就是我发给们的project还是有问题。从这句话中,我发现有一点,那就是plist文件被新建了,在本地把原来project中的plist文件重建后,app果然正常了,但新的plist和老的plist没啥区别。

这里强调一下statusbar需要知道点:
1、plist中设置View controller-based status bar appearance = YES(默认就是为YES,VC控制statusbar隐藏与样式);preferredStatusBarStyle,可以让用户指定状态栏风格。但这个方法只有在ViewController不包含在UINavigationController中时才起作用。但我们在ViewController时一般都和UINavigationController一起使用。

-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

老外提供解决方法:http://mythodeia.wordpress.com/2014/05/09/view-controller-based-status-bar-appearance

2、View controller-based status bar appearance=NO(对整个应用statusbar做统一处理)
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

ios状态栏颜色问题解决方案

http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7上有很多解决方案,但一直不成功,后来仔细看了下面评论,问题解决。

http://stackoverflow.com/questions/19022210/preferredstatusbarstyle-isnt-called/19513714#19513714

The UINavigationController does not forward on preferredStatusBarStyle calls to its child view controllers. Instead it manages its own state – as it should, it is drawing at the top of the screen where the status bar lives and so should be responsible for it. Therefor implementing preferredStatusBarStyle in your VCs within a nav controller will do nothing – they will never be called.

The trick is what the UINavigationController uses to decide what to return for UIStatusBarStyleDefault or UIStatusBarStyleLightContent. It bases this on it’s UINavigationBar.barStyle. The default (UIBarStyleDefault) results in the dark foreground UIStatusBarStyleDefault status bar. And UIBarStyleBlack will give a UIStatusBarStyleLightContent status bar.

If you want UIStatusBarStyleLightContent on a UINavigationController use:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

不务正业之OC(十五)–代理设计模式

什么是代理设计模式:两个对象相互协作,完成共同的目标。
比如:A需要开发一个app,但又不会,把这个需求发到网上去,这时B看到A的需求,B说我能完成这个任务,B接到这个任务并完成后,通知A。

特点:
1、减小对象之间的耦合度
2、无需子类化

代理设计模式按书上例子写一下:Person实例要找房子,但Person实例没有这个能力,那就委托给Agent类去找房子,找到房子后,和Person实例说,我找到房子
Person类、Agent类、FindApartment协议

 
//  Person.h 
 
#import <Foundation/Foundation.h>
#import "FindApartment.h"
 
@interface Person : NSObject
{
@private
    NSString *_name;
    id <FindApartment> delegate;
}
 
@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) id<FindApartment> delegate;
//初始化Person对象name及委托人(找谁来找房子)
- (id) initWithName:(NSString *)name withDelegate:(id <FindApartment>) delegate;
//Person对象需求
- (void) wantToFindApartment;
 
@end
 
//  Person.m
 
#import "Person.h"
 
@implementation Person
 
@synthesize name = _name;
@synthesize delegate = _delegate;
 
- (id) initWithName:(NSString *)name withDelegate:(id <FindApartment>) delegate{
 
    if (self = [super init]) {
        self.name = name;
        self.delegate = delegate;
    }
    return self;
}
 
- (void) wantToFindApartment{
    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:nil repeats:YES];
}
 
- (void)startFindApartment:(NSTimer *) timer{
    [self.delegate findApartment];
 
}
 
@end
 
//  Agent.h
 
#import <Foundation/Foundation.h>
#import "FindApartment.h"
 
@interface Agent : NSObject<FindApartment>
 
@end
 
//  Agent.m
 
#import "Agent.h"
//委托人需要实现<FindApartment>中定义方法,Agent有这个能力来找房子
@implementation Agent
- (void)findApartment{
    NSLog(@"find");
}
 
@end
 
//  FindApartment.h
 
#import <Foundation/Foundation.h>
//协议定义
@protocol FindApartment <NSObject>
 
- (void)findApartment;
 
@end
 
 
//  main.m
//  Delegate
 
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        Agent *agent = [[Agent alloc] init];
        //委托给agent来找房子
        Person *jack = [[Person alloc] initWithName:@"jack" withDelegate:agent];
        //调用wantToFindApartment会触发定时器,每隔2s钟调用delegate(这个delegate就是agent)会调用findApartment方法
        [jack wantToFindApartment];
 
        [[NSRunLoop currentRunLoop] run];
 
    }
    return 0;
}

不务正业之OC(十三)–protocol

协议:类似一个类的接口,没有父类,不能定义实例变量;定义方法,需要被另外类实现
使用场合:
1、需要别的类实现方法
2、声明未知类的接口
3、两类之间进行通讯

两关键词
@required
@optional

 
//创建协议
//  MyProtocol.h
 
#import <Foundation/Foundation.h>
 
@protocol MyProtocol <NSObject>
 
@required
- (void) requiredMethod;
 
@optional
- (void) optionalMethod;
 
 
//  Person.h
 
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
 
@interface Person : NSObject <MyProtocol>
 
@end
 
//  Person.m
 
#import "Person.h"
 
@implementation Person
- (void) requiredMethod{
    NSLog(@"must require!");
}
 
- (void) optionalMethod{
    NSLog(@"may optional!");
}
@end
 
//  main.m
 
#import <Foundation/Foundation.h>
#import "Person.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        [person requiredMethod];
        [person optionalMethod];
    }
    return 0;
}