<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <id>tag:deallocatedobjects.com,2005:/posts</id>
  <link rel="alternate" type="text/html" href="http://deallocatedobjects.com" />
  
  <title type="text">Deallocated Objects</title>
  <updated>2013-05-02T14:51:00-05:00</updated>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/deallocatedobjects" /><feedburner:info uri="deallocatedobjects" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><subtitle type="html">iOS, Mac OS X and Web application development, interface and interaction design with code snippets  and tips and tricks on building awesome stuff by Jake Marsh.</subtitle><entry>
    <id>tag:deallocatedobjects.com,2005:Post/56</id>
    <published>2013-05-02T14:51:00-05:00</published>
    <updated>2013-05-02T14:51:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/u1LMcSHW6yQ/springboard-episode-6" />
    <title>Springboard Episode 6</title>
    <content type="html">&lt;p&gt;Had a great time talking with &lt;a href="https://twitter.com/ashfurrow"&gt;@ashfurrow&lt;/a&gt; on his wonderful iOS podcast, &lt;a href="http://springboardshow.com"&gt;Springboard&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I give some advice to those wishing to get started building iOS apps, and tell some behind the scenes stories of building &lt;a href="http://conditionsapp.com"&gt;Conditions for iOS&lt;/a&gt;. There's even a hilarious &lt;a href="http://daringfireball.net"&gt;@gruber&lt;/a&gt; anecdote in there, &lt;a href="http://springboardshow.com/episodes/6"&gt;Give it a listen!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/u1LMcSHW6yQ" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/springboard-episode-6</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/55</id>
    <published>2013-02-21T11:44:00-06:00</published>
    <updated>2013-02-21T11:44:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/5PgO7QZ1PRo/conditions" />
    <title>Say Hello to my new Minimalistic Weather App, Conditions for iOS!</title>
    <content type="html">&lt;p&gt;I'm extremely happy to announce that my all-new minimalistic weather app, Conditions for iOS, is now &lt;a href="https://itunes.apple.com/us/app/conditions-beautiful-weather/id543298335?mt=8"&gt;live on the App Store&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;&lt;img src="http://conditionsapp.s3.amazonaws.com/Conditions-Hero-Retina.jpg" alt="Conditions for iOS - Announcment Graphic"&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Seriously, Another Weather App?&lt;/h3&gt;&lt;p&gt;I wanted a beautiful app that would give me a quick answer to the question of &lt;em&gt;What's the weather like?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Many weather apps clutter their interface and overload their users with tons of details that aren't all that useful. Conditions only shows you the most important information about what it's like outside right now, wherever you are, anywhere in the world.&lt;/p&gt;&lt;p&gt;Conditions is hyper minimalistic. It displays a simple, 5 day forecast indicating what it's going to be like outside each day, including the temperature.&lt;/p&gt;&lt;p&gt;You can easily tap anywhere on the face of Conditions to toggle it into an even simpler more, showing only what it's like outside right now. Intentionally hiding all of the typical "noise" information associated with weather apps. &lt;/p&gt;&lt;p&gt;Conditions also knows when it's dark outside and will automatically adjust it's look and feel to match the time of day. It has both a light and dark theme.&lt;/p&gt;&lt;p&gt;&lt;img src="http://conditionsapp.s3.amazonaws.com/Conditions-Light-Dark-Retina.jpg" alt="Conditions Light and Dark Modes"&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;The Website&lt;/h3&gt;&lt;p&gt;I had a lot of fun making the website for Conditions. First off, it's all completely beautiful retina resolution.&lt;/p&gt;&lt;p&gt;I also got to play around with a ton of subtle but awesome HTML5 and CSS techniques. Notice the app launching after the page loads? Try clicking/tapping the home button on the iPhone. Also be sure tap or hover over each of the different features screenshots. They all use some really neat &lt;a href="http://coding.smashingmagazine.com/2011/05/17/an-introduction-to-css3-keyframe-animations/"&gt;CSS Keyframe animation&lt;/a&gt; techniques to subtly describe each of the app's features.&lt;/p&gt;&lt;p&gt;It came out looking something like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://conditionsapp.com"&gt;&lt;img src="http://conditionsapp.s3.amazonaws.com/Conditions-Website-Retina.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It's fully responsive of course, and uses &lt;a href="http://developer.apple.com/library/ios/#documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html"&gt;Apple's Smart App Banner technology&lt;/a&gt; to easily direct website visitors to the app on the App Store.&lt;/p&gt;&lt;h3&gt;Pull To Refresh&lt;/h3&gt;&lt;p&gt;Make sure you pull to refresh once you get the app, I'm pretty proud of how that came out. ;)&lt;/p&gt;&lt;h3&gt;Technical Details&lt;/h3&gt;&lt;p&gt;Conditions for iOS is available in all App Store countries and supports all iPhone and iPod Touch devices running iOS 6 or later.&lt;/p&gt;&lt;h3&gt;Download&lt;/h3&gt;&lt;p&gt;&lt;a href="https://itunes.apple.com/us/app/conditions-beautiful-weather/id543298335?mt=8"&gt;You can download Conditions for iOS on the App Store by clicking here.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://conditionsapp.com"&gt;You can view the website for Conditions right here.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/conditionsapp"&gt;Follow @conditionsapp on Twitter here.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/5PgO7QZ1PRo" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/conditions</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/54</id>
    <published>2012-10-22T14:11:00-05:00</published>
    <updated>2012-10-22T14:11:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/05Y8qijVhJk/mantle-objective-c-model-objects-that-don't-suck" />
    <title>Mantle: Objective-C Model Objects That Don't Suck!</title>
    <content type="html">&lt;p&gt;The guys at Github have been rocking some awesome Objective-C open-source stuff lately, and their latest release, &lt;a href="https://github.com/blog/1299-mantle-a-model-framework-for-objective-c"&gt;Mantle, does not disappoint&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Mantle has the potential (and already does) get rid of a ton of boilerplate model code. It provides default implementations of all the common &lt;code&gt;&amp;lt;NSCoding&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;NSCopying&amp;gt;&lt;/code&gt; methods, as well as &lt;code&gt;isEqual:&lt;/code&gt; and &lt;code&gt;hash&lt;/code&gt; methods.&lt;/p&gt;&lt;p&gt;It also provides an awesome little method called &lt;code&gt;mergeValuesForKeysFromModel:&lt;/code&gt;, which makes it easy to specify how new model data should be integrated.&lt;/p&gt;&lt;p&gt;My favorite feature though is how it cleanly utilizes reversible value transformers to allow for easy re-encoding back in to JSON at any time, not only that, but it even handles migration by automatically saving the version of the model object that was used for archival. Then, upon unarchiving, the &lt;code&gt;migrateExternalRepresentation:fromVersion:&lt;/code&gt; method is invoked (only if migration is needed), giving you a convenient hook to upgrade old data.&lt;/p&gt;&lt;p&gt;Mantle is still in it's early days, but it looks quite promising.&lt;/p&gt;&lt;p&gt;You can read &lt;a href="https://github.com/blog/1299-mantle-a-model-framework-for-objective-c"&gt;Github's blog post about Mantle here&lt;/a&gt;, and you can &lt;a href="https://github.com/github/Mantle"&gt;check out the Mantle Github repository right here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/05Y8qijVhJk" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/mantle-objective-c-model-objects-that-don't-suck</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/53</id>
    <published>2012-08-30T10:59:00-05:00</published>
    <updated>2012-08-30T10:59:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/1jDeVaw3ZIY/change-your-debugging-life-with-ponydebugger" />
    <title>Change Your Debugging Life With PonyDebugger</title>
    <content type="html">&lt;p&gt;The team at &lt;a href="http://corner.squareup.com/2012/08/ponydebugger-remote-debugging.html"&gt;@Square&lt;/a&gt; have released another amazing tool for native iOS development.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;PonyDebugger is a remote debugging toolset. It is a client library and gateway server combination that uses Chrome Developer Tools on your browser to debug your application's network traffic and managed object contexts. To use PonyDebugger, you must implement the client in your application and connect it to the gateway server. There is currently an iOS client and the gateway server.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;I don't think I can possibly explain how incredible this tool is. &lt;a href="https://github.com/square/PonyDebugger"&gt;Go to Github and start using it right now.&lt;/a&gt; Also be sure to check out the Square Engineering team's &lt;a href="http://corner.squareup.com/2012/08/ponydebugger-remote-debugging.html"&gt;post about PonyDebugger.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here's a couple screenshots to get you as excited as I am:&lt;/p&gt;&lt;p&gt;(Remember, though it visually resembles debugging a web page, this is all depicting a debugging session of a &lt;em&gt;native&lt;/em&gt; iOS application's HTTP requests and CoreData storage!) &lt;/p&gt;&lt;h3&gt;Network Traffic Debugging&lt;/h3&gt;&lt;p&gt;&lt;img src="https://github.com/square/PonyDebugger/raw/master/Documentation/Images/NetworkDebugging.png" alt="Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Core Data Browser&lt;/h3&gt;&lt;p&gt;&lt;img src="https://github.com/square/PonyDebugger/raw/master/Documentation/Images/CoreDataBrowser.png" alt="Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/1jDeVaw3ZIY" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/change-your-debugging-life-with-ponydebugger</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/52</id>
    <published>2012-07-26T12:56:00-05:00</published>
    <updated>2012-07-26T12:56:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/w7KsKB0NCYM/create-static-content-screens-with-jmstaticcontenttableviewcontroller" />
    <title>Create Static Content Screens with Ease!</title>
    <content type="html">&lt;p&gt;I often find myself needing to create what I call "static content" &lt;code&gt;UITableViewControllers&lt;/code&gt;. Whether it be a "Support" or "About" screen, or possibly a simple "Login" or "Settings" screen, I find myself writing a ton of annoying, repetitive, boilerplate code for these types of screens all the time.&lt;/p&gt;&lt;p&gt;What's a guy to do? Enter: &lt;a href="http://bitly.com/OGCvCY"&gt;&lt;code&gt;JMStaticContentTableViewController&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://bitly.com/OGCvCY"&gt;Check it out on Github here&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;What Exactly Is It?&lt;/h3&gt;&lt;p&gt;A &lt;code&gt;UITableViewController&lt;/code&gt; subclass that allows you easily and simply display what I call "static content". An example of such content is what is found in iOS's built-in Settings application. Or a  simple "About" screen. Or a "Login" screen. Or any number of simple screens that might display or collect information.&lt;/p&gt;&lt;p&gt;All this is done using some really cool methods that use blocks. It also allows you to easily create &lt;code&gt;UITableViewControllers&lt;/code&gt; that collection information.&lt;/p&gt;&lt;p&gt;It is very much a library in the making. It is quite functional and usable already, as you will see if you read on, however, there is a TON more that &lt;em&gt;could&lt;/em&gt; be done with this library, I'd love to hear where everyone thinks it should go and how it could best be adapted to fit everyone's needs.&lt;/p&gt;&lt;p&gt;That being said, &lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; might not be for everyone, but if you've ever built a whole &lt;code&gt;UITableViewController&lt;/code&gt; implementing full &lt;code&gt;UITableViewDataSource&lt;/code&gt; and &lt;code&gt;UITableViewDelegate&lt;/code&gt; methods, and so on, and so on, then you likely know how much time this library could save you. &lt;/p&gt;&lt;p&gt;Keep reading for some awesome stuff.&lt;/p&gt;&lt;h3&gt;Example Usage&lt;/h3&gt;&lt;h4&gt;Adding a section and a cell&lt;/h4&gt;&lt;p&gt;Here's a simple example of adding a section and a cell to your &lt;code&gt;UITableView&lt;/code&gt;. You would likely write this code inside your &lt;code&gt;viewDidLoad&lt;/code&gt; method inside your &lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; subclass.&lt;/p&gt;&lt;p&gt;Note that you are passed in some very important objects, &lt;code&gt;JMStaticContentTableViewSection&lt;/code&gt;, &lt;code&gt;JMStaticContentTableViewCell&lt;/code&gt; and a &lt;code&gt;UITableViewCell&lt;/code&gt;. You can configure the &lt;code&gt;UITableViewCell&lt;/code&gt; exactly as you would normally. We also use the &lt;code&gt;JMStaticContentTableViewCell&lt;/code&gt; object to setup things like &lt;code&gt;UITableViewCellStyle&lt;/code&gt; and the reuse identifier.&lt;/p&gt;&lt;p&gt;&lt;code&gt;JMStaticContentTableViewSection&lt;/code&gt; also allows you to setup things like the section titles.&lt;/p&gt;&lt;p&gt;As you can see we also get a nice looking &lt;code&gt;whenSelected:&lt;/code&gt; block, this allows to write code that will be run whenever our cell is tapped, a perfect place to, for example, push on a &lt;code&gt;UIViewController&lt;/code&gt;.&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;viewDidLoad&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt; &lt;span class="n"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;addSection:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JMStaticContentTableViewSection&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSUInteger&lt;/span&gt; &lt;span class="n"&gt;sectionIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt; &lt;span class="nl"&gt;addCell:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JMStaticContentTableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UITableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cellStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UITableViewCellStyleValue1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reuseIdentifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"DetailTextCell"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSLocalizedString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"Wi-Fi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"Wi-Fi"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detailTextLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSLocalizedString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"T.A.R.D.I.S."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"T.A.R.D.I.S."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nl"&gt;whenSelected:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;navigationController&lt;/span&gt; &lt;span class="nl"&gt;pushViewController:&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;WifiViewController&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;animated:&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}];&lt;/span&gt;
    &lt;span class="p"&gt;}];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;Inserting A Cell At Runtime&lt;/h4&gt;&lt;p&gt;This will behave just like &lt;code&gt;addCell:&lt;/code&gt; above, except it will animate nicely into place.&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;_someTaskFinished&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;insertCell:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JMStaticContentTableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UITableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reuseIdentifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"WifiNetworkCell"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tableViewCellSubclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;WifiNetworkTableViewCell&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;networkName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accessoryType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UITableViewCellAccessoryDetailDisclosureButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indentationLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indentationWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nl"&gt;whenSelected:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// TODO&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nl"&gt;atIndexPath:&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="nl"&gt;indexPathForRow:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nl"&gt;inSection:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;animated:&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;Inserting Multiple Cells At Runtime&lt;/h4&gt;&lt;p&gt;Same as above, except here we're wrapping our work in calls to &lt;code&gt;beginUpdates&lt;/code&gt; and &lt;code&gt;endUpdates&lt;/code&gt;, again retaining all of our &lt;code&gt;UITableView&lt;/code&gt;'s built in "magic" while still getting to use our nice, convenient syntax.&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Somewhere else you'd probably load some data somehow,&lt;/span&gt;
