<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Paul Solt &#187; iPhone</title>
	<atom:link href="http://paulsolt.com/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://paulsolt.com</link>
	<description>Putting the Inc back in Solt since 2005.</description>
	<lastBuildDate>Tue, 01 May 2012 15:03:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>App Rochester &#8211; iPhone Programming Presentation</title>
		<link>http://paulsolt.com/2012/04/app-rochester-iphone-programming-presentation/</link>
		<comments>http://paulsolt.com/2012/04/app-rochester-iphone-programming-presentation/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 19:27:39 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[approchester]]></category>
		<category><![CDATA[gestures]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[sample xcode project]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[UIPanGestureRecognizer]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1314</guid>
		<description><![CDATA[<p>In followup from my iPhone programming presentation I have uploaded the presentation and sample <a title="Xcode Download" href="https://developer.apple.com/xcode/">Xcode project (Xcode 4.3.2)</a> The sample converts between temperatures in celsius and fahrenheit.</p> <p>The sample shows how to setup the gestures in Xcode&#8217;s interface builder, rather than in Objective-C code. Using the <a title="UIPanGestureRecognizer" href="http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIPanGestureRecognizer_Class/Reference/Reference.html">UIPanGestureRecognizer</a> we can allow [...]]]></description>
			<content:encoded><![CDATA[<p>In followup from my iPhone programming presentation I have uploaded the presentation and sample <a title="Xcode Download" href="https://developer.apple.com/xcode/">Xcode project (Xcode 4.3.2)</a> The sample converts between temperatures in celsius and fahrenheit.</p>
<p>The sample shows how to setup the gestures in Xcode&#8217;s interface builder, rather than in Objective-C code. Using the <a title="UIPanGestureRecognizer" href="http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIPanGestureRecognizer_Class/Reference/Reference.html">UIPanGestureRecognizer</a> we can allow sliding input for the temperature conversion. The only code we need to implement is the action to take in response to a detected gesture.</p>
<p>Download the slides and sample code:</p>
<ul>
<li><a title="App Rochester Slides - iPhone Programming 3/3/12" href="http://paulsolt.com/wp-content/uploads/2012/04/iOS-Development-AppRochester-4-3-12.pdf">iOS Development AppRochester 4-3-12</a></li>
<li><a title="Xcode Project - Sample Temperature Converter with Gestures" href="http://paulsolt.com/wp-content/uploads/2012/04/AppRochester2.zip">AppRochester Sample Xcode Project</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2012/04/app-rochester-iphone-programming-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Unit Testing Explained &#8211; Part II</title>
		<link>http://paulsolt.com/2012/03/iphone-unit-testing-explained-part-ii/</link>
		<comments>http://paulsolt.com/2012/03/iphone-unit-testing-explained-part-ii/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 18:00:10 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iphone unit test]]></category>
		<category><![CDATA[mac unit test]]></category>
		<category><![CDATA[OCUnit]]></category>
		<category><![CDATA[resource paths]]></category>
		<category><![CDATA[sentest]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testable code]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[xcode 4]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=735</guid>
		<description><![CDATA[<p style="text-align: justify;">Xcode 4 has drastically improved iPhone unit testing and Mac unit testing from my previous post, <a href="http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/">iPhone Unit Testing Explained &#8211; Part I</a> Creating the unit testing target is easy and you can start writing test code in under 5 minutes.</p> <p style="text-align: justify;">The biggest hassle in testing is setting up the [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Xcode 4 has drastically improved iPhone unit testing and Mac unit testing from my previous post,<em> <a href="http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/">iPhone Unit Testing Explained &#8211; Part I</a></em> Creating the unit testing target is easy and you can start writing test code in under 5 minutes.</p>
<p style="text-align: justify;">The biggest hassle in testing is setting up the project correctly, and Xcode 4 makes it simple. If you read Part I, I pushed for GHUnit because of the GUI interface, but now Xcode&#8217;s built in testing is enough to get you started. If you need a GUI, add GHUnit later, but start writing your tests today, since they&#8217;re compatible with GHUnit when you decide to integrate with it.</p>
<p style="text-align: justify;">Testing is important to start from the beginning or you will never have the motivation to write the tests unless your boss demand</p>
<p><span style="font-size: 24px; font-weight: bold;">Getting Started</span></p>
<p>To start writing unit tests you have two options, either create a new project with unit tests or add unit tests to an existing project.</p>
<h2>New Project with Unit Tests</h2>
<p>Create a new project and make sure the checkbox is enabled for unit tests.</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="UnitTests New Project.png" src="http://paulsolt.com/wp-content/uploads/2012/03/UnitTests-New-Project1.png" alt="New Xcode 4 Project with Unit Tests" width="600" height="429" border="0" /></p>
<h2>Add Unit Tests Target to Existing Projects</h2>
<p>Add a unit test target to your project by clicking on your Project (top left) -&gt; Add Target (bottom middle) -&gt; iOS -&gt; Other -&gt; Unit Testing Bundle.</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="Add Unit Tests to Existing Xcode Project.png" src="http://paulsolt.com/wp-content/uploads/2012/03/Add-Unit-Tests-to-Existing-Xcode-Project1.png" alt="Add Unit Tests to Existing Xcode Project" width="600" height="429" border="0" /></p>
<h2>(Optional) Share the Target and Testing Scheme</h2>
<p style="text-align: justify;">If you add a unit test target, you&#8217;ll most likely want to share your testing scheme with your team over version control (git, svn, etc.) Otherwise you&#8217;re teammates will have to setup for themselves.</p>
<p>Goto Editor -&gt; Manage Schemes -&gt; Click Shared next to the Unit Test</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="Share Xcode Schemes with Teammates.png" src="http://paulsolt.com/wp-content/uploads/2012/03/Share-Xcode-Schemes-with-Teammates1.png" alt="Share Xcode Schemes with Teammates" width="600" height="429" border="0" /></p>
<h2>Adding Resources</h2>
<p style="text-align: justify;">When you want to test code or import resources like images or data files you&#8217;ll need to tell the testing target about the resources. There are two ways, you can do it when you first add the resource to the project or you can do it by editing the Build Phases for the unit test target.</p>
<p>&nbsp;</p>
<h3>Adding New Resources to the Unit Test Target</h3>
<p>Click on File -&gt; Add Files to &#8220;TestProject&#8221; -&gt; Click on the checkbox on unit test target and Copy items</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="Copy Items and add to Unit Test Target in Xcode 4.png" src="http://paulsolt.com/wp-content/uploads/2012/03/Copy-Items-and-add-to-Unit-Test-Target-in-Xcode-41.png" alt="Copy Items and add to Unit Test Target in Xcode 4" width="600" height="477" border="0" /></p>
<h3>Adding Existing Resources to the Unit Test Target</h3>
<p>Click on your project &#8220;TestProject&#8221; -&gt; Build Phases -&gt; Expand one of three (Compile Sources, Link Binary With Libraries, or Copy Bundle Resources)</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="Build Phases for unit test in Xcode 4.png" src="http://paulsolt.com/wp-content/uploads/2012/03/Build-Phases-for-unit-test-in-Xcode-4.png" alt="Build Phases for unit test in Xcode 4" width="600" height="477" border="0" /></p>
<h2>Resource Paths are Different!</h2>
<p style="text-align: justify;">Many assumptions that your bundle is the main bundle will cause problems when testing. (Especially when adding tests to existing code) Look at the difference in bundles, the main bundle isn&#8217;t what you&#8217;d expect in a unit test.</p>
<p style="padding-left: 30px;"><span style="color: #703daa;"><br />
</span></p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #703daa;">NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];</span></p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #703daa;">NSString</span> *directBundlePath = [[<span style="color: #703daa;">NSBundle</span> <span style="color: #3d1d81;">bundleForClass</span>:[<span style="color: #bb2ca2;">self</span> <span style="color: #3d1d81;">class</span>]] <span style="color: #3d1d81;">resourcePath</span>];</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #3d1d81;">NSLog</span>(<span style="color: #d12f1b;">@&#8221;Main Bundle Path: %@&#8221;</span>, mainBundlePath);</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #3d1d81;">NSLog</span>(<span style="color: #d12f1b;">@&#8221;Direct Path: %@&#8221;</span>, directBundlePath);</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #703daa;">NSString</span> *mainBundleResourcePath = [[<span style="color: #703daa;">NSBundle</span> <span style="color: #3d1d81;">mainBundle</span>] <span style="color: #3d1d81;">pathForResource</span>:<span style="color: #d12f1b;">@&#8221;Frame.png&#8221;</span> <span style="color: #3d1d81;">ofType</span>:<span style="color: #bb2ca2;">nil</span>];</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #703daa;">NSString</span> *directBundleResourcePath = [[<span style="color: #703daa;">NSBundle</span> <span style="color: #3d1d81;">bundleForClass</span>:[<span style="color: #bb2ca2;">self</span> <span style="color: #3d1d81;">class</span>]] <span style="color: #3d1d81;">pathForResource</span>:<span style="color: #d12f1b;">@&#8221;Frame.png&#8221;</span> <span style="color: #3d1d81;">ofType</span>:<span style="color: #bb2ca2;">nil</span>];</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #3d1d81;">NSLog</span>(<span style="color: #d12f1b;">@&#8221;Main Bundle Path: %@&#8221;</span>, mainBundleResourcePath);</p>
<p style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #3d1d81;">NSLog</span>(<span style="color: #d12f1b;">@&#8221;Direct Path: %@&#8221;</span>, directBundleResourcePath);</p>
<p><strong>Output</strong>:</p>
<p style="font: normal normal normal 11px/normal Menlo; padding-left: 30px; margin: 0px;">Main Bundle Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/Developer/usr/bin</p>
<p style="font: normal normal normal 11px/normal Menlo; padding-left: 30px; margin: 0px;">Direct Path: /Users/paulsolt/Library/Developer/Xcode/DerivedData/PhotoTable-dqueeqsjkjdthcbkrdzcvwifesvl/Build/Products/Debug-iphonesimulator/Unit Tests.octest</p>
<p style="font: normal normal normal 11px/normal Menlo; padding-left: 30px; margin: 0px;">Main Bundle Path: (null)</p>
<p style="font: normal normal normal 11px/normal Menlo; padding-left: 30px; margin: 0px;">Direct Path: /Users/paulsolt/Library/Developer/Xcode/DerivedData/PhotoTable-dqueeqsjkjdthcbkrdzcvwifesvl/Build/Products/Debug-iphonesimulator/Unit Tests.octest/Frame.png</p>
<h3></h3>
<h3>Problem: My Unit test has a nil image, data file, etc. Why?</h3>
<p style="text-align: justify;"><span style="font-size: 14px;">The unit test doesn&#8217;t use the same bundle for resources that you&#8217;re accustomed to when running an app. Therefore, the resource we&#8217;re trying to load cannot be found.  You&#8217;ll need to make changes to the code to support testing external resources (images, data files, etc). For example the following code</span></p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #703daa;">UIImage</span> *)resizeFrameForImage:(<span style="color: #703daa;">NSString</span> *)theImageName {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #703daa;">UIImage</span> *image = [<span style="color: #703daa;">UIImage</span> <span style="color: #3d1d81;">imageNamed</span>:theImageName];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// ... do magical resize and return</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span> image;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<h3></h3>
<h3>Solution 1: Change the function parameters</h3>
<p style="text-align: justify;">Functions like these are semi-black boxes that aren&#8217;t ideal for testing. You want access to all your inputs/outputs, especially if we&#8217;re working with any kind of file resource. To fix it, just pass in the resource from the unit test, rather than having the function load it from a NSString object.</p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #703daa;">UIImage</span> *)resizeFrameForImage:(<span style="color: #703daa;">UIImage</span> *)theImage {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// ... do magical resize and return</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span> theImage;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<h3></h3>
<h3>Solution 2: Change the resource loading inside the function</h3>
<p style="text-align: justify;">If you need to load the resource in the function, you can alternatively change the way it is loaded. You need to stop using UIImage&#8217;s imageNamed: method and switch to imageWithContentsOfFile: This way you can pass in the resource with the correct path, however it&#8217;ll change logic elsewhere in your app.</p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #703daa;">UIImage</span> *)resizeFrameForImage:(<span style="color: #703daa;">NSString</span> *)theImagePath {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #703daa;">UIImage</span> *image = [<span style="color: #703daa;">UIImage</span> <span style="color: #3d1d81;">imageWithContentsOfFile</span>:theImagePath];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// ... do magical resize and return</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span> image;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<h3></h3>
<h3>Solution 3: Load resources using the bundle for the current class</h3>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #703daa;">UIImage</span> *)resizeFrameForImage:(<span style="color: #703daa;">NSString</span> *)theImageName {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// Note: There are several ways you can write it, but make sure you include</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">//  the extension or you'll have trouble finding the resource</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// 1. NSString *imagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Image.png" ofType:nil];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// 2. NSString *imagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Image" ofType:@"png"];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #703daa;">NSString</span> *imagePath = [[<span style="color: #703daa;">NSBundle</span> <span style="color: #3d1d81;">bundleForClass</span>:[<span style="color: #bb2ca2;">self</span> <span style="color: #3d1d81;">class</span>]] <span style="color: #3d1d81;">pathForResource</span>:theImageName <span style="color: #3d1d81;">ofType</span>:<span style="color: #bb2ca2;">nil</span>];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #703daa;">UIImage</span> *image = [<span style="color: #703daa;">UIImage</span> <span style="color: #3d1d81;">imageWithContentsOfFile</span>:imagePath];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// ... do magical resize and return</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span> image;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<h2 style="font-size: 1.5em; padding-left: 30px;"></h2>
<h2 style="font-size: 1.5em;">My First Test</h2>
<p style="text-align: justify;">Code completion in Xcode will make writing tests easy. To test different things you&#8217;ll use the following macros:</p>
<ul>
<li><span style="color: #78492a;">STAssertNotNil</span>(Object, Description);</li>
<li><span style="color: #78492a;">STAssertEquals</span>(Value1, Value2, Description);</li>
<li><span style="color: #78492a;">STAssertEqualObjects</span>(Object1, Object2, Description<span style="color: #78492a;">);</span></li>
</ul>
<p>Example: MyTest.m</p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;"><span style="color: #bb2ca2;">@implementation</span> TestImagePrintHelper</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #bb2ca2;">void</span>)setUp</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">{</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;">[<span style="color: #bb2ca2;">super</span> <span style="color: #3d1d81;">setUp</span>];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// Set-up code here.</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #bb2ca2;">void</span>)tearDown</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">{</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;">// Tear-down code here.</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;">[<span style="color: #bb2ca2;">super</span> <span style="color: #3d1d81;">tearDown</span>];</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #bb2ca2;">void</span>)testName {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #703daa;">NSString</span> *testFirstName = <span style="color: #d12f1b;">@"Paul"</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #d12f1b; padding-left: 60px; margin: 0px;"><span style="color: #78492a;">STAssertEqualObjects</span><span style="color: #000000;">([</span><span style="color: #4f8187;">person</span><span style="color: #000000;"> firstName</span><span style="color: #000000;">], testFirstName, </span>@"The name does not match"<span style="color: #000000;">);</span></pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #d12f1b; padding-left: 30px; margin: 0px;"><span style="color: #000000; font-family: Helvetica; font-size: medium;">}</span></pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #bb2ca2; padding-left: 30px; margin: 0px;">@end</pre>
<p>The <em>STAssertEqualObjects</em> macro will invoke the object&#8217;s isEqual method, <strong>make sure you write one</strong>. See the section below. If you used the <em>STAssertEquals</em> it will test for primitive/pointer equality, not object equality.</p>
<h2 style="text-align: justify;">Testable Code</h2>
<p style="text-align: justify;">Writing testable code requires that you add some additional functions that might feel optional before you decided to start testing.</p>
<h3 style="text-align: justify;">1. Create a isEqual method for your class.</h3>
<p style="text-align: justify;">Most of the time you&#8217;ll want to compare if the object is the correct object. This always requires that you write an isEqual method, otherwise you&#8217;ll be using the NSObject isEqual test and it&#8217;ll compare address pointers for the objects.</p>
<p style="text-align: justify;"><strong>Example: </strong>Person.m</p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #bb2ca2;">BOOL</span>)isEqual:(<span style="color: #bb2ca2;">id</span>)other {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">if</span><span style="color: #000000;"> (other == </span><span style="color: #bb2ca2;">self</span><span style="color: #000000;">) { </span>// self equality, compare address pointers</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 90px; margin: 0px;"><span style="color: #bb2ca2;">return</span> <span style="color: #bb2ca2;">YES</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">if</span><span style="color: #000000;"> (!other || ![other </span><span style="color: #3d1d81;">isKindOfClass</span><span style="color: #000000;">:[</span><span style="color: #bb2ca2;">self </span><span style="color: #3d1d81;">class</span><span style="color: #000000;">]]) { </span></pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 90px; margin: 0px;">// test not nil and is same type of class</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 90px; margin: 0px;"><span style="color: #bb2ca2;">return</span> <span style="color: #bb2ca2;">NO</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span><span style="color: #000000;"> [</span><span style="color: #bb2ca2;">self </span><span style="color: #31595d;">isEqualToPerson</span><span style="color: #000000;">: other]; </span>// call our isEqual method for Person objects</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #bb2ca2;">BOOL</span>)isEqualToPerson:(Person *) other {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">BOOL</span> value = <span style="color: #bb2ca2;">NO</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">if</span><span style="color: #000000;"> (</span><span style="color: #bb2ca2;">self</span><span style="color: #000000;"> == other) { </span>// test for self equality</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 90px; margin: 0px;">value = <span style="color: #bb2ca2;">YES</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #3d1d81; padding-left: 60px; margin: 0px;"><span style="color: #000000;"> } </span><span style="color: #bb2ca2;">else</span><span style="color: #bb2ca2;">if</span><span style="color: #000000;">([[</span><span style="color: #bb2ca2;">self</span>firstName<span style="color: #000000;">] </span>isEqualToString<span style="color: #000000;">:[other </span>firstName<span style="color: #000000;">]] &amp;&amp;</span></pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 120px; margin: 0px;">[<span style="color: #bb2ca2;">self</span> <span style="color: #3d1d81;">age</span>] == [other <span style="color: #3d1d81;">age</span>]) {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #008400; padding-left: 90px; margin: 0px;">// Add any other tests for instance variables (ivars) that need to be compared</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 90px; margin: 0px;">value = <span style="color: #bb2ca2;">YES</span>;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;">}</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span> value;</pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<h3 style="text-align: justify;">2. Create a description method for your class.</h3>
<p style="text-align: justify;">This is what will output on the command line, rather than the objects memory address. It can be also called when you decide to print the value in a tests</p>
<p style="text-align: justify;"><strong>Example: </strong>Person.m</p>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">- (<span style="color: #703daa;">NSString</span> *)description {</pre>
<pre style="font: normal normal normal 12px/normal Menlo; color: #3d1d81; padding-left: 60px; margin: 0px;"><span style="color: #bb2ca2;">return</span><span style="color: #000000;"> [</span><span style="color: #703daa;">NSString</span>stringWithFormat<span style="color: #000000;">:</span><span style="color: #d12f1b;">@"Person Name: %@ Age: %d"</span><span style="color: #000000;">, [</span><span style="color: #bb2ca2;">self </span>firstName<span style="color: #000000;">], [</span><span style="color: #bb2ca2;">self </span>age<span style="color: #000000;">]];</span></pre>
<pre style="font: normal normal normal 12px/normal Menlo; padding-left: 30px; margin: 0px;">}</pre>
<p><strong>Example</strong>: Test using the description method, and we&#8217;ll see the first name and age printed like it was formatted in our description method.</p>
<pre style="font: normal normal normal 12px/normal Menlo; color: #d12f1b; padding-left: 30px; margin: 0px;"><span style="color: #78492a;">STAssertEqualObjects</span><span style="color: #000000;">([</span><span style="color: #3d1d81;">person</span><span style="color: #3d1d81;">firstName</span><span style="color: #000000;">], testFirstName, </span>@"The name does not match %@"<span style="color: #000000;">, </span><span style="color: #3d1d81;">person</span><span style="color: #000000;">);</span></pre>
<p style="font: normal normal normal 12px/normal Menlo; color: #d12f1b; margin: 0px;"><span style="color: #78492a;"><br />
</span></p>
<p style="text-align: justify;">Further reading in <a href="https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/UnitTesting/00-About_Unit_Testing/about.html#//apple_ref/doc/uid/TP40002143-CH1-SW1">Apple&#8217;s Unit Testing Guide</a> is available. Now you have the basics for unit testing. The next part will provide an example project using resources and providing unit tests.</p>
<p><em> (Part III: Coming Soon)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2012/03/iphone-unit-testing-explained-part-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Learn iPhone Programming via Skill Share in Rochester, NY</title>
		<link>http://paulsolt.com/2012/03/learn-iphone-programming-via-skill-share-in-rochester-ny/</link>
		<comments>http://paulsolt.com/2012/03/learn-iphone-programming-via-skill-share-in-rochester-ny/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 18:45:43 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[introductory course]]></category>
		<category><![CDATA[skillshare]]></category>
		<category><![CDATA[teaching]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1264</guid>
		<description><![CDATA[<p>I&#8217;m teaching a small hands-on course for iPhone development in Rochester, NY on April 21st 10am-12pm.</p> <p style="font-size: 13px;">Signup</p> <p>Space is limited: <a href="http://skl.sh/rIUWEE">http://skl.sh/rIUWEE</a></p> <p>About this Class</p> <p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">Learn how to get started [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m teaching a small hands-on course for iPhone development in Rochester, NY on April 21st 10am-12pm.</p>
<p style="font-size: 13px;"><strong style="font-size: 13px;">Signup</strong></p>
<p>Space is limited: <strong><a href="http://skl.sh/rIUWEE">http://skl.sh/rIUWEE</a></strong></p>
<p><span style="color: #444444; font-size: 16px; font-weight: bold; line-height: 20px;">About this Class</span></p>
<div id="listing-description" class="rich-content-wrapper listing-section" style="margin-top: 0px; margin-right: 0px; margin-bottom: 22px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; width: 610px; padding: 0px; border: 0px initial initial;">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">Learn how to get started with iPhone/iPad development and start making iPhone/iPad apps today. Install the tools and create an app without prior experience.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">Lecture: 30-45 minute lecture on getting started</p>
<ul>
<li>Xcode &#8211; Code editor</li>
<li>Objective-C &#8211; Computer language</li>
<li>Setting up developer credentials</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">Workshop: 1:30 hours</p>
<ul>
<li>Learn how to start programming</li>
<li>Build your first app &#8211; hands on learning</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">Recommended Reading</p>
<ul>
<li><a href="http://amzn.com/0321821521">iOS Programming: The Big Nerd Ranch Guide (3rd edition)</a></li>
<li><a href="http://amzn.com/0321706285">Objective-C Programming: The Big Nerd Ranch Guide</a></li>
<li><a href="https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOS/Introduction/Introduction.html">Start Developing Apps &#8211; Apple</a></li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;"><span style="color: #444444; font-size: 16px; font-weight: bold; line-height: 20px;">About Paul Solt</span></p>
<ul>
<li>Computer science graduate student at RIT</li>
<li>Worked at Apple Inc. and Microsoft.</li>
<li>4 years as a computer science student instructor at RIT</li>
<li>5 apps on App Store</li>
<li>12 years of programming experience</li>
</ul>
</div>
<div id="prerequisites-wrapper" class="listing-section" style="margin-top: 0px; margin-right: 0px; margin-bottom: 26px; margin-left: 0px; padding-top: 0px; padding-right: 30px; padding-bottom: 0px; padding-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; border: 0px initial initial;">
<h4 class="listing-section-header" style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.25em; margin-left: 0px; font-weight: bold; font-style: italic; font-size: 14px; font-family: inherit; vertical-align: baseline; color: #444444; line-height: 1.25; padding: 0px; border: 0px initial initial;">Prerequisites</h4>
</div>
<div id="prerequisites-wrapper" class="listing-section" style="margin-top: 0px; margin-right: 0px; margin-bottom: 26px; margin-left: 0px; padding-top: 0px; padding-right: 30px; padding-bottom: 0px; padding-left: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; border: 0px initial initial;">
<ul>
<li>Mac computer (Macbook Pro, Macbook Air, iMac)</li>
<li>Install Xcode 4.3+ from the Mac App Store. http://developer.apple.com/xcode/</li>
<li>(Optional) Bring iPhone/iPad with usb cables</li>
<li>(Optional) Register as a iOS Developer $99/year: https://developer.app</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2012/03/learn-iphone-programming-via-skill-share-in-rochester-ny/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Potential of Siri</title>
		<link>http://paulsolt.com/2011/10/the-potential-of-siri/</link>
		<comments>http://paulsolt.com/2011/10/the-potential-of-siri/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 17:48:33 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[siri]]></category>
		<category><![CDATA[voice control]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1225</guid>
		<description><![CDATA[<p>I&#8217;ve been working on iPhone development for several years and I have been very excited to see how the iPhone SDK has progressed. See my original article on how I envisioned the <a title="iPad Revolution" href="http://paulsolt.com/2010/02/ipad-revolution/" target="_blank">iPad revolutionizing the computing experience</a>. Siri takes the iPhone platform to an entirely new level. </p> <p>Feature article by MD</p> [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on iPhone development for several years and I have been very excited to see how the iPhone SDK has progressed. See my original article on how I envisioned the <a title="iPad Revolution" href="http://paulsolt.com/2010/02/ipad-revolution/" target="_blank">iPad revolutionizing the computing experience</a>. Siri takes the iPhone platform to an entirely new level. <span id="more-1225"></span></p>
<p>Feature article by MD</p>
<p>If you&#8217;re curious as to how the potential of Siri will impact iOS App development, then look no further than the video Apple used to demonstrate the technology, despite its somewhat heavy-on-the-awesome slant. The fact of the matter is, this is voice recognition technology that&#8217;s approaching the level of sophistication you saw in Startrek Voyager as a kid, and it could do wonders for 3rd party App developers.</p>
<p>&#8220;Load Angry Birds. New game, please. Aim 45 degrees off the starboard. Lower 3 degrees. Fire. Raise 3 degrees. Fire. Down with the piggies! Fire.&#8221;</p>
<p>It sounds far fetched, but is it? Voice control to do anything from text messaging to calling, and it&#8217;s not difficult to imagine it controlling things that are not traditionally based around natural voice input. It&#8217;d also be a great idea to work in some camera/augmented reality games, as playing &#8220;I Spy&#8221; with Siri could only make the device even more intuitive, when you&#8217;re not ringing your husband, friend or <a title="O2" href="http://www.o2.co.uk/" target="_blank">O2</a> without even touching your handset.</p>
<p>An open API to Siri will help push developers in a new direction building innovative software for the iPhone 4S, given that Siri pushes the boundaries in a way that encourages people to try something new. Google Goggles was a great example of this &#8211; it took what QR codes were doing and pushed it farther than anyone had expected it to go &#8211; I certainly didn&#8217;t expect to be able to use my voice to dictate a text message, make two calls and send an email to my boss, did you?</p>
<p>The best thing about it is the potential it awards developers working with voice and hardware interaction, as unless you&#8217;re paranoid about SkyNet and HAL-9000 becoming a reality, it certainly puts a friendlier face on an already friendly looking phone. All that&#8217;s left is for us to enjoy the adventures many app programmers are embarking on with Siri, in addition to the talented invidiual who&#8217;s just ported it to the iPhone 4. Good times to come, ahead.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/10/the-potential-of-siri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Photo Table: Sharing Photos on iPad and iPhone using Multi-touch Input</title>
		<link>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/</link>
		<comments>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 16:47:52 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[photo table]]></category>
		<category><![CDATA[slideshow]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1203</guid>
		<description><![CDATA[Photo Table has been built from the ground up to support image management using the concept of albums. We can import albums from Facebook, Flickr, and the Photo Library.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="size-full wp-image-1209 alignright" title="Photo Table on iPad and iPhone" src="http://paulsolt.com/wp-content/uploads/2011/09/iPadiPhoneDuo.png" alt="Multi-touch Photo Sharing" width="278" height="392" /></p>
<p style="text-align: justify;">I&#8217;ve been busy avoiding recruiters and graduating to work on a software startup in the RIT Summer Startup Program. Over the past four months we&#8217;ve been working out of RIT&#8217;s Venture Creations at 125 Tech Park, Rochester, NY. Initially we focused on Artwork Evolution and printing integration, but have shifted directions into supporting photo sharing.</p>
<p style="text-align: justify;">Our new product is called Photo Table. It&#8217;s an app that enables sharing photos on iPad and iPhone. The uses multi-touch gestures seen first in my gesture based <a title="Wallpaper Evolution for iPhone and iPad" href="http://blog.artworkevolution.com/ios-apps/wallpaper-evolution/">Wallpaper Evolution app</a> for iPhone and iPad. The interactive Wallpaper Evolution app provided a mechanism to add one photo to the table at a time, but it lacked depth without photo album management. That changes with Photo Table.</p>
<p style="text-align: justify;">Photo Table has been built from the ground up to support image management using the concept of albums. We can import albums from Facebook, Flickr, and the Photo Library. Any image can be added to an album or removed just like you&#8217;d expect. Once you have albums you can open them and show family and friends interactive slideshows. All the photos are stored in the app, so we support offline content viewing. We have a lot of fun with the App and are hoping that you&#8217;ll be excited to try it.</p>
<ul style="text-align: justify;">
<li><strong>Website</strong>: <a title="Multi-touch photo sharing app for iPad" href="http://www.PhotoTableApp.com/">http://www.PhotoTableApp.com/</a></li>
<li><strong>Twitter</strong>: <a title="Photo Table on Twitter" href="http://www.twitter.com/PhotoTable">@PhotoTable</a></li>
<li><strong>Facebook</strong>: <a title="Photo Table on Facebook" href="http://www.Facebook.com/PhotoTableApp/">http://www.Facebook.com/PhotoTableApp/</a></li>
</ul>
<h3 style="text-align: justify;"><a title="Download Facebook albums for off-line viewing" href="http://www.youtube.com/watch?v=7dPguidC6Mk ">Photo Table Facebook Album Importing</a></h3>
<p style="text-align: justify;">
<p><a href="http://www.youtube.com/watch?v=7dPguidC6Mk&#038;fmt=18">http://www.youtube.com/watch?v=7dPguidC6Mk</a></p>
</p>
<h3 style="text-align: justify;"><a title="Play Music with Photo Albums and Share with Family" href="http://www.youtube.com/watch?v=fpge8z65wH4 ">Add Music to Photo Albums for Sharing with Families</a></h3>
<p style="text-align: justify;">
<p><a href="http://www.youtube.com/watch?v=fpge8z65wH4&#038;fmt=18">http://www.youtube.com/watch?v=fpge8z65wH4</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Idea to App Store &#8211; How to make, market, and sell your iPhone App</title>
		<link>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/</link>
		<comments>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 18:53:27 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[appfigures]]></category>
		<category><![CDATA[Artwork Evolution]]></category>
		<category><![CDATA[flurry]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[sales]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1173</guid>
		<description><![CDATA[<p>I&#8217;ve posted my presentation from the Computer Science Community at RIT on making iPhone/iPad apps from February 2011. The video is in two parts and I discuss the initial sales, analytics, marketing when releasing an iPhone app.</p> <p></p> <p>Update: 8/31/11 <a href="http://paulsolt.com/wp-content/uploads/2011/08/Idea-to-App-Store.pdf">Idea to App Store Slides (PDF)</a></p> <a title="Idea to App Store Part 1" href="http://www.youtube.com/watch?v=2uza2teEBEQ">Part 1:</a> [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve posted my presentation from the Computer Science Community at RIT on making iPhone/iPad apps from February 2011. The video is in two parts and I discuss the initial sales, analytics, marketing when releasing an iPhone app.</p>
<p><span id="more-1173"></span></p>
<p><strong>Update: 8/31/11</strong> <a href="http://paulsolt.com/wp-content/uploads/2011/08/Idea-to-App-Store.pdf">Idea to App Store Slides (PDF)</a></p>
<h2><a title="Idea to App Store Part 1" href="http://www.youtube.com/watch?v=2uza2teEBEQ">Part 1:</a></h2>
<p><a href="http://www.youtube.com/watch?v=2uza2teEBEQ&#038;fmt=18">http://www.youtube.com/watch?v=2uza2teEBEQ</a></p>
<h2><a title="Idea to App Store Part 2" href="http://www.youtube.com/watch?v=iyBis6W28Rw">Part 2:</a></h2>
<p><a href="http://www.youtube.com/watch?v=iyBis6W28Rw&#038;fmt=18">http://www.youtube.com/watch?v=iyBis6W28Rw</a></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iOS Development Presentation</title>
		<link>http://paulsolt.com/2011/06/ios-development-presentation/</link>
		<comments>http://paulsolt.com/2011/06/ios-development-presentation/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 14:22:45 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[RIT]]></category>
		<category><![CDATA[slides]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1159</guid>
		<description><![CDATA[<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM.png"></a>Here are my slides and demo code from the presentation on Friday, June 10th at 10am in ICL5 at RIT.</p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/06/iPhoneOS-Development-III-Paul-Solt.pdf">iPhoneOS Development III &#8211; Paul Solt</a></p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/06/csProject.zip">Gestures Demo</a></p> <p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM.png"><img class="size-medium wp-image-1164 alignright" title="Gestures Demo" src="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM-159x300.png" alt="Gestures Demo" width="159" height="300" /></a>Here are my slides and demo code from the presentation on Friday, June 10th at 10am in ICL5 at RIT.</p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/iPhoneOS-Development-III-Paul-Solt.pdf">iPhoneOS Development III &#8211; Paul Solt</a></p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/csProject.zip">Gestures Demo</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/06/ios-development-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transparent UITableView with Custom Background UIView and Tap Gestures</title>
		<link>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/</link>
		<comments>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/#comments</comments>
		<pubDate>Sat, 14 May 2011 23:38:41 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[tap gesture]]></category>
		<category><![CDATA[transparent background]]></category>
		<category><![CDATA[uitableview]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1094</guid>
		<description><![CDATA[<p style="text-align: justify;">In order to create a custom background for a transparent UITableView you&#8217;ll need to do a few things. I&#8217;ve got the basic code below after a lot of tinkering. I&#8217;ve also included how to make it so you can hide the UITableView when you tap in the transparent areas below the rows using [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">In order to create a custom background for a transparent <code>UITableView</code> you&#8217;ll need to do a few things. I&#8217;ve got the basic code below after a lot of tinkering. I&#8217;ve also included how to make it so you can hide the <code>UITableView</code> when you tap in the transparent areas below the rows using a <code>UITapGestureRecognizer</code>. In the images below you can see the custom view in action.</p>
<div class="mceTemp" style="text-align: center;">
<dl id="attachment_1102" class="wp-caption alignnone" style="width: 169px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground.png"><img class="size-medium wp-image-1102" title="TableViewCustomBackground" src="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground-159x300.png" alt="UITableView with custom backgroundView" width="159" height="300" /></a></dt>
<dd class="wp-caption-dd">UITableView with Custom Background</dd>
</dl>
</div>
<p style="text-align: center;"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground.png"></a><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden.png"><br />
</a></p>
<div id="attachment_1101" class="wp-caption aligncenter" style="width: 169px"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden.png"><img class="size-medium wp-image-1101" title="TableViewHidden" src="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden-159x300.png" alt="Hidden UITableView with Custom Background" width="159" height="300" /></a><p class="wp-caption-text">Hidden UITableView Showing Custom Background</p></div>
<p><strong>Key Points:</strong></p>
<ul>
<li style="text-align: justify;">Don&#8217;t subclass <code>UITableView</code>, instead use it as a instance variable in your own custom UIViewController subclass.</li>
<li style="text-align: justify;"> Create a custom <code>UIView</code> subclass to use as the background view, this will be visible when the <code>UITableView</code> is hidden or has a transparent background view.</li>
<li style="text-align: justify;"> On iPad make sure you clear the UITableView&#8217;s <code>backgroundView</code> and set it to <code>nil</code> in addition to setting the background color to<code>[UIColor clearColor]</code></li>
<li style="text-align: justify;"> Register a <code>UITapGestureRecognizer</code> with the viewController&#8217;s view and then set the attribute <code>cancelsTouches</code> to <code>NO</code> so that the touches from the gesture propagate to both the <code>UITableView</code> and the custom background view.</li>
<li style="text-align: justify;"> In the <code>-(void)handleTapGesture:</code> method you&#8217;ll want to send taps that don&#8217;t touch a row to toggle the UI so that the <code>UITableView</code> hides or unhides.</li>
</ul>
<p style="text-align: justify;"><strong>Notes:</strong></p>
<ul>
<li style="text-align: justify;">I show a <code>UINavigationBar</code>, so my <code>UITableView</code> frame needs to take into account the size of the navigation bar.</li>
<li style="text-align: justify;">Set the UILabel&#8217;s or custom views backgroundColor in the table&#8217;s cells to have <code>[UIColor clearColor]</code> so that they animate and fade correctly.</li>
</ul>
<p>See the sample code below:<br />
<script src="https://gist.github.com/972555.js?file=MyTransparentTableViewController.h"></script> <script src="https://gist.github.com/972555.js?file=MyTransparentTableViewController.m"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Limiting UIPinchGestureRecognizer Zoom Levels</title>
		<link>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/</link>
		<comments>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 01:03:34 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[gestures]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1069</guid>
		<description><![CDATA[<p>After wasting two days I&#8217;ve finally figured out how to correctly limit zoom levels when working with a UIPinchGestureRecognizer. I needed to resize images, but I didn&#8217;t want people to go outside of desirable limits.</p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png"></a></p> <p>Here&#8217;s the basic math:</p> <p>1. We know: currentSize * scaleFactor = newSize</p> <p>2. Clamp the maximum scale factor [...]]]></description>
			<content:encoded><![CDATA[<p>After wasting two days I&#8217;ve finally figured out how to correctly limit zoom levels when working with a UIPinchGestureRecognizer. I needed to resize images, but I didn&#8217;t want people to go outside of desirable limits.</p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png"><img class="aligncenter size-full wp-image-1072" title="Zoom Factors" src="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png" alt="" width="396" height="744" /></a></p>
<p>Here&#8217;s the basic math:</p>
<p>1. We know: currentSize * scaleFactor = newSize</p>
<p>2. Clamp the maximum scale factor using the proportion maxScale / currentScale</p>
<p>3. Clamp the minimum scale factor using the proportion minScale / currentScale</p>
<p>The code below assumes there is an instance variable CGFloat lastScale and that a view has been set for the UIPinchGestureRecognizer.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>handlePinchGesture<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPinchGestureRecognizer <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>gestureRecognizer <span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateBegan<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// Reset the last scale, necessary if there are multiple objects with different scales</span>
lastScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateBegan ||
<span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateChanged<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
CGFloat currentScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span>.layer valueForKeyPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;transform.scale&quot;</span><span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Constants to adjust the max/min values of zoom</span>
<span style="color: #a61390;">const</span> CGFloat kMaxScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">2.0</span>;
<span style="color: #a61390;">const</span> CGFloat kMinScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">1.0</span>;
&nbsp;
CGFloat newScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span> <span style="color: #002200;">-</span>  <span style="color: #002200;">&#40;</span>lastScale <span style="color: #002200;">-</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// new scale is in the range (0-1)</span>
newScale <span style="color: #002200;">=</span> MIN<span style="color: #002200;">&#40;</span>newScale, kMaxScale <span style="color: #002200;">/</span> currentScale<span style="color: #002200;">&#41;</span>;
newScale <span style="color: #002200;">=</span> MAX<span style="color: #002200;">&#40;</span>newScale, kMinScale <span style="color: #002200;">/</span> currentScale<span style="color: #002200;">&#41;</span>;
CGAffineTransform transform <span style="color: #002200;">=</span> CGAffineTransformScale<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span> transform<span style="color: #002200;">&#93;</span>, newScale, newScale<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span>.transform <span style="color: #002200;">=</span> transform;
&nbsp;
lastScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span>;  <span style="color: #11740a; font-style: italic;">// Store the previous scale factor for the next pinch gesture call</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Artwork Evolution 1.2.80 Released!</title>
		<link>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/</link>
		<comments>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 20:06:51 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Artwork Evolution]]></category>
		<category><![CDATA[coffee table]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[ipod touch]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wallpapers]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1058</guid>
		<description><![CDATA[Download <p style="padding-left: 30px;">Buy <a href="http://bit.ly/ArtworkEvolutionApp">Artwork Evolution on the App Store</a> and create wallpapers for iPhone, iPod Touch, and iPad!<br /> <a href="http://bit.ly/ArtworkEvolutionApp"></a></p> <a href="http://blog.artworkevolution.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg"></a><a href="http://bit.ly/ArtworkEvolutionApp"></a> New Features Coffee Table Photos: Touch, slide, and flick photos off the table! Updated main screen user interface Video <p style="text-align: center;"> <p><a href="http://www.youtube.com/watch?v=xkwE8BRQsAo&#038;fmt=18">http://www.youtube.com/watch?v=xkwE8BRQsAo</a></p></p>]]></description>
			<content:encoded><![CDATA[<h3>Download</h3>
<p style="padding-left: 30px;">Buy <a href="http://bit.ly/ArtworkEvolutionApp">Artwork Evolution on the App Store</a> and create wallpapers for iPhone, iPod Touch, and iPad!<br />
<a href="http://bit.ly/ArtworkEvolutionApp"><img src="http://ax.phobos.apple.com.edgesuite.net/images/web/linkmaker/badge_appstore-lrg.gif" alt="Artwork Evolution - Paul Solt" /></a></p>
<div class="mceIEcenter">
<dl id="attachment_79" class="aligncenter">
<dt><a href="http://blog.artworkevolution.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg"></a><a href="http://bit.ly/ArtworkEvolutionApp"><img class="aligncenter size-full wp-image-1061" title="NewUISmallWeb" src="http://paulsolt.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg" alt="" width="360" height="780" /></a>
</dt>
</dl>
</div>
<h3>New Features</h3>
<ul>
<li>Coffee Table Photos: Touch, slide, and flick photos off the table!</li>
<li>Updated main screen user interface</li>
</ul>
<h3>Video</h3>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=xkwE8BRQsAo&#038;fmt=18">http://www.youtube.com/watch?v=xkwE8BRQsAo</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

