Interface Builder,是用于苹果公司Mac OS X操作系统的软件开发程序,Xcode套件的一部分,于1988年创立。它的创造者Jean-Marie Hullot自称是“一个热爱旅行、充满激情的摄影师”,本篇分享Hullot热爱技术的那一面——创造Interface Builder的过程。

因势而动

1981年, Jean-Marie Hullot拿到巴黎第十一大学的计算机科学博士资格后,开始了法国国家信息与自动化研究所(INRIA)的研究生活。

Jean-Marie Hullot的名字似乎不为大众所熟知,但他设计的Interface Builder 却深入人心,创造了一个个软件神话。

20世纪70年代初,正是面向对象程序设计开始走上历史舞台的时期。许多现代计算机技术的诞生地Xerox PARC(施乐帕洛阿尔托研究中心)的Alan Kay、Dan Ingalls、Ted Kaehler 、Adele Goldberg等人,从1969年开始研发一款面向对象的程序语言Smalltalk,并于1980年正式公布。这是一个完整地实现面向对象范型的编程套件,包含了一种面向对象的程序设计语言、一种程序设计库和一个应用开发环境(ADE)。

虽然当时的机器跑得巨慢无比,但Smalltalk先进的思想对其他众多的程序设计语言(Objective-C、Actor、Java和 Ruby)的产生起到了极大的推动作用,对计算机工业界的发展产生了非常深远的影响。我们将会在今后介绍Objective-C时,详细介绍Smalltalk及其对Objective-C的影响,这里先一笔带过。

Smalltalk的发布在业界一石激起千层浪,也给Jean-Marie Hullot幼小的心灵带来了巨大的震撼。他立即明白了面向对象思想所代表的先进生产力,一定会改变今后数十年的程序设计流程,他毫不犹豫地成为面向对象编程模式的早期粉丝。

SOS的助力

那时,Jean-Marie Hullot使用早期的Macintosh计算机进行开发。不过他很快就和其他开发者一样,发现虽然Mac的用户界面做得不错,但开发程序实在是太糟糕了。他说:“当Macintosh被发明出来时,计算机和先前就大不一样了,你至少需要花60%~70%的时间在用户界面部分的代码上。”在Macintosh被发明之前,用户界面是相当简单的,只需要在命令行下面打一串字符,计算机就会回应出一行行的信息。所以在那个时代,开发者完全不需要专注于用户界面。而Mac一经发布,随之而来的众多的窗口和菜单,让整个世界都不一样了。虽然对于使用最终产品的用户而言是简单方便的,但对于码工来说简直是个噩梦。每次他们需要一个窗口或者菜单,都要从零开始构建。

聪明的Hullot开始动脑筋改进Mac编写用户程序难的现状。他开发了一个程序,有点像现在Windows系统中的“画板”。一侧的工具条,是类似菜单这样的大量可重用的对象;而另一侧,则是程序员想构建的用户程序界面。只要把工具条上的工具拖放到程序界面中,那么类似“打开”、“打印”等相关的功能,就可以被添加到用户界面中。事实上,这个程序,是最早的一批能通过鼠标把控件拖入界面设计窗口实现相应功能的商业程序,是用户界面设计软件的先驱。

这个跨时代的发明被称作SOS,用Lisp语言编写【注:What are we going to called this thing中认为此时就是Interface Builder,但据The NeXTonian等多处资料表明,在Steve Jobs见到以前,该程序名为SOS】。当时,ExperTelligence开发了一种叫做ExperLisp的方言,SOS即用此语言写成【注:http://en.wikipedia.org/wiki/Interface_Builder】。

此时Hullot忽然意识到,他设计的东西事实上很强大,其重要性简直可以和Smalltalk这样的发明相比——Smalltalk让开发者尝到了面向对象语言的甜头,而SOS则是直接把对象放到了开发者手边。有了这么拽的东西,Hullot意识到如果他只在研究所窝着,那只能让十几个人享受这一成果,而如果他跳槽,把这个工具公开,那对天下的码工来说可是大福音。

诞生之源

经过不断努力,Hullot找到了一个值得推销自己发明的好地方——剑桥的苹果大学联盟(Apple University Consortium)。这个苹果和大学合作的组织看到Hullot的创作后反响很好,就推荐他去见Jean-Louis Gassee。 Jean-Louis Gassee是个法国人,时任苹果开发研究院主任,见到SOS后也认为这是个好东西,便说服他去美国闯一闯。经过几次的鼓励和推荐,加上美国对Hullot来说又不陌生,于是他就买了机票跳上飞机就奔赴美国。