&lt;span class="c1"&gt;// then want to insert rows for the new items in that data.&lt;/span&gt;

&lt;span class="c1"&gt;// Normal table view functionality is completely retained, for example,&lt;/span&gt;
&lt;span class="c1"&gt;// here we're inserting a bunch of cells inside a beginUpdates/endUpdates block&lt;/span&gt;
&lt;span class="c1"&gt;// so all our new cells will animate in simultaneously and look awesome.&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tableView&lt;/span&gt; &lt;span class="n"&gt;beginUpdates&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SomeModelObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;awesomeModelObjects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;insertCell:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JMStaticContentTableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UITableViewCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;staticContentCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reuseIdentifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"SomeCell"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nl"&gt;atIndexPath:&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSIndexPath&lt;/span&gt; &lt;span class="nl"&gt;indexPathForRow:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nl"&gt;inSection:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;animated:&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tableView&lt;/span&gt; &lt;span class="n"&gt;endUpdates&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;Animation&lt;/h4&gt;&lt;p&gt;Anytime you ask &lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; to animate the inserting or deleting of cells or sections, it will use the &lt;code&gt;UITableViewRowAnimation&lt;/code&gt; style of &lt;code&gt;UITableViewRowAnimationAutomatic&lt;/code&gt; under the hood, so all of your animations will look great. This style was added in iOS 5.&lt;/p&gt;&lt;h3&gt;Example App&lt;/h3&gt;&lt;p&gt;So for fun (and to aid me in developing the library, determine its needs) I started using &lt;code&gt;JMStaticTableViewController&lt;/code&gt; to attempt to re-create the built-in iOS Settings application. This exists in a sort of "half-finished" state inside &lt;a href="http://bitly.com/OGCvCY"&gt;the library's Github repo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Some things to try in it are: &lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Wi-Fi, go into the Wi-Fi section and notice how the rows appear after "searching for networks" (this is obviously simulated). Also try disabling and re-enabling Wi-Fi. Notice how the rows appear and disappear with correct animations. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Notifications section also demonstrates showing some content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cells that shouldn't be "selectable" (like cells containing &lt;code&gt;UISwitch&lt;/code&gt; controls) aren't selectable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Normal &lt;code&gt;UITableViewDelegate&lt;/code&gt; methods still work, so implementing things like like adding a &lt;code&gt;UIActivityIndicatorView&lt;/code&gt; next to a section title are no more or less complicated than before.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is, like I mentioned, unfinished, meant merely as a tool for you to checkout and get some perspective on how the library might be used in the "real world". More completion of the example as well as any other examples are very welcome, please feel free to submit pull requests.&lt;/p&gt;&lt;h4&gt;Example App Screenshots&lt;/h4&gt;&lt;div style="width: 84%; margin: 10px auto;"&gt;
&lt;img src="http://cl.ly/IKD6/iOS%20Simulator%20Screen%20shot%20Jul%2025,%202012%207.08.00%20PM.png" width="42%" style="float: left; margin-right: 10px;"&gt;  
&lt;img src="http://cl.ly/IKjt/iOS%20Simulator%20Screen%20shot%20Jul%2025,%202012%207.08.01%20PM.png" width="42%" style="float: left; margin-bottom: 10px;"&gt;  
&lt;img src="http://cl.ly/IKkO/iOS%20Simulator%20Screen%20shot%20Jul%2025,%202012%207.08.02%20PM.png" width="42%" style="float: left; margin-right: 10px;"&gt;  
&lt;img src="http://cl.ly/IKcB/iOS%20Simulator%20Screen%20shot%20Jul%2025,%202012%207.08.04%20PM.png" width="42%" style="float: left; margin-bottom: 10px;"&gt;  
&lt;img src="http://cl.ly/IKMS/iOS%20Simulator%20Screen%20shot%20Jul%2025,%202012%207.08.07%20PM.png" width="42%" style="float: left; margin-bottom: 20px;"&gt;
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;

&lt;h3&gt;iOS Version Compatability&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; supports iOS 5 and up.&lt;/p&gt;

&lt;h3&gt;Adding To Your Project&lt;/h3&gt;

&lt;h4&gt;CocoaPods (The New Easy Way)&lt;/h4&gt;

&lt;p&gt;If you are using &lt;a href="http://cocoapods.org"&gt;CocoaPods&lt;/a&gt; then just add this line to your &lt;code&gt;Podfile&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;dependency&lt;/span&gt; &lt;span class="s1"&gt;'JMStaticContentTableViewController'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now run &lt;code&gt;pod install&lt;/code&gt; to install the dependency.&lt;/p&gt;

