03/26/2012 06:07 AM
Interface Builder is one of the most amazing software ever written. After 25 years (and hardly anything added to it), it is still relevant and still a GUI designer far ahead of the competion. Just let me know if you know any other piece of software that was designed 25 years ago and is still relevant today, pretty much unchanged.
When I discovered IB in 1990, I was in owe. Not only could you bring incredible GUIs effortlessly (at least for the time), but IB was also an Injection Dependency Framework more than a decade ahead of Spring. It forever set the tone of my career, anchoring it in the model-driven world, building software that builts software.
That being said, I built Canappi to address a number of shortcomings. IB was never designed to build mobile solutions and to a large extend it shows.
1. Canappi's mdsl describes the entire application in a single file: XIB files have all kinds of granularity and are generally loaded individually at different locations, directly from the code. It makes it quite dificult to have a comprehensive view of the application.
2. Canappi introduces the concept of Layout, as a set of controls, which can be reused across different views: IB does not allow you to reuse groups of controls easily, this has to be dealt in code, not at the view definition time.
3. Canappi offers standard actions (call a number, send an email, navigate to a view, present/dismiss a view...): IB doesn't have any notion of standard actions, in particular navigation actions, so you have to go back in code to implement things that could be easily dealt with at the model level, in the GUI definition
4. Canappi has introduced the concept of stylesheets: IB does not have a simple way to reuse a set of properties across the definition of several controls (TextField, Label, Button...)
5. Canappi's programming model include Web API definitions which can be bound to layout and actions: How many mobile apps need to talk to some kind of Web API? Unfortunately IB, which was build 25 years ago, knows nothing about them. With Canappi you can create a client view of a Web API (Connection), and bind operations to individual layouts, including tables and actions. Canappi generates the code to assemble the Web API request, parse the response (XML or JSON) and bind it to the controls of a View.
6. Canappi's can easily specify the layout of a table: When you drag and drop a table in a XIB file, you get, a table. You have no way to declaratively define what the table row is made of.
7. Canappi defines the whole wiring of an application, from Splash screen to Menu to every aspect of Navigation (navigation bar, navigation actions, dialogs...): Apple recently added Storyboards, but that mechanism doesn't scale very well if you application is more than a few views.
8. Canappi makes the process of designing Universal Binary easy, you can define both the iPhone and iPad layouts. Each layout is independent of each other which allows you to define different navigation schemes as well (of course the remainder of the definitions are shared between the two: connections, styles, ...): IB knows nothing about different form factors running the same application. Again, 25 years ago, this was not a common usage pattern.
9. Canappi has a much richer palette of controls: Graph (Core-Plot), Gallery, RadioButtons (yes IB doesn't have radio buttons for iOS), Button Triggered Pickers and Date Pickers, Video Player, ...
10. With Canappi you can use Interface Builder to create Android layouts. We convert Interface Builder files into mdsl, which can be used to generate both iOS and Android applications.
Canappi's mdsl is also a textual language which you can easily version, compare and merge, even create libraries of resuable application definition. IB on the other hand is a graphical tool which is ideal to position controls on a view, but far less than ideal to manage an entire application.
In fact, mdsl, Canappi's programming model, is so complete today that you can now write entire applications from it, something that is impossible to do with Interface Builder.