不过当Jean-Marie Hullot来到美国加州苹果总部时,他却认为这不是一个工作的好地方——苹果已经是一个很庞大的企业,很难再有所创新发展。他最终决定不留在那儿,转而在美国寻找一个能把这个产品卖出去的人。四处推销之后,找到他用来写SOS的Lisp解释器的生产商,就是刚才提到的位于Santa Barbara的软件公司 ExperTelligence。

事实上,当时的ExperTelligence正在寻找合作商卖自已的Lisp,而Hullot也在找合作商卖自已的 SOS,两者一拍即合,随即打电话给 NeXT,共同推销自家的产品。

NeXT在Palo Alto总部的产品市场部人员接待了Jean-Marie Hullot和两位来自ExperTelligence的员工,被SOS的理念镇住,遂打电话请Steve Jobs下来看。Jean-Marie Hullot像复读机一样又把自己的大作秀了一遍。老谋深算的Steve Jobs事实上早就看中了SOS,但他对ExperTelligence的Lisp一点兴趣都没有。所以他装作对这场演示毫无兴致【注:这有很多引用该文的翻译译错,原文说nonplussed,字面意思为惊异,但在美国非正式表述中,此字表毫无兴致】,挥挥手就把这三个人打发走了。

但当他们一行人走到停车场时,Steve Jobs让他手下把Hullot追了回来,当他只身回到NeXT总部时,发现Steve Jobs正恭敬地等着他。

“我想要你计算机上那个程序”【注:http://rixstep.com/2/0/people/】,Steve Jobs说道:“你大概什么时候能开始给我们工作?”

Hullot回答说自己翌日就要离开去度假。

“好吧,我两周后给你打电话,”Steve Jobs说。

“不行,老乔”,Hullot表示:“我不游美国,我可要环游欧洲,你七个礼拜后再打给我吧。”

Steve Jobs虽然一骨子傲气,但他明白一个简单的道理:21世纪最缺的是什么——是人才!即使Jean-Marie Hullot玩起了大牌,这电话自然还是要打的。Hullot刚一度完假回来,Steve Jobs的电话就如期而至。

如此三顾茅庐般的热情,把Jean-Marie Hullot感动得第二天就登上了去美国的飞机。合约签了半年,但实际上他最终在NeXT整整待了十年。在NeXT工作期间,他使用Objective-C和NeXTSTEP框架重写了SOS,命名为Interface Builder。由此,Interface Builder成为NeXT集成开发环境 Project Builder标准套件之一。

进阶与探索

Interface Builder和SOS一样,提供了一个工具箱,包含一系列用户控件对象。工具箱并不是官方定死的,而是可以任意扩展的,比如如果用户想使用类似Safari中的toolbar,而这不是官方提供的,则下载第三方的PSMTabBar即可实现,甚至连Cappuccino这样的网页框架也可以用Interface Builder来完成设计。开发者只要把控件比如菜单和文本框拖入项目文件就能完成用户界面设计,节省了几乎所有和控件放置有关的代码。

开发者拖拽鼠标,将控件可提供的动作(IBAction)和另一个对象的接口(IBOutlet)连在一起, 则建立了一个绑定。这样,一旦动作被激发(比如用户点了按钮),那接口中相应的方法则会被执行。所以,大量对象关联的代码也能被省去。

有了这样的模式后,Interface Builder和Cocoa可以比后来出现的Microsoft Visual Studio或Qt Designer等软件走得更远——只要是对象,Interface Builder就能够操控它们,不需要一定是一个界面的控件。比如,数据库的数据源、队列等,都可以在Interface Builder中连接起来,于是很多原本需要上千行的复杂应用(比如用来显示、修改企业中职工姓名、部门、电话、地址、头像等信息SQL数据库的用户界面程序),数分钟内就可以写完,不用一行代码。不信?让1992年的Steve Jobs亲自做给你看【注:http://www.youtube.com/watch?v=j02b8Fuz73A, 第23分钟~第29分钟】。