&lt;h4&gt;Manually (The Old Hard Way)&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/jakemarsh/JMStaticContentTableViewController/zipball/master"&gt;Download&lt;/a&gt; the source files or add it as a &lt;a href="http://schacon.github.com/git/user-manual.html#submodules"&gt;git submodule&lt;/a&gt;. Here's how to add it as a submodule:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd YourProject
$ git submodule add https://github.com/jakemarsh/JMStaticContentTableViewController.git Vendor/JMStaticContentTableViewController
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add all of the files inside the folder named "JMStaticContentTableViewController" to your project.&lt;/p&gt;

&lt;h4&gt;ARC&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; uses &lt;a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html"&gt;Automatic Reference Counting (ARC)&lt;/a&gt;. You should be using ARC too, it's the future. If your project doesn't use ARC, you will need to set the &lt;code&gt;-fobjc-arc compiler&lt;/code&gt; flag on all of the &lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; source files. To do this in Xcode, go to your active target and select the "Build Phases" tab. In the "Compiler Flags" column, set &lt;code&gt;-fobjc-arc&lt;/code&gt; for each of the &lt;code&gt;JMStaticContentTableViewController&lt;/code&gt; source files.&lt;/p&gt;

&lt;h4&gt;"This Library is Bad, and You Should Feel Bad"&lt;/h4&gt;

&lt;p&gt;&lt;/p&gt;
&lt;center&gt;&lt;img src="http://cdn.memegenerator.net/instances/400x/23854749.jpg" title="This Library is Bad, and You Should Feel Bad"&gt;&lt;/center&gt;

&lt;p&gt;This is my first try at building a system like this for this purpose, there are already a ton of things I plan on "fixing", improving, and re-doing. I wouldn't really be a good developer if I didn't hate all my code once I was done would ? ;)&lt;/p&gt;

