iOS自动打包程序mac版,我遇到的那些坑(一)界面篇
之前一直使用的打包脚本不好用了,再加上一直对自动打包很感兴趣,所以决定自己动手 DIY 一个自己的打包程序。为什么要选择 OS X 的源生程序而不选择脚本呢?原因有三:
1、对这个 iOS 的亲爸爸有点好奇。
2、觉得自己凭着对iOS的理解可以完美驾驭OS X。
3、电脑才是程序猿的真爱,所以我觉得做一个电脑程序的成就感远大于手机。介绍完前提了,马上开始动手迎战mac程序。先打开吃饭的家伙Xcode,选择新建OS X工程。赫然看到程序中的mainMenu.xib十分碍眼,决定动手干掉(PS:由于本人对纯代码十分偏执,所以新建的任何类都不包括xib文件但是也遇到了不少问题,耽误了点进度)。然后我就傻眼了,didfinishlaunch都不执行... 想了想自己还是火候不够,暂时妥协(PS:我会回来的~)。run了一下工程算是我的 mac 版的 hello world 吧,一个灰色的面板,我心想未来的这段时间我就好跟你玩命了。
打了个招呼马上动手,我在程序的 appDelegate 中看到了一个 window 的弱引用属性,纯代码的偏执又来了,打开了mainMenu.xib一看,小样果然躲在这里,毫不留情一个delete删掉,删掉弱引用属性,看了看干净的appdelegate心中无限的畅快。
(第一坑)
再 run 程序,麻烦来了窗口没了...怎么办?怎么办?结合刚才删的弱引用属性,我应该是没有显示的 window 了。查了一下文档发现原来 OS X 的程序和 iOS 的程序在显示的时候理念相当不同,此处我大致说一下我的理解其他还是需要大家自己体会。
(iOS 和 OS X 的显示基本概念区别)
iOS 受限于手机的显示屏的尺寸,为了更好的用户体验所以每个程序基本只有一个 window ,也就是我们所说的窗口。当然有限情况我们也会在不知不觉中引入其他的 window ,不过 iOS 系统已经为我们做了优化,你可以无痛的使用。在 iOS 的世界里基本单位是 View 和 ViewController,虽然 mac 中也存在 view 和 ViewController 但位置远没有像在 iOS 那么风光无限。mac 中每一个窗口都是一个 window 可以拖动,调整大小,打开关闭。而 View 和 ViewController 就是其中的一些控件组成元素,展示控件云云。
(第二坑)
既然这样我们创建一个 window 吧,基于 MVC 的设计模式的思想,我创建了一个 windowController 果断点掉 xib,run 一下程序发现竟然什么没有。关掉查了一下, windowController 中并没有自动为我们创建 window (PS:心中暗暗的后悔),需要自己手动创建,动手。还是什么也没有。我都傻了,各种试各种查,最后一个偶然的机会发现是由于没有手动持有!!!感觉 rootwindow 并没有被系统持有,被自动释放掉了,所以并没有显示,再此特别提醒,window 一定要手动持有,切记。
(第三坑)终于显示出来了,真是没想到作为iOS的生父,竟然如此大的差别,擦擦眼泪让我们继续,我想还是先从简单的入手吧。既然要显示,自然离不开伟大的tableview,坚持纯代码路线不动摇,先从代理入手吧,看了一眼NSTableview的delegate和datasource就崩溃了,好像看见了最熟悉的陌生人一样。光说太抽象了,还是看看图吧。
赫然引入了一个新的概念column,顾名思义就是列的概念,我不是很熟也就不班门弄斧了。可是在用代码实现tableview的时,初始化,实现代理,可是不止界面上干干净净连代理都没有进。再次入坑,这次解决办法是,使用addTableColumn方法为tableview添加一个column,我理解系统是把column当成了一个基本的显示单元,如果刷新的时候找不到,就认为没有东西要显示不会进任何datasource代理方法,不会显示任何东西。
- (void)addTableColumn:(NSTableColumn *)tableColumn;
仔细观产了一下NSTableview的继承树,真的UITableview的设计理念有很大的不同。一开始我很不理解,仔细的考虑了一下,这可能是和哥俩的使用系统环境决定的,那我们就分别来看一下他们的继承树。
这样我们就基本扫清了,显示控件的坑。接下来我们开始完成我们的打包功能。
(未完待续)