NeXT被Apple收购后,苹果把下一代操作系统建立在NeXTSTEP的基础上。Objective-C和Cocoa被作为主要框架,而Interface Builder和Project Builder也因此受到重用。就官方的工具箱而言,支持Objective-C/Cocoa、Carbon的HIToolbox和WebObject。

2008年3月27日,苹果发布首个iPhone SDK,设计Cocoa Touch界面的,也正是Interface Builder。可以说,Interface Builder一直随着公司产品的发展而不断拓新。

Jean-Marie Hullot是在NeXT被收购时进入苹果的。Steve Jobs令他率领在法国的一个小团队,秘密为Mac OS X 10.2开发一个办公软件。以往这样量级的程序,都是由苹果加州总部的大班人马完成。而这次,为了向世人表明他的Interface Builder有多强大,iCal横空出世,展示复杂的界面元素(日历、可拖拽的任务、五花八门的分类)和诸多功能(网络同步、Apple Script脚本控制)可以用相当快速的时间内开发出来【注:http://www.appleinsider.com/articles/07/10/17/road_to_mac_os_x_leopard_ical_3_0.html&page=2】。

最后,在iCal小组打完酱油的Jean-Marie Hullot荣升苹果软件开发部首席技术官。

Project Builder在Mac OS X 10.3时被重命名为现在大家所熟知的 Xcode。Xcode 3以前,Interface Builder使用一种名为nib格式的二进制文件格式。不过由于nib不能用肉眼读,也不方便使用版本管理工具来管理,所以Xcode 3开始新加入一种名为xib的文本文件格式,最后再在项目编译阶段输出为nib格式。和产生静态界面布局代码的工具(如MSVC、QtDesigner、 Delphi等类似的软件)很不同,nib是不被转译成相应Objective-C代码的。用户程序执行时,nib文件被读入,解包,并且唤醒【注:awake,即载入 nib 会自动调用程序中awakeFromNib方法】,所以nib文件是在运行时动态加载的。

长期以来,Xcode环境和Interface Builder是两个独立但相互工作的程序。而2010年释出的Xcode 4预览版中,Xcode和Interface Builder合二为一,成为一个一体化的编程环境。所以现在,开发者甚至可以只用鼠标在用户界面和代码间来回拖拽就能完成,这样一来Interface Builder对用户代码的解释也比先前更正确。比早期分离的程序使用起来确实方便很多。

当然,一个负面的影响是,这样用一体化集成开发环境写程序,往往会发现屏幕空间是不够的,所以像我这样用11寸Air或者13寸Macbook Pro的人,出去打招呼都不好意思说自己是做Mac开发的。

下一个海阔天空(彩蛋)

在而后的岁月里,Interface Builder创造了一个又一个应用软件神话,小到官方教程中的汇率计算器,大到苹果所有的家用、专业软件,都由Interface Builder完成。

在风起云涌的1989年,欧洲核子研究组织(CERN)工作的科学家Emilio Pagiola忽悠经费,买来研究所的第一台NeXT计算机——当时NeXT计算机在CERN可是个新鲜事物——那里的科学家们纷纷前来把玩,普通青年发现里面有全本的韦氏词典,并可自动检查用户输入的拼写错误,技术青年发现它跑的是Unix系统,还有一个可读写的光驱,文艺青年更是发现里面居然预装了莎翁全集。不过毕竟像Emilio Pagiola这样忽悠巨款买NeXT机器的青年不多,所以大家围观完了,也就回去该干嘛干嘛了。

但Tim Berners-Lee和别人不一样,他不仅围观了那台计算机,还看到了Jean-Marie Hullot设计的 Interface Builder,研究了Objective-C,发现了面向对象编程范式开发环境的最高成就。这情景让他心中漾起了巨大的波澜,最终化为激情澎湃的投入,汇成了一行行面向对象的代码,一泻千里,奔向未来。

一年后,世界首个 HTTP 服务在CERN的NeXT计算机运行起来,而使用Objective-C和Interface Builder 所编写的超文本语言编辑器兼浏览器同步发行。他给这个主从式架构起了个好听的名字——World Wide Web(万维网)。

原文链接:http://www.programmer.com.cn/9234/

博客园链接:http://kb.cnblogs.com/page/114879