&lt;p&gt;I'm totally open to suggestions/fixes/hate mail/etc just let me know in a pull request, issue or even on twitter, I'm &lt;a href="http://twitter.com/jakemarsh"&gt;@jakemarsh&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That being said, this is a very opinionated library. It makes assumptions and defines conventions that might not fit perfectly with everyone's codebase or app. If you are one of those people, please feel free to submit a pull request so we can talk about it and maybe get some of your desired changes worked in.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bitly.com/OGCvCY"&gt;Check it out on Github here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/w7KsKB0NCYM" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/create-static-content-screens-with-jmstaticcontenttableviewcontroller</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/51</id>
    <published>2012-07-13T13:22:00-05:00</published>
    <updated>2012-07-13T13:22:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/M_sQC0-HlYM/coredata-afnetworking-afincrementalstore" />
    <title>CoreData + AFNetworking = AFIncrementalStore</title>
    <content type="html">&lt;p&gt;Another amazing open-source project from &lt;a href="https://github.com/mattt"&gt;@mattt&lt;/a&gt; and the &lt;a href="https://github.com/AFNetworking"&gt;AFNetworking&lt;/a&gt; guys: &lt;code&gt;AFIncrementalStore&lt;/code&gt;. &lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;AFIncrementalStore&lt;/code&gt; is an &lt;a href="https://developer.apple.com/library/mac/#documentation/CoreData/Reference/NSIncrementalStore_Class/Reference/NSIncrementalStore.html"&gt;&lt;code&gt;NSIncrementalStore&lt;/code&gt;&lt;/a&gt; subclass that uses &lt;a href="https://github.com/afnetworking/afnetworking"&gt;&lt;code&gt;AFNetworking&lt;/code&gt;&lt;/a&gt; to automatically request resources as properties and relationships are needed. I had noticed NSIncrementalStore in the iOS 5 docs a while ago, but it was this article that got me to realize how unbelievably cool it was.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;I can't tell you how much this is going to revolutionize the way many apps integrate with their backend API systems.&lt;/p&gt;&lt;p&gt;Please do yourself a favor and &lt;a href="https://github.com/AFNetworking/AFIncrementalStore"&gt;go checkout the project's README immediately&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/M_sQC0-HlYM" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/coredata-afnetworking-afincrementalstore</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/50</id>
    <published>2012-06-28T11:15:00-05:00</published>
    <updated>2012-06-28T11:15:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/fgfNASchAuE/app-review-cheddar" />
    <title>App Review: Cheddar for iOS</title>
    <content type="html">&lt;p&gt;&lt;img src="http://f.cl.ly/items/3n1x0R2B322J3y3L1i47/iOS%20Hero.png" alt="Cheddar Hero Graphic"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Task management is a pretty big deal. Over the past few decades of personal computing, literally thousands of applications have tried to solve the problem of managing your "TODO" list in a sensible, useful way.&lt;/p&gt;&lt;p&gt;The emergence of smartphones into the mainstream has brought about a renaissance of sorts of new applications throwing their hat into the ring of possible "perfect" solutions to the task management problem. This isn't always easy as everyone has their own set of specific wants and needs when it comes to "TODO" lists, and no single application is going to be "perfect" for everyone.&lt;/p&gt;&lt;p&gt;Each time another of these applications debuts, I always give it a try for a few days to see if it could be "the one for me". I've tried them all, seriously, I'm "that" guy about "TODO" list apps, almost to the point of being counter-productive. I've just never found the right mix of simplicity and power that really speaks to how I like to work through a list of tasks.&lt;/p&gt;&lt;p&gt;Until now.&lt;/p&gt;&lt;h3&gt;Enter, Cheddar.&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/3Q2f15191i0w0t0Z3J3a/iOS%20Icon.png" style="float: left; margin-right: 20px; margin-top: 20px; width: 100px;"&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://cheddarapp.com"&gt;Cheddar&lt;/a&gt; is both a &lt;a href="http://itunes.apple.com/app/id524382948"&gt;univeral iOS application&lt;/a&gt; and a &lt;a href="http://cheddarapp.com"&gt;web application&lt;/a&gt;. It's fully Retina-ready, on iOS and even on the web. Put simply, it is beautiful. The premise is simple: it's just text. Create a list by giving it a name, add tasks by typing some text. "Check off" a task by tapping or clicking. Yep, that's it. &lt;/p&gt;&lt;p&gt;You don't need to know or understand anything else to be able to use the app effectively, but that's not the end of the story, not even close.&lt;/p&gt;&lt;h3&gt;Managing Tasks&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/3V1b0U440S1B3O3b3a0A/Add%20a%20Task%20-%20iPhone.png" alt="Add Task Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Adding tasks in Cheddar couldn't be simpler, just type in the box at the top of the screen and press return. The iOS version of Cheddar even has a delightful little animation illustrating your task "popping" down to the end of your list.&lt;/p&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/3H1V0h2S1t1M2D1d3u2h/Edit%20List%20-%20Phone.png" alt="Edit Task Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Editing tasks is also super easy. On iOS, just tap the "Edit" button and then select a task to edit the text of, or re-order some tasks, or archive ones you don't need anymore. On the web, tasks are always re-orderable using some nice drag-and-drop functionality, and the pencil icon turns the desired task back into a text box for editing. It all feels very natural and very obvious.&lt;/p&gt;&lt;h3&gt;Syncing&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/38180u1v3k3O1M422P2n/Tasks%20-%20Web.png" alt="Syncing Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Oh boy. &lt;a href="http://nothingmagical.com"&gt;Nothing Magical&lt;/a&gt; (the company behind Cheddar) really outdid themselves here. Every action you take while using Cheddar &lt;em&gt;instantly&lt;/em&gt; syncs across to all your devices. Add a task on your phone, it instantly appears on the web, no refresh required. "Check off" a task on your iPad, and your iPhone instantly updates to reflect the change. You can really tell a ton of effort was put into the speed and simplicity of the syncing, and it really makes you feel confident about using the app. I love knowing that I'll never have a "I guess it hasn't updated here yet" moment ever again with my task lists. People on my side of the industry throw around the term "magic" pretty loosely these days, but Cheddar's syncing really does feel a bit like magic to me, more apps need to take note and follow suit.&lt;/p&gt;&lt;h3&gt;Tagging&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/1v3Y1s1X0A3421280V2z/Tag%20-%20iPhone.png" alt="Tagging Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Advanced users will be delighted to find a robust tagging system built around Twitter-style &lt;a href="https://cheddarapp.com/text"&gt;#hashtags&lt;/a&gt;. Simply type in something like &lt;code&gt;#someday&lt;/code&gt; into a task in Cheddar, and it becomes a hyperlink that, when tapped or clicked, will filter your list of tasks to only those containing that same hashtag. Again, simple, straightforward, and easy to understand.&lt;/p&gt;&lt;h3&gt;Markdown&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/2l1C0e0Y0s3Y2z110G41/Tasks%20-%20iPhone.png" alt="Markdown Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Also present in both the iOS and web version of Cheddar is &lt;a href="http://daringfireball.net/projects/markdown/syntax#span"&gt;span-level&lt;/a&gt; &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; support. Markdown fans will immediately see where this is going, but basically this means you can easily add hyperlinks, bold, italic, strikethrough, source code and even emoji to your tasks with very minimal effort. Cheddar has a great page describing all of the great things you can with this functionality here: &lt;a href="http://cheddarapp.com/text"&gt;Cheddar - Text&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Pricing&lt;/h3&gt;&lt;p&gt;You can always use Cheddar for free with up to two lists of tasks. If you want an unlimited number of tasks, you'll need to upgrade to Cheddar Plus. You can do this on the web for $1.99 USD a month or $19.99 a year. You can also upgrade to Cheddar Plus on iOS using a In-App Purchase Subscription which renews every 3 motnhs for $5.99. Compared to some other services, Cheddar's pricing is dirt cheap. Upgrading was a no-brainer for me. And, as I said, you can always use Cheddar with up to two lists of tasks completely free.&lt;/p&gt;&lt;h3&gt;Final Thoughts&lt;/h3&gt;&lt;p&gt;I've been using Cheddar for about 3 months while it has been in development and it really has turned out to be the perfect little task manager for me. I've used it to manage myself building apps, buying groceries, running errands, and doing some work around the house. In every single case I've found that it does it's job, gets out of my way, and lets me focus on actually completing my tasks. I would highly recommed you try it out.&lt;/p&gt;&lt;h3&gt;Where To Get It&lt;/h3&gt;&lt;p&gt;You can find Cheddar on the web at &lt;a href="http://cheddarapp.com"&gt;cheddarapp.com&lt;/a&gt; or on the &lt;a href="http://itunes.apple.com/app/id524382948"&gt;App Store here&lt;/a&gt;. There's also a great little video showing off Cheddar's main features &lt;a href="http://vimeo.com/44828323"&gt;over here on Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/fgfNASchAuE" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/app-review-cheddar</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/49</id>
    <published>2012-06-27T09:30:00-05:00</published>
    <updated>2012-06-27T09:30:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/SmXnxV_izuw/app-review-podcasts-for-ios" />
    <title>App Review: Podcasts for iOS</title>
    <content type="html">&lt;p&gt;&lt;img src="http://f.cl.ly/items/0A3q1N3G0o3O262q0m20/Icon-iPad@2x.png" alt="Banner Image"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Yesterday, Apple released a new flagship iOS application: "Podcasts". &lt;a href="http://deallocatedobjects.com/posts/the-case-of-missing-podcasts-in-ios-6"&gt;Yep, only a few days after I predicted such a thing, it happens&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As I said before, I had no inside information about the app. Although, I did hear a few rumblings at WWDC that the new Podcasts application was initially intended to be demonstrated during the WWDC Keynote, but was cut at the last minute.&lt;/p&gt;&lt;p&gt;So, was I right? Did Apple announce a full-fledged "App Store-style" backend interface for publishers to manage their podcasts? Push notifications for when new episodes are released? Let's dive in and find out.&lt;/p&gt;&lt;h3&gt;Where I Was Wrong (For The Moment)&lt;/h3&gt;&lt;p&gt;No new backend system was announced or released. However, a clue or two hinting at future improvements to this new system can be found in the app. I found two references to the concept of "paid" podcast episodes when playing around with the application. One mentioned "free" episodes, thus suggesting that some episodes might cost money. Another offers the option to "Redeem Code", again suggesting that some episodes may not be free.&lt;/p&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/3P2o032j3S1x380y1W2r/photo%201.png" alt="Redeem Button"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I'm not done holding my breath on Apple offering an "App Store-style" backend system to allow publishers to sell episodes or even subscriptions to their shows.&lt;/p&gt;&lt;p&gt;Apple also hasn't brought any sort of push notification functionality to market with this intial release of Podcasts. I don't have any hard evidence here, but given the obviousness of providing push notifications for when new episodes are available, as well as automatic background downloads, I'd say it's only a matter of time before these features are implemented.&lt;/p&gt;&lt;h3&gt;The new iOS Application&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/1g0d0c1A1F0i1Q3X1u0i/Untitled-1.png" style="float: left; margin-right: 20px; margin-top: 20px; width: 144px;"&gt;&lt;/p&gt;&lt;p&gt;First, the facts: Podcasts is a pretty feature-rich universal iOS application that runs on both the iPhone and iPad. It requires the device to be running at least iOS 5.1. It allows users to discover and subscribe to podcasts, as well as download or stream individual episodes.&lt;/p&gt;&lt;p&gt;It's always a fun time when Apple releases a new flagship iOS application. Their latest releases of iMovie for iOS and iPhoto for iOS have boasted some pretty great user interfaces and seem to be quite well received by users. Let's see if Podcasts follows suit.&lt;/p&gt;&lt;h3&gt;Top Stations&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/371S1w2M2F0S0q0X0N2Z/photo.png" alt="Top Stations Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Apple chose a pretty interesting direction for it's "Top Stations" feature in Podcasts. I'm guessing their intention was to give those users who aren't as familiar with podcasts a way to quickly listen to something that might interest them. A sort of "channel surfing" concept for the couch-potato-would-be-podcast fans. It definitely delivers on the "channel surfing" concept, but educated users likely won't be too intrigued by this feature. From what I can tell, by default "Top Stations" seems to choose an episode at random from the currently selected show and begin playing it automatically. Possibly a neat way to discover new content, but I don't see many users heading back for a second or third use.&lt;/p&gt;&lt;h3&gt;Subscribing&lt;/h3&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/2l1l2B1X3A0w2N232N2g/photo%204.png" alt="Catalog Featured Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;With Podcasts, Apple has essentially done for Podcasts what they did for books with iBooks: A separate iOS app, that you have to install from the App Store, that when launched, can "flip around" to reveal the place where you discover and download media. Even the animation for the flip back and foward matches iBooks pretty closely.&lt;/p&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/1T2J1F0x3q0b3y3q0g0u/photo%205.png" alt="Catalog Top Charts Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;The Podcasts "catalog" interface, sadly, is still a giant web view. Not surprising given that all of Apple's "store" interfaces on iOS are designed this way, but boy does it show. The interface is uncharacteristically slow and unresponsive. I found tapping on a "subscribe" button to hang on almost every podcast I was attempting to subscribe to.&lt;/p&gt;&lt;h3&gt;Playback&lt;/h3&gt;&lt;p&gt;Oh boy. Welcome back to skeuomorphic-town. Well, if you're listenting to an audio podcasts at least. Watching video podcasts shows the video of the desired episode full-screen with the expected video controls. But load up an audio epsiode and you're in for a treat.&lt;/p&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/0W1K413g162O0U2e1m00/photo%202.png" alt="Playback Tape Deck Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;It's literally a tape deck. Immediately recognizable and impressive. I really love how well this interface comes across on the iPad, a device that not's too far off in size from actual tape recorders of the 1970's and 80's. I tested out the app on my iPhone 4S and iPad 3, and just as an aside, the app truly shines on the iPad 3. This type of graphical treatment on the iPad 3's retina screen really helps solidify Apple's stronghold on the "holy cow that looks awesome!" market. During playback, the podcast's cover art is displayed on top of a translucent "plastic" cover sitting on top of two spinning tape deck heads with "tape" running between the two decks. As you progress in the episode you're listening to, the tape visually transfers from the left to right side, just as it would on a real-life tape deck, quite an impressive effect. The control buttons located at the bottom of the screen appear to "press in" when tapped. They resemble the buttons of that old-school (now seemingly ancient) tape recorder you found in your parent's attic that time.&lt;/p&gt;&lt;p&gt;&lt;img src="http://f.cl.ly/items/3M1Y1I2K12291D1U0m0L/photo%202.png" style="float: right; margin-top: 10px; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;/p&gt;&lt;p&gt;One nice touch is the speed control. As you change the rocking slider control from "turtle" to "hare", the tape decks begin to visibly ramp their speed up and down. Many podcast apps on iOS offer ability to speed up or slow down playback of episodes, but this sort of immediate and obvious user feedback feels like something only Apple could deliver.&lt;/p&gt;&lt;h3&gt;Should you switch?&lt;/h3&gt;&lt;p&gt;Tough to answer. Podcast clients are like RSS Readers, Twitter clients or E-mail applications: no one application can please everyone. With "Podcasts", Apple has served up a fairly strong competitor in to the "iOS podcatcher application" market, assisted greatly by what I'm calling the "default choice" factor. They own the platform, "Podcasts" comes close to appearing as the "default" application for interaction with Podcasts on iOS.&lt;/p&gt;&lt;p&gt;I personally still love Instacast for iOS. It too, is a universal iPhone and iPad app. Like Apple's "Podcasts", it uses iCloud to sync subscriptions, playback positions and played/unplayed states of episodes. As an added bonus, Instacast already does support push notifications for new episodes of shows you're subscribed to.&lt;/p&gt;&lt;p&gt;So while I would highly suggest anyone who has read this much of this article to check out "Podcasts", I think Apple has a few releases to go before this app starts to become the obvious choice.&lt;/p&gt;&lt;p&gt;"Podcasts" is available now for iPhone 3GS, iPhone 4, iPhone 4S, iPod touch (3rd generation), iPod touch (4th generation) and iPad devices running iOS 5.1 or later.&lt;/p&gt;&lt;p&gt;&lt;a href="http://itunes.apple.com/us/app/podcasts/id525463029?mt=8"&gt;Here's the App Store link&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/SmXnxV_izuw" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/app-review-podcasts-for-ios</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/48</id>
    <published>2012-06-17T16:45:00-05:00</published>
    <updated>2012-06-17T16:45:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/8x331XgIx4I/the-case-of-missing-podcasts-in-ios-6" />
    <title>The Case of Missing Podcasts in iOS 6</title>
    <content type="html">&lt;p&gt;&lt;img src="http://f.cl.ly/items/0H1F3Q1g0U1D3R1O1g0u/F3tgO.png" title="Icon Mockup" style="text-align: center;"&gt;&lt;/p&gt;&lt;p&gt;I have a theory (truthfully a wish) for the explanation behind why Apple's iOS 6 beta seems to be excluding support for browsing and downloading podcasts within the built-in iTunes Store app.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.appleinsider.com/articles/12/06/15/apple_planning_to_launch_standalone_podcast_app_in_ios_6.html"&gt;Many have speculated and reported&lt;/a&gt; that Apple is planning on introducing a standalone Podcasts application for iOS, similar to what they've done with iBooks.&lt;/p&gt;&lt;p&gt;While I agree that this would be a smart move for Apple, I believe that the real winning combination would be a full, end-to-end solution, and this post is my pitch. The rest of this post will be written in the hypothetical. No little birdies whispered in my ear here, just my pure predictions.&lt;/p&gt;&lt;h3&gt;For Producers&lt;/h3&gt;&lt;p&gt;Apple would host an iTunes Connect style management interface for creating/updating shows, support for both Audio and Video podcasts are included. &lt;em&gt;Key Feature:&lt;/em&gt; Apple would host the audio and video data files for producers, for &lt;em&gt;free&lt;/em&gt;, just like they host TV Shows, Movies, Songs, Books, Applications, etc for their other iTunes Store types. Apple's (not so new anymore) North Carolina data center would be touted as one of the ways Apple is able to provide such a service. Producers are able to sign in, add new episodes, attach show notes, links, and upload their media. New episodes will then go live, and appear for consumers in the iTunes Store and native iOS Podcasts application (possibly with or without an approval process).&lt;/p&gt;&lt;p&gt;Producers could offer each episode for free or set a pricing tier, similar to how application developers set their prices today. This would allow for independent content providers to release their content for a minimal fee and turn their hobbies into actual businesses, exactly like application developers did when the App Store first launched back in 2008. Imagine a world where episodes of fantastic independent content like &lt;a href="http://drhorrible.com/"&gt;Dr. Horrible's Sing-a-long Blog&lt;/a&gt; or &lt;a href="http://www.youtube.com/user/vlogbrothers"&gt;The vlogbrother's&lt;/a&gt; &lt;a href="http://www.youtube.com/user/crashcourse"&gt;Crash Course&lt;/a&gt; and &lt;a href="http://www.youtube.com/user/scishow"&gt;Sci Show&lt;/a&gt; get released for each week for $0.99 USD. Consumers could purchase season passes, buy individual episodes or subscribe to only the free episodes. The possibilities here are practically endless.&lt;/p&gt;&lt;p&gt;In addition, &lt;a href="http://9to5mac.com/2012/06/15/apple-launching-podcast-app-with-ios-6-and-working-on-podcast-producing-technology/"&gt;as many have reported&lt;/a&gt;, Apple is likely working on a revamped version of it's Podcast Producer software, that has shipped with OS X Server for a few years now. The new application would included an interface for recording, mixing, editing, and uploading episodes in both Audio-only and Video formats. This application would run on OS X Mountain Lion and would integrate with the aforementioned backend iTunes Connect-style management service.&lt;/p&gt;&lt;h3&gt;For Consumers&lt;/h3&gt;&lt;p&gt;Now the really big one. A universal (iPhone &amp;amp; iPad) iOS application entitled "Podcasts". This application would provide a way to browse available shows, read about them and subscribe to your favorites. Basicallly extending the existing functionality avaiable in the Podcasts section of the iTunes Store today.&lt;/p&gt;&lt;p&gt;Since Apple will now control the experience end-to-end, they can now provide fantastic support for things like push notifications when new episodes go live.&lt;/p&gt;&lt;p&gt;Any consumer who has subscribed to a particular podcast "feed" will now be able to get push notifications and, &lt;a href="http://www.imore.com/2012/06/15/apple-planning-dedicated-podcast-app-ios-6/"&gt;as many have reported&lt;/a&gt;, even automatic background downloading of episodes as soon as they are released and available, permitting their device's battery and network state permit it. This idea also cooperates nicely with &lt;a href="http://www.imore.com/2012/06/17/power-nap-podcast-app-automatic-future-ios-updates/"&gt;the recently announced "Power Nap" feature&lt;/a&gt; for the newer Apple notebook machines.&lt;/p&gt;&lt;h3&gt;What does this really mean?&lt;/h3&gt;&lt;p&gt;I've thought about this a lot, and I've come to the conclusion that the real competion here could be with services like YouTube and Vimeo. YouTube has been ]working quite a bit lately at trying to get more serialized content on their service. &lt;a href="http://online.wsj.com/article/SB10001424052748704013604576247060940913104.html"&gt;They've been investing millions in independent content providers&lt;/a&gt; in an attempt to get higher quality regularly scheduled content going on their network.&lt;/p&gt;&lt;p&gt;An Apple-hosted Podcasts service could help to further blur the lines between professional and independent content providers, giving this type of content the same "bump" that indie developers got with App Store.&lt;/p&gt;&lt;p&gt;I admit, this is a bit of wishful thinking on my part, as I'd love to see this type of content be readily available on Apple's platforms. But given the evidence, I'd say it's at least a solid theory.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/8x331XgIx4I" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/the-case-of-missing-podcasts-in-ios-6</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/47</id>
    <published>2012-04-12T11:41:00-05:00</published>
    <updated>2012-04-12T11:41:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/ijH8KMRQg38/delight-your-users-by-pre-filling-forms-with-jbdeviceowner" />
    <title>Delight Your Users By Pre-filling Forms With JBDeviceOwner</title>
    <content type="html">&lt;p&gt;Filling out forms on a phone can really suck. Heck, even on the iPad's awesome screen, I often make plenty of mistakes while typing in information. &lt;/p&gt;&lt;p&gt;When a user first downloads your iOS app, it's quite common for them to need to fill out some sort of "sign up" or some other kind of form.&lt;/p&gt;&lt;p&gt;All of this can add up to a terrible "first run" experience for new users of your app.&lt;/p&gt;&lt;p&gt;What's a developer to do? &lt;/p&gt;&lt;p&gt;Enter: &lt;code&gt;JBDeviceOwner&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This simple library, which comes to us from &lt;a href="http://jakeboxer.com/"&gt;Jake Boxer&lt;/a&gt;, uses the &lt;em&gt;name&lt;/em&gt; of the user's device to look up and return commonly needed user information from their Address Book record.&lt;/p&gt;&lt;p&gt;Here's what it looks like in action:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;JBDeviceOwner&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;UIDevice&lt;/span&gt; &lt;span class="n"&gt;currentDevice&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// owner will be nil if the user's data could not be found.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstNameTextField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastNameTextField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emailTextField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phoneTextField&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jake describes how it works:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;It's really simple actually.&lt;/p&gt;