iOS开发-Interface Builder的前世今生的更多相关文章

  1. iOS开发Interface Builder技巧

    1.使view的Size与view中的Content相适应:选中任意的一个view,然后Editor->Size to Fit Content,或者简单的按 ⌘=接着就会按照下面的规则对选中vi ...

  2. IOS 使用Interface Builder开发界面入门与技巧

    引言: 通过Interface Builder(简称IB)来制作界面一直是iOS开发界饱受争议的方式.主要争议的话题是不太适合团队协作开发,再就是对IB的使用比较生疏,觉得IB只能完成一些很简单的功能 ...

  3. 【iOS】Interface Builder 预览

    Interface Builder 为最顶层视图提供了 Simulated Metrics,预览用户界面的各种外观设置效果,例如顶部有导航栏或底部有标签栏的效果,如图所示:

  4. iOS 使用interface builder 创建太复杂的constrains时容易产生crash

    今天写程序,遇到了crash,在界面初始化时不会有,想切换到别的tab页就报错了.主要内容如下: Cannot find an outgoing row head for incoming head ...

  5. IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题)

    很多时候,我们自定义tableview.collectionview的cell,也有时候我们要自定义窗口xib,但创建xib后,其height.width不可修改. 这时问题就来了,怎么才能使我们的自 ...

  6. 提高Interface Builder高效工作的8个技巧

    本文转载至 http://www.cocoachina.com/ios/20141106/10151.html iOS开发Interface Builder 本文译自:8 Tips for worki ...

  7. iOS开发工具Xcode:Interface Builder

    简介: Interface Builder(IB)是Mac OS X平台下用于设计和测试用户界面(GUI)的应用程序(非开源).为了生成GUI,IB并不是必需的,实际上Mac OS X下所有的用户界面 ...

  8. iOS开发~interface Builder(简称 IB) 界面构建器

    1.interface Builder 设置界面 1.1 是什么? 一个可视化的界面编辑工具软件,在xcode4之后整合到了xcode中 1.2 作用? 通过可视化的界面设置,能够少写或不写代码而完成 ...

  9. iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束

    http://blog.csdn.net/pucker/article/details/41843511 上一篇文章<iOS 8界面自动布局系列-1>简要介绍了iOS界面布局方式的前世今生 ...

随机推荐

  1. JFinal 3.3 入门学习 -- Hello JFinal World.

    资源准备 jar包下载:http://www.jfinal.com/download/?file=jfinal-3.3-all.zip 下载完成后需要用到的jar包: 将 jfinal-3.3-bin ...

  2. spring 事务配置

    事务配置文档xml <!-- from the file 'context.xml' --> <?xml version="1.0" encoding=" ...

  3. iOS Sprite Kit教程之滚动场景

    iOS Sprite Kit教程之滚动场景 滚动场景 在很多的游戏中,场景都不是静止的,而是滚动的,如在植物大战僵尸的游戏中,它的场景如图2.26所示. 图2.26  植物大战僵尸 在图2.26中,用 ...

  4. 浅谈期望的线性性(可加性)【CodeForces280c】【bzoj3036】【bzoj3143】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63399955 向大(hei)佬(e)势力学(di ...

  5. 【搜索+DP】codevs1066-引水入城

    [题目大意] 一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度.现在要在某些城市建造水利设施.水利设施有两种,分别为蓄水厂和输水站.蓄水厂的功能是利用水泵将湖泊中 ...

  6. hdu 2476 区间dp

    题意: 给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2 例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10 先将0~10刷一次,变成aaaaaaaaaaa 1~ ...

  7. Express中间件

    一.编写中间件 中间件函数能够访问请求对象(req),响应对象(res),应用程序的请求/响应循环中的下一个中间件函数.下一个中间件函数通常由名为next的变量来表示. 中间件函数可以执行以下任务: ...

  8. Java中日期类型和mysql中日期类型进行整合

      1. java与mysql中日期.时间类型总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mysql(版本:5.1.50)的时间日期类型如下:   da ...

  9. vue2.0使用记录

    父组件给子组件传值[props] 1.首先在父组件的script标签中引入子组件 import Children from './Children' 2.在template内引入子组件 <Chi ...

  10. centos 6.5安装rvm 配置 Ruby开发环境

    我是用ruby写测试脚本用  安装rvm也是费了好大劲  英文不易看懂 ,是个硬伤! rvm是ruby的版本管理工具  还可对ruby进行 安装 卸载 等 1.安装 curl #  sudo yum ...