&lt;p&gt;Most iPhones are named &lt;em&gt;"Jake Boxer's iPhone"&lt;/em&gt; ("sometimes with a different person's name instead of mine). Most iPhones have their owner saved in their address book.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JBDeviceOwner&lt;/code&gt; extracts the owner's name from the device name, finds the matching record in the address book, and populates the &lt;code&gt;JBDeviceOwner&lt;/code&gt; instance with the data from the record.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;JBDeviceOwner&lt;/code&gt; can't figure out the owner's name, or if it can't find a matching record in the address book, it won't return anything.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Obviously this approach, while really neat, isn't going to work for absolutely every user, so you should have a sensible "fall back". I like to "try grabbing" using &lt;code&gt;JBDeviceOwner&lt;/code&gt;, and if I don't find anything, try manually asking the user to enter their email, then using &lt;em&gt;that email address&lt;/em&gt; to try to locate their contact record.&lt;/p&gt;&lt;p&gt;Try not to over-do it, but I believe when done well, this sort of approach can be an awesome alternative to requiring users to type in a ton of information.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Please Note:&lt;/em&gt; Try not to ask your users for a ton of information in the first place, only require what you absolutely need to make your app work.&lt;/p&gt;&lt;p&gt;That being said, A few big name apps are now using this technique, and their "first run" experiences are &lt;em&gt;much&lt;/em&gt; nicer, simply prompting the user with a &lt;code&gt;UIActionSheet&lt;/code&gt; with, for example: "Would you like to use this information?"&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/jakeboxer/JBDeviceOwner"&gt;Check out &lt;code&gt;JBDeviceOwner&lt;/code&gt; on Github&lt;/a&gt; and stop annoying your users today!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/ijH8KMRQg38" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/delight-your-users-by-pre-filling-forms-with-jbdeviceowner</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/46</id>
    <published>2012-04-06T14:45:00-05:00</published>
    <updated>2012-04-06T14:45:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/zdz6JNNq-mg/localize-your-apps-with-ease-using-greenwich" />
    <title>Localize Your Apps With Ease Using Greenwich</title>
    <content type="html">&lt;p&gt;Oh man, I have waited a long time for a tool like this to come around. I've even attempted to build one myself a couple times.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The process of localizing Cocoa applications has always been a bit of a chore. Various tools are available to facilitate localization of applications, but they all require a fair amount of work. Even when there is demand for localization, many applications are only available in one language. Greenwich is here to change that.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://fadingred.github.com/greenwich/"&gt;Greenwich&lt;/a&gt; is a new, &lt;a href="https://github.com/fadingred/Greenwich"&gt;open-source&lt;/a&gt; framework that greatly speeds up the process of localizing and translating an iOS or Mac app. At anytime a developer or translator (yep, Greenwich has been built with translators in mind) can make a change to a word or two, relaunch your app and see the changes reflected immediately.&lt;/p&gt;&lt;p&gt;&lt;img src="http://fadingred.github.com/greenwich/media/images/translator.png" alt="Translator"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Setup and usage for &lt;a href="http://fadingred.github.com/greenwich/setup/#ios"&gt;iOS&lt;/a&gt; and&lt;br&gt;&lt;a href="http://fadingred.github.com/greenwich/setup/#mac"&gt;Mac&lt;/a&gt; are very well documented on Greenwich's awesome &lt;a href="http://fadingred.github.com/greenwich/setup/"&gt;setup page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Do yourself a favor and check this out now, if you've ever localized a Mac or iOS app you know what a pain the process can be. Looks like we finally have a great solution.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/zdz6JNNq-mg" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/localize-your-apps-with-ease-using-greenwich</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/45</id>
    <published>2012-03-13T12:43:00-05:00</published>
    <updated>2012-03-13T12:43:00-05:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/84RAEdTKJNk/new-objective-c-literal-syntax-for-nsarray,-nsdictionary-&amp;-nsnumber" />
    <title>Literal Syntax for NSArray, NSDictionary &amp; NSNumber</title>
    <content type="html">&lt;p&gt;I can't tell you how long I've been waiting for this.&lt;/p&gt;&lt;p&gt;As &lt;a href="http://joris.kluivers.nl/blog/2012/03/13/new-objectivec-literal-syntax/"&gt;Joris points out&lt;/a&gt;, it appears that Apple has &lt;a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/?view=log&amp;amp;pathrev=152137"&gt;committed the necessary changes&lt;/a&gt; to the LLVM project to allow LLVM to fully support the latest Objective-C language features.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Apple committed a new patch to the llvm project adding support for new Objective-C literal syntax for &lt;code&gt;NSArray&lt;/code&gt;, &lt;code&gt;NSDictionary&lt;/code&gt; and &lt;code&gt;NSNumber&lt;/code&gt;. These have previously been documented in the Mountain Lion Xcode release notes but that was still under NDA. Now that these features have been committed to llvm I guess we’re allowed to speak about it.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;...and since LLVM isn't under NDA like most of the "developer preview" stuff, this means we can all finally discuss this stuff on our blogs!&lt;/p&gt;&lt;p&gt;Here's a (small) taste of the great new syntax:&lt;/p&gt;&lt;h3&gt;NSNumber&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;someNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// [NSNumber numberWithInt:31]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;NSArray&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;//NSArray *doctors = [NSArray arrayWithObjects:@"Matt Smith", @"David Tennant", @"Tom Baker", nil];&lt;/span&gt;
&lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;doctors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;@"Matt Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"David Tennant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;@"Tom Baker"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;NSDictionary&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;NSDictionary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s"&gt;@"text"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;@"Hi! I'm a tweet!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;@"user"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;@"jakemarsh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;@"timestamp"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;1331664532&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/84RAEdTKJNk" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/new-objective-c-literal-syntax-for-nsarray,-nsdictionary-&amp;-nsnumber</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/44</id>
    <published>2012-02-15T22:26:00-06:00</published>
    <updated>2012-02-15T22:26:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/i5fyp7nidJ8/protect-your-users-privacy-with-dtshashedcontacts" />
    <title>Protect Your Users' Privacy With DTSHashedContacts</title>
    <content type="html">&lt;p&gt;As I'm sure many readers have heard, there has been &lt;a href="http://mclov.in/2012/02/08/path-uploads-your-entire-address-book-to-their-servers.html"&gt;some&lt;/a&gt; &lt;a href="http://blog.path.com/post/17274932484/we-are-sorry"&gt;public&lt;/a&gt; &lt;a href="http://www.macrumors.com/2012/02/15/congress-weighs-in-on-ios-apps-collecting-address-book-and-other-personal-data/"&gt;outcry&lt;/a&gt; lately on the subject of iOS apps accessing the Address Book contacts of a their users and then sending the whole lot of them off to their servers, to accomplish their "friend matching" features.&lt;/p&gt;&lt;p&gt;Many companies have &lt;a href="http://blog.path.com/post/17274932484/we-are-sorry"&gt;already&lt;/a&gt; &lt;a href="http://www.pcmag.com/article2/0,2817,2400154,00.asp"&gt;corrected&lt;/a&gt; the error in their ways, (partially), and &lt;a href="http://www.macrumors.com/2012/02/15/apple-to-require-explicit-permission-for-ios-apps-accessing-address-book-data/"&gt;even Apple has stated&lt;/a&gt; that a future iOS release will lock down Address Book access, in the same way that permission is required to access a user's geographic location now.&lt;/p&gt;&lt;p&gt;In the meantime however, if you'd like a quick, easy and safe way to build a "find my friends" type of feature into your app, I'd recommend looking at &lt;a href="https://github.com/crossforward/HashedContacts"&gt;&lt;code&gt;DTSHashedContacts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It's is a drop-in iOS library that provides a wrapper around the Address Book frameworks designed to ensure the privacy of user data. Before access is ever made to the Address Book the user will first be prompted for permission with a customizable &lt;code&gt;UIAlertView&lt;/code&gt; prompt. Once access is granted the library returns hashed tokens representing the user's private data rather than the data itself.&lt;/p&gt;&lt;p&gt;Here's what it looks like to use it:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hashedContactsProvider&lt;/span&gt; &lt;span class="nl"&gt;emailTokensWithConfirmation:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSArray&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//When permission given&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nl"&gt;whenDeclined:&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//When permission denied&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/crossforward/HashedContacts"&gt;Read more about &lt;code&gt;DTSHashedContacts&lt;/code&gt; on Github&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/i5fyp7nidJ8" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/protect-your-users-privacy-with-dtshashedcontacts</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/43</id>
    <published>2012-02-11T13:24:00-06:00</published>
    <updated>2012-02-11T13:24:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/TLE8Apzs3vI/building-xcode-projects-from-the-command-line" />
    <title>Building Xcode Projects from the Command Line</title>
    <content type="html">&lt;p&gt;Building iOS and Mac projects from the command-line could be a lot easier to work with.&lt;/p&gt;&lt;p&gt;Hopefully this post will give you a couple ways to make that happen.&lt;/p&gt;&lt;p&gt;I wanna talk about two different little tools that help ease the process of scripting or working with Xcode projects from the command line.&lt;/p&gt;&lt;h3&gt;xcodebuild-rb&lt;/h3&gt;&lt;p&gt;&lt;a href="https://github.com/lukeredpath/xcodebuild-rb%5D"&gt;&lt;code&gt;xcodebuild-rb&lt;/code&gt;&lt;/a&gt; is a neat little ruby gem that lets you create a &lt;code&gt;Rakefile&lt;/code&gt; inside the root of your Xcode project's folder that looks like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'xcodebuild'&lt;/span&gt;

&lt;span class="no"&gt;XcodeBuild&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Tasks&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;BuildTask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What does that get you?&lt;/p&gt;&lt;p&gt;Well, after creating that &lt;code&gt;Rakefile&lt;/code&gt;, running a quick &lt;code&gt;rake -T&lt;/code&gt; (which will list all available &lt;code&gt;rake&lt;/code&gt; tasks) will output something like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;rake xcode:build       &lt;span class="c"&gt;# Builds the specified target(s).&lt;/span&gt;
rake xcode:clean       &lt;span class="c"&gt;# Cleans the build using the same build settings.&lt;/span&gt;
rake xcode:cleanbuild  &lt;span class="c"&gt;# Builds the specified target(s) from a clean slate.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One of the coolest features of &lt;code&gt;xcodebuild-rb&lt;/code&gt; is it's use of "formatters". One of my favorite formatters is called "progress". You can enable it like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="no"&gt;XcodeBuild&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Tasks&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;BuildTask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;XcodeBuild&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Formatters&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ProgressFormatter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then when you build using &lt;code&gt;xcodebuild-rb&lt;/code&gt;, your output will look something like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Building target: ExampleProject &lt;span class="o"&gt;(&lt;/span&gt;in ExampleProject.xcproject&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=============================================================&lt;/span&gt;

Configuration: Release
..............

Finished in 2.226883 seconds.
Build succeeded.
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/lukeredpath/xcodebuild-rb"&gt;Read more about &lt;code&gt;xcodebuild-rb&lt;/code&gt; on Github&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;xcodearchive&lt;/h3&gt;&lt;p&gt;Apple ships Xcode with a command line tool called &lt;code&gt;xcodebuild&lt;/code&gt;, which as the name suggests, builds an Xcode project. One drawback about the built-in &lt;code&gt;xcodebuild&lt;/code&gt; tool is that it can't create &lt;code&gt;.ipa&lt;/code&gt; archive files. &lt;/p&gt;&lt;p&gt;Well, enter &lt;a href="https://github.com/gcerquant/xcodearchive/blob/master/xcodearchive.rb"&gt;&lt;code&gt;xcodearchive&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Unlike &lt;code&gt;xcodebuild-rb&lt;/code&gt;, &lt;code&gt;xcodearchive&lt;/code&gt; isn't a ruby gem. It is just a &lt;code&gt;.rb&lt;/code&gt; file that you can put anywhere you'd like and run.&lt;/p&gt;&lt;p&gt;&lt;code&gt;xcodearchive&lt;/code&gt; has a ton of great features, check out the USAGE output:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;Usage: xcodearchive &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS&lt;span class="o"&gt;]&lt;/span&gt;
        --version
                                     Show version number
    -v, --verbose                    Output more information
    -g, --growl                      Show growl alerts to inform about progress of the build
    -n, --do_not_keep_dsym_symbols   Do not keep the dSYM symbols
    -s, --show                       Show archive in Finder once created
    -c, --clean                      Do a clean before building the Xcode project
    -o, --ipa_export_path FOLDER     Set the path of the folder where the ipa will be saved. Default is &lt;span class="s1"&gt;'~/Desktop'&lt;/span&gt;
    -i DEVELOPPER_IDENTITY,          Force the developper identity value
        --developper_identity
    -p, --project PROJECT            Specifiy xcode project
    -h, --help                       Display this screen
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/gcerquant/xcodearchive/blob/master/xcodearchive.rb"&gt;Read more about &lt;code&gt;xcodearchive&lt;/code&gt; on Github&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you aren't already automating the tedious parts of your build and release processes, you are missing out. As any iOS developer knows, building and releasing can become some of the most monotonous and annoying parts of our jobs, hopefully these little tools will inspire you to start scripting your way to a smoother build/release cycle.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/TLE8Apzs3vI" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/building-xcode-projects-from-the-command-line</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/42</id>
    <published>2012-02-11T13:19:00-06:00</published>
    <updated>2012-02-11T13:19:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/av8Rfa_Mfgw/phantom-buttons-on-the-ipad's-split-keyboard" />
    <title>Phantom Buttons on the iPad's Split Keyboard</title>
    <content type="html">&lt;p&gt;Yet another example of details that 99.9% of users would never notice but use constantly.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The iPad’s split keyboard has phantom buttons. If you’re used to typing Y with your left hand, you can.&lt;/p&gt;

&lt;p&gt;To enable this keyboard, tap-hold on the “toggle keyboard” button in the lower right to get a menu, or tap-hold on it and drag upwards. Reverse that to reunite the two halves back to normal at the bottom.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;img src="http://cl.ly/E7UY/Screen%20Shot%202012-02-11%20at%201.20.07%20PM.png" alt="Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I love discovering little tid bits like this. Apple (among others) manage to sprinkle them in the strangest and most obvious places. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/av8Rfa_Mfgw" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/phantom-buttons-on-the-ipad's-split-keyboard</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/41</id>
    <published>2012-02-11T13:12:00-06:00</published>
    <updated>2012-02-11T13:12:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/DWzMF1yMHFA/the-apple-voice" />
    <title>The Apple Voice</title>
    <content type="html">&lt;p&gt;&lt;a href="https://twitter.com/#!/holman"&gt;Zach Holman&lt;/a&gt; does a great job of succinctly describing something that I've been having trouble  quantifying into words for a while now.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Apple commands their words exceedingly well. They aren’t the originator — or even the owner — of their particular voice, but they are the most visible.&lt;/p&gt;

&lt;p&gt;Mechanically, The Apple Voice is characterized by short, declarative sentences that are informally and personally delivered to you with a hint of smugness.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;The Apple "voice", as Zach names it, is probably one of the most underrated parts of Apple's success. &lt;/p&gt;&lt;p&gt;Zach goes on to talk about how you can shape and choose your company or product's "voice". &lt;/p&gt;&lt;p&gt;&lt;strong&gt;The upshot:&lt;/strong&gt; You need to do this. &lt;em&gt;This matters&lt;/em&gt;, a lot.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/DWzMF1yMHFA" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/the-apple-voice</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/40</id>
    <published>2012-01-22T14:39:00-06:00</published>
    <updated>2012-01-22T14:39:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/fMc0rWIhY7s/parse-json-directly-into-nsmanagedobjects" />
    <title>Parse JSON Directly into NSManagedObjects</title>
    <content type="html">&lt;p&gt;&lt;a href="https://twitter.com/#!/atomicbird"&gt;Tom Harrington&lt;/a&gt; brings us another insanely valuable little bit of code that does some simple, yet awesome things with a parsed NSDictionary of JSON content:&lt;/p&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Provide a safe, generic alternative to Cocoa’s -setValuesForKeysWithDictionary: for use with NSManagedObject and its subclasses&lt;/li&gt;
&lt;li&gt;Handle cases where JSON data didn’t match up with what the managed objects expected. Getting a string where you expect a numeric value, or vice versa, for example, or getting a string representation of a date when you want a real NSDate object.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;p&gt;Basically Tom is examining his managed object's defined properties, and then looking into the NSDictionary he got when he parsed some JSON, and if any of the property key names exist in both structures, he sets the value.&lt;/p&gt;&lt;p&gt;The end result is being able to do something like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;myObj&lt;/span&gt; &lt;span class="nl"&gt;setValuesForKeysWithDictionary:&lt;/span&gt;&lt;span class="n"&gt;jsonDict&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I love little tools and case studies like this as they always help to enlighten more of us to the awesomeness that is the Objective-C runtime.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/fMc0rWIhY7s" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/parse-json-directly-into-nsmanagedobjects</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/39</id>
    <published>2012-01-22T14:30:00-06:00</published>
    <updated>2012-01-22T14:30:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/80KsrSFkF4I/quicklook-plugin-for-mobile-provision-files" />
    <title>QuickLook Plugin for Mobile Provision Files</title>
    <content type="html">&lt;p&gt;How many times has this happened to you?&lt;/p&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;I received the new mobileprovision file.&lt;/li&gt;
&lt;li&gt;Great.&lt;/li&gt;
&lt;li&gt;No.&lt;/li&gt;
&lt;li&gt;What?&lt;/li&gt;
&lt;li&gt;You still haven’t added my UDID in it.&lt;/li&gt;
&lt;li&gt;I have.&lt;/li&gt;
&lt;li&gt;No you have not.&lt;/li&gt;
&lt;li&gt;Yes I have.&lt;/li&gt;
&lt;li&gt;No you haven’t.&lt;/li&gt;
&lt;li&gt;Yes.&lt;/li&gt;
&lt;li&gt;No! Why don’t you just… &lt;loosing patience but trying to stay polite&gt;&lt;/loosing&gt;
&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;li&gt;Look, I’m sure. Can you generate it again?&lt;/li&gt;
&lt;li&gt;Ok, I will. Wait… ok, it’s done.&lt;/li&gt;
&lt;li&gt;Let me check. No, sorry, still not ok.&lt;/li&gt;
&lt;li&gt;Are you sure?
[END OF CHAT CONVERSATION CENSORED]&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;p&gt;MacMotion brings something to relieve the pain (slightly) of dealing with Apple Provisioning Profiles, and it uses one of my favorite OS X features, QuickLook.&lt;/p&gt;&lt;p&gt;After &lt;a href="http://www.macmation.com/blog/2011/10/quicklook-plugin-for-mobile-provision-files/"&gt;installing MacMotion's new QuickLook plugin&lt;/a&gt; Simply press the spacebar on any &lt;code&gt;.mobileprovision&lt;/code&gt; file in the finder and instead of some boring 1 line summary, you'll get something like this:&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.macmation.com/blog/wp-content/uploads/2011/09/QuickLook_mobileprovision_plugin_view.png" alt="Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;It also has some great enhancements to Finder icons to quickly tell you if a profile is valid or not.&lt;/p&gt;&lt;p&gt;You can &lt;a href="http://www.macmation.com/blog/2011/10/quicklook-plugin-for-mobile-provision-files/"&gt;download the plugin here&lt;/a&gt; (at the bottom of the post).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/80KsrSFkF4I" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/quicklook-plugin-for-mobile-provision-files</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/38</id>
    <published>2012-01-22T14:17:00-06:00</published>
    <updated>2012-01-22T14:17:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/8s-w40t84-c/ipad-retina-images-found-in-itunes-u-and-ibooks-2-files" />
    <title>iPad Retina Images Found in iTunes U and iBooks 2 Files</title>
    <content type="html">&lt;p&gt;This one is sort of a given these days, but appears we now have even stronger evidence that the almost-certainly forthcoming iPad 3 will have a &lt;em&gt;Retina&lt;/em&gt; class screen.&lt;/p&gt;&lt;p&gt;Shown here is an iPad bookmark image resource with an &lt;em&gt;@2x&lt;/em&gt; version:&lt;/p&gt;&lt;p&gt;&lt;img src="http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2012/01/screen-shot-2012-01-19-at-6-11-35-pm-520x184.png" alt="iBooks 2 Retina Image Resource Screenshot"&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;We have been finding references to 2X iPad images for &lt;a href="http://9to5mac.com/2011/06/14/ios-5-sdk-includes-retina-display-graphics-for-next-generation-ipad/"&gt;well over a year&lt;/a&gt; (including iBooks 1.2), (...)&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;I'm posting about this as a &lt;em&gt;nudge-nudge&lt;/em&gt; to my fellow iOS developers to keep this in mind if you are starting out on any new iPad projects, you'll need to whip up a new &lt;em&gt;2048×1536&lt;/em&gt; resolution Photoshop document.&lt;/p&gt;&lt;p&gt;Should make designing iPad apps a little more &lt;em&gt;interesting&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/8s-w40t84-c" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/ipad-retina-images-found-in-itunes-u-and-ibooks-2-files</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/37</id>
    <published>2012-01-02T14:59:00-06:00</published>
    <updated>2012-01-02T14:59:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/YrH-W1Nns5U/misconceptions-about-ios-multitasking" />
    <title>Misconceptions About iOS Multitasking</title>
    <content type="html">&lt;p&gt;Fantastic writeup from &lt;a href="https://twitter.com/fraserspeirs"&gt;Fraser Speirs&lt;/a&gt; about iOS's multitasking capabilities and behavior. He goes into great detail about the ins and outs of things and covers all the different scenarios really well.&lt;/p&gt;&lt;p&gt;The problem is this:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;If someone tells you that all the apps in the multitasking bar are running, using up memory or sucking power, they are wrong.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;I too have heard the "advice" quite a bit recently that users should "clear out" their multitasking tray to "free up" memory and improve performance. This would be bad enough coming from "your buddy who read it on some forum", but apparently there are &lt;a href="https://twitter.com/#!/edfladung/status/153918479915950080"&gt;reports&lt;/a&gt; of Apple Genius Bar employees feeding this crap out to members of the unknowing public.&lt;/p&gt;&lt;p&gt;For the last time, (Fraser puts it perfectly): &lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The iOS multitasking bar does not contain "a list of all running apps". It contains "a list of recently used apps". The user never has to manage background tasks on iOS.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Most iOS developers know this stuff like the back of our hands, but it's important to remember that most of your users have no idea how any of this stuff is "supposed" to work.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/YrH-W1Nns5U" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/misconceptions-about-ios-multitasking</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/36</id>
    <published>2011-12-23T11:47:00-06:00</published>
    <updated>2011-12-23T11:47:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/Bm13Bi4Cggs/zucchini-visual-ios-testing-written-in-coffeescript" />
    <title>Zucchini: iOS Testing Written in Ruby &amp; CoffeeScript</title>
    <content type="html">&lt;p&gt;&lt;a href="http://www.zucchiniframework.org/"&gt;Zucchini&lt;/a&gt; is an awesome &lt;a href="http://cukes.info/"&gt;cucumber&lt;/a&gt;-like visual testing framework for iOS. It works in a pretty awesome way by compiling &lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt; down to &lt;a href="http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html"&gt;UIAutomation&lt;/a&gt;-compliant Javascript, and then running the test with Instruments.app's command-line tool.&lt;/p&gt;&lt;p&gt;Also, As their site describes further, the whole system works very much like &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;, the popular ruby/rails testing gem:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;A Zucchini feature file consists of sections bound to contexts of different application screens. Every screen you proceed to needs to be backed up by a CoffeeScript class describing all UI elements you want Zucchini to interact with as well as custom actions you feel like performing on that screen.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Here's an example of one such class:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;PostScreen&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Screen&lt;/span&gt;
  &lt;span class="nv"&gt;anchor: &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;navigationBars&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;"Post"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nv"&gt;constructor: &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;

    &lt;span class="nx"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;@elements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Post'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;navigationBars&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;"Post"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;"Post"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nx"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;@actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Type "([^"]*)"$'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;(text) -&amp;gt;&lt;/span&gt;
      &lt;span class="nv"&gt;messageArea = &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;'Message Text Area'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nx"&gt;messageArea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setValue&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zucchini has an impressive set of features including:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Using a natural language for interaction scenarios, such as &lt;code&gt;Then on the "Menu" screen:&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;The ability test/compare against screenshots.&lt;/li&gt;
&lt;li&gt;Integration with Jenkins for full-on regression testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Zucchini only runs on Mac OS X 10.6 and 10.7 and requires XCode 4.2 as well as Ruby (at least 1.8.7).&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://www.zucchiniframework.org/"&gt;The Zucchini site&lt;/a&gt; is full of really helpful links and installation instructions, so check it out, you can also find &lt;a href="https://github.com/playup/zucchini"&gt;the Zucchini project on Github here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/Bm13Bi4Cggs" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/zucchini-visual-ios-testing-written-in-coffeescript</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/35</id>
    <published>2011-12-15T21:34:00-06:00</published>
    <updated>2011-12-15T21:34:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/taeWP46xqoM/creating-the-ios-5-uitableview-bevel-effect" />
    <title>Creating the iOS 5 UITableView Bevel Effect</title>
    <content type="html">&lt;p&gt;Oh man, I wish I had found &lt;a href="https://twitter.com/#!/Tim0liver"&gt;Tim Oliver&lt;/a&gt;'s &lt;a href="http://www.tim-oliver.com/2011/10/23/creating-the-uitableview-bevel-effect-in-coregraphics/"&gt;writeup about this&lt;/a&gt; sooner (includes diagrams and sample code).&lt;/p&gt;&lt;p&gt;I just wrote all of this code myself, and had to do all of my own research. Serves me right for not properly Googling.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Pro Tip&lt;/em&gt;: Google everything before you begin coding a solution for a problem you assume everyone in your field must have.&lt;/p&gt;&lt;p&gt;You see, in iOS 5, Apple refreshed the look of a standard &lt;code&gt;UITableViewStyleGrouped&lt;/code&gt; style &lt;code&gt;UITableView&lt;/code&gt;. (You know, the ones with the rounded corners). &lt;/p&gt;&lt;p&gt;No longer were they actually white (like &lt;code&gt;255, 255, 255&lt;/code&gt; or &lt;code&gt;#FFFFFF&lt;/code&gt;). They were now a refreshing shade of &lt;code&gt;255, 255, 255, 0.8&lt;/code&gt;. That's still pure white, but with an opacity of &lt;em&gt;80%&lt;/em&gt;. Also, they added a 1 point tall drop shadow, as well as a 1 point tall inner shadow to each &lt;code&gt;UITableViewCell&lt;/code&gt;. They've also still got a 1 point border around them.&lt;/p&gt;&lt;p&gt;I actually think the new cells looks &lt;em&gt;much&lt;/em&gt; better, but they definitely break any custom code anyone had written to make their own custom UI or buttons match &lt;code&gt;UIKit&lt;/code&gt;'s.&lt;/p&gt;&lt;p&gt;I can't tell you how often I need to replicate this look and feel. Glad someone put together &lt;a href="http://www.tim-oliver.com/2011/10/23/creating-the-uitableview-bevel-effect-in-coregraphics/"&gt;a comprehensive article about the topic&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Pro Tip #2&lt;/em&gt;: This is a pretty small detail, and sure, most people probably won't even notice. However, in my own anecdotal side-by-side tests, I was able to get an &lt;i&gt;Oh this looks much better!&lt;/i&gt; reaction out of people by simply making my custom drawn stuff correctly match the system drawn bits.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/taeWP46xqoM" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/creating-the-ios-5-uitableview-bevel-effect</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/34</id>
    <published>2011-12-13T14:03:00-06:00</published>
    <updated>2011-12-13T14:03:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/5EZshZTLUzU/connect-discover-edit-inspect-customize" />
    <title>Connect, Discover, Edit, Inspect, Customize</title>
    <content type="html">&lt;p&gt;A brilliant article by my buddy &lt;a href="https://twitter.com/#!/tedchoward"&gt;Ted Howard&lt;/a&gt; on the trials and tribulations of properly naming pieces of your user interface.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;We needed a name for the button that brought up the stack editor. We wanted to convey to the user that launching the editor was a safe operation, that any changes they made would not be applied to the stack they were viewing. For that reason, we didn’t want to use ‘Edit’, because ‘Edit’ made it sound like you could modify something that someone else had made. We had many long conversations and debates about what to call the button. The thesaurus was consulted. Finally we chose a word: ‘Customize this stack’.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;A good user interface can be killed by forgetting to think about these crucial details. Kudos to Ted for reminding us.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/5EZshZTLUzU" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/connect-discover-edit-inspect-customize</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/33</id>
    <published>2011-12-11T01:52:00-06:00</published>
    <updated>2011-12-11T01:52:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/IINdT1Zy86g/using-blocks-for-drawing" />
    <title>Using Blocks for Drawing</title>
    <content type="html">&lt;p&gt;I'm absolutely in love with the technique &lt;a href="https://twitter.com/#!/davidhamrick"&gt;David Hamrick&lt;/a&gt; lays out in this post.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Instead of subclassing UIView every time we need to draw something what if we were to have one subclass that allowed us to pass in a block that performed the drawing code. So I’ve created a class called DrawView that does exactly that. It also passes itself and the graphics context since that was going to be needed in every block’s implementation so including them as parameters reduced the amount of boiler plate code needed.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;It's a pretty simple idea: you shouldn't need to subclass just to do a tiny bit of custom drawing. Now you don't have to. With David's simple &lt;code&gt;DrawView&lt;/code&gt; class, you can do your drawing like this:&lt;/p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;DrawView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;drawableView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;DrawView&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;initWithFrame:&lt;/span&gt;&lt;span class="n"&gt;CGRectMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;320.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;autorelease&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="n"&gt;drawableView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UIView&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;CGContextRef&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;CGPoint&lt;/span&gt; &lt;span class="n"&gt;startPoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CGPointMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CGPoint&lt;/span&gt; &lt;span class="n"&gt;endPoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CGPointMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;CGContextSetStrokeColorWithColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;UIColor&lt;/span&gt; &lt;span class="n"&gt;grayColor&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;CGColor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CGContextSetLineWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CGContextMoveToPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;startPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;startPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CGContextAddLineToPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CGContextStrokePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="nl"&gt;addSubview:&lt;/span&gt;&lt;span class="n"&gt;drawableView&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wouldn't be surprised to see something like this show up in a future update to &lt;code&gt;UIKit&lt;/code&gt;. Apple is starting to use blocks everywhere. This is just good sense.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/IINdT1Zy86g" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/using-blocks-for-drawing</feedburner:origLink></entry>
  <entry>
    <id>tag:deallocatedobjects.com,2005:Post/32</id>
    <published>2011-12-11T01:31:00-06:00</published>
    <updated>2011-12-11T01:31:00-06:00</updated>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deallocatedobjects/~3/SwKN_MFXJYg/attaching-a-uiview-to-the-uiscrollviewindicator" />
    <title>Attaching a UIView to the UIScrollViewIndicator</title>
    <content type="html">&lt;p&gt;Here's a neat little write up (sample code included) from &lt;a href="https://twitter.com/#!/FlorianMielke/"&gt;Florian Mielke&lt;/a&gt; of how to replicate &lt;a href="https://path.com/"&gt;Path 2.0&lt;/a&gt;'s neat behavior of "attaching" a timestamp indicator that follows iOS's built-in scroll indicator as you scroll.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The basic idea is to add the info panel’s root layer as a sublayer to the indicator’s root layer. With that, the info panel scrolls smoothly and stays in parallel to the indicator automatically. In the case were the scroll view hit the edges, we want the info panel to stay visible at the top or bottom of the screen, so we need to do some extra calculation to let it stay centered.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;center&gt;
&lt;img src="http://f.cl.ly/items/0y103O2K0E0Q3m3G1m2v/tumblr_lvzgtccQG51qbj1h6o1_500.png" alt="Screenshot"&gt;&lt;br&gt;
&lt;/center&gt;&lt;p&gt;Love the technique, can't wait to see something like this start showing up in more apps. I think anything that intuitively allows developers and designers a way to remove ugly information like timestamps from rows of data is awesome.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Here's a &lt;a href="http://jsfiddle.net/michaelhue/7NAvm/7/light/"&gt;web-based implementation of the same effect&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/deallocatedobjects/~4/SwKN_MFXJYg" height="1" width="1"/&gt;</content>
    <author>
      <name>Jake Marsh</name>
    </author>
  <feedburner:origLink>http://deallocatedobjects.com/posts/attaching-a-uiview-to-the-uiscrollviewindicator</feedburner:origLink></entry>
</feed>
