<?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>GuoJing&#039;s Blog &#124; 献给未来的回忆 &#187; iPhone开发</title>
	<atom:link href="http://www.jguoer.com/blog/index.php/archives/category/iphone-dev/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jguoer.com/blog</link>
	<description>献给未来的回忆</description>
	<lastBuildDate>Thu, 02 Feb 2012 16:00:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Mac开发/iPhone开发 &#8211; 发送HttpRequest请求</title>
		<link>http://www.jguoer.com/blog/index.php/archives/148</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/148#comments</comments>
		<pubDate>Sat, 13 Feb 2010 03:38:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[Mac开发]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/02/13/Sending-Http-Request-From-iPhone-App-And-Mac-App.aspx</guid>
		<description><![CDATA[<p>在开发应用程序的时候，特别是当今网络特别充足和重要的时候，网络应用和桌面应用史无前例的整合起来，其界限也越来越模糊。所以网络应用可以向桌面应用开放API，然后桌面应用去调用，这样可以方便的维护一份代码，并且可以push更新到用户手里。</p>
<p>而在设计的时候，通常情况下都是客户端发送相应的Http请求，并包含某些内容，发送完毕之后，等待服务器端的响应。而在服务器端，得到请求的内容并生成相应的结果返回即可。虽然这个过程很好理解，很简单，但是在Mac和iPhone开发上，还是有点麻烦，而且国内资料又少，所以这里我写一下如何实现发送HttpRequest请求，方便后面的同学。</p>
<p><strong>这段代码可以适用与Mac OS X和iPhone应用。</strong></p>
<p>界面我就用Mac的桌面应用做，因为简单，效果一样，界面可以做成如下模样，如何连接就各位自己去连接了，我前面的文章说的很明白了。</p>
<p style="text-align: center;"><img style="border:none;background:transparent" alt="" src="/blog/wp-content/uploads/2010/2/machttprequest.png" /></p>
<p>当我们按下按钮的时候，就去获取相应的网站/服务器的返回的请求。调用方法如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ <br />
&#160;&#160;&#160;&#160;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">receive </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [RequestSender sendRequest:</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">http://wt.jguoer.com</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">]; <br />
&#160;&#160;&#160;&#160;textbox.title </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> receive; <br />
&#160;&#160;&#160;&#160;NSLog(</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Clicked</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">); <br />
}</span></div>
</div>
<p>RequestSender是我写的一个类，这个类就是用于发送Http请求的，具体代码如下。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">Cocoa</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">Cocoa.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@interface RequestSender : NSObject { <br />
<br />
} <br />
<br />
</span><strong><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)sendRequest:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)url; </span></strong><span style="color: rgb(0, 0, 0);"><br />
<br />
@end</span></div>
</div>
<p>实现代码如下所示，我已经写了详细的注释了，所以我就不需要再多说什么了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)sendRequest:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)url <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">准备发送httprequest</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">urlString </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> url; <br />
&#160;&#160;&#160;&#160;NSMutableURLRequest </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">request </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[[NSMutableURLRequest alloc] init] autorelease]; <br />
&#160;&#160;&#160;&#160;[request setURL:[NSURL URLWithString:urlString]]; <br />
&#160;&#160;&#160;&#160;[request setHTTPMethod:</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">GET</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置http头</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">contentType </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [NSString stringWithFormat:</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">text/xml</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">]; <br />
&#160;&#160;&#160;&#160;[request addValue:contentType forHTTPHeaderField: </span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Content-Type</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建http内容 <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">NSMutableData *postBody = [NSMutableData data]; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&#34;&#60;xml&#62;&#34;] dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&#34;&#60;your xml format code here/&#62;&#34;] </span></div>
<div><span style="color: rgb(0, 128, 0);">&#160;&#160;&#160; //dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&#34;&#60;/xml&#62;&#34;] dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置发送内容 <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[request setHTTPBody:postBody]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取响应</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;NSHTTPURLResponse</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> urlResponse </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> nil;&#160;&#160; <br />
&#160;&#160;&#160;&#160;NSError </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">error </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSError alloc] init];&#160;&#160; <br />
&#160;&#160;&#160;&#160;NSData </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">responseData </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [NSURLConnection sendSynchronousRequest:request returningResponse:</span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">urlResponse error:</span><span style="color: rgb(0, 0, 0);">&#38;</span><span style="color: rgb(0, 0, 0);">error];&#160;&#160; <br />
&#160;&#160;&#160;&#160;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">result </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">返回的http状态</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;NSLog(</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Response Code: %d</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">, [urlResponse statusCode]); <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取返回的内容</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ([urlResponse statusCode] </span><span style="color: rgb(0, 0, 0);">&#62;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">200</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&#38;&#38;</span><span style="color: rgb(0, 0, 0);"> [urlResponse statusCode] </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">300</span><span style="color: rgb(0, 0, 0);">)  <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NSLog(</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Response: %@</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">, result); <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> result; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">执行你想要的内容，代码可以写在这里</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(0, 0, 0);"><br />
&#160;&#160;&#160;&#160;} <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Return value</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">; <br />
}</span></div>
</div>
<p>我们获取的result就是我们想要的HttpResponse了，这样就成功发送了一个请求并获取了相应的内容。<a href="/blog/wp-content/uploads/2010/2/HttpRequestMac.zip">
</a></p>
<p><a href="/blog/wp-content/uploads/2010/2/HttpRequestMac.zip">HttpRequestMac.zip (29.12 kb)</a></p>]]></description>
			<content:encoded><![CDATA[<p>在开发应用程序的时候，特别是当今网络特别充足和重要的时候，网络应用和桌面应用史无前例的整合起来，其界限也越来越模糊。所以网络应用可以向桌面应用开放API，然后桌面应用去调用，这样可以方便的维护一份代码，并且可以push更新到用户手里。</p>
<p>而在设计的时候，通常情况下都是客户端发送相应的Http请求，并包含某些内容，发送完毕之后，等待服务器端的响应。而在服务器端，得到请求的内容并生成相应的结果返回即可。虽然这个过程很好理解，很简单，但是在Mac和iPhone开发上，还是有点麻烦，而且国内资料又少，所以这里我写一下如何实现发送HttpRequest请求，方便后面的同学。</p>
<p><strong>这段代码可以适用与Mac OS X和iPhone应用。</strong></p>
<p>界面我就用Mac的桌面应用做，因为简单，效果一样，界面可以做成如下模样，如何连接就各位自己去连接了，我前面的文章说的很明白了。</p>
<p style="text-align: center;"><img style="border:none;background:transparent" alt="" src="/blog/wp-content/uploads/2010/2/machttprequest.png" /></p>
<p>当我们按下按钮的时候，就去获取相应的网站/服务器的返回的请求。调用方法如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">receive </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [RequestSender sendRequest:</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">http://wt.jguoer.com</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;textbox.title </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> receive; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Clicked</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">); <br />
}</span></div>
</div>
<p>RequestSender是我写的一个类，这个类就是用于发送Http请求的，具体代码如下。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Cocoa</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">Cocoa.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@interface RequestSender : NSObject { </p>
<p>} </p>
<p></span><strong><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)sendRequest:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)url; </span></strong><span style="color: rgb(0, 0, 0);"></p>
<p>@end</span></div>
</div>
<p>实现代码如下所示，我已经写了详细的注释了，所以我就不需要再多说什么了。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)sendRequest:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)url <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">准备发送httprequest</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">urlString </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> url; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSMutableURLRequest </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">request </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[[NSMutableURLRequest alloc] init] autorelease]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;[request setURL:[NSURL URLWithString:urlString]]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;[request setHTTPMethod:</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">GET</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置http头</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">contentType </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [NSString stringWithFormat:</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">text/xml</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;[request addValue:contentType forHTTPHeaderField: </span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Content-Type</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建http内容 <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">NSMutableData *postBody = [NSMutableData data]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&quot;&lt;xml&gt;&quot;] dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&quot;&lt;your xml format code here/&gt;&quot;] </span></div>
<div><span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp; //dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[postBody appendData:[[NSString stringWithFormat:@&quot;&lt;/xml&gt;&quot;] dataUsingEncoding:NSUTF8StringEncoding]]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">设置发送内容 <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">[request setHTTPBody:postBody]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取响应</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;NSHTTPURLResponse</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> urlResponse </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> nil;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSError </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">error </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSError alloc] init];&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSData </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">responseData </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [NSURLConnection sendSynchronousRequest:request returningResponse:</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">urlResponse error:</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">error];&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">result </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">返回的http状态</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Response Code: %d</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">, [urlResponse statusCode]); <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取返回的内容</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ([urlResponse statusCode] </span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">200</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> [urlResponse statusCode] </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">300</span><span style="color: rgb(0, 0, 0);">)  <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Response: %@</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">, result); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> result; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">执行你想要的内容，代码可以写在这里</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Return value</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">; <br />
}</span></div>
</div>
<p>我们获取的result就是我们想要的HttpResponse了，这样就成功发送了一个请求并获取了相应的内容。<a href="/blog/wp-content/uploads/2010/2/HttpRequestMac.zip"><br />
</a></p>
<p><a href="/blog/wp-content/uploads/2010/2/HttpRequestMac.zip">HttpRequestMac.zip (29.12 kb)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/148/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; 数据持久化</title>
		<link>http://www.jguoer.com/blog/index.php/archives/171</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/171#comments</comments>
		<pubDate>Sun, 24 Jan 2010 11:16:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">/post/2010/01/24/iPhone-Development-Use-SQLite-To-Save-Data.aspx</guid>
		<description><![CDATA[在开发应用程序的时候，当然需要经常的实用数据库进行数据的保存了，在移动设备上，我们可以使用文件，数据库等方式去保存，为了能够让用户无法使用其他的程序去修改，我这里认为使用数据库的方式是一个很好的方式。在iPhone上面，我们可以使用SQLite进行数据的持久化。另外值得一提的是Firefox是使用数据库的方式保存的，同样也是SQLite。

在iPhone开发重，我们需要首先添加一个SQLite的库，XCode本身就支持的，我们在左边的Frameworks里面选择Add，然后选择Existing Frameworks，在弹出窗口中选择SQLite的库libsqlite3.0.dylib。
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/sqlite.png" alt="" style="border:none;background:transparent"/></p>


添加之后，我们就可以使用SQLite在iPhone中进行数据的保存，查询，删除等操作了。

现在我们可以写一个SQLite的Helper文件，方便我们在其他的代码中使用，头文件（SqliteHelper.h）如下。
<div class="code">
<div><span style="color: #000000;">#import </span><span style="color: #000000;">&#60;</span><span style="color: #000000;">Foundation</span><span style="color: #000000;">/</span><span style="color: #000000;">Foundation.h</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><strong><span style="color: #000000;">#import </span><span style="color: #800000;">"</span><span style="color: #800000;">sqlite3.h</span><span style="color: #800000;">"</span><span style="color: #000000;">
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> kFileName @"mydatabase.sql"</span><span style="color: #000000;"> </span></strong><span style="color: #000000;">

@interface SqliteHelper : NSObject {

</span><strong><span style="color: #000000;">sqlite3 </span><span style="color: #000000;">*</span><span style="color: #000000;">database; </span></strong><span style="color: #000000;">
}

</span><strong><span style="color: #008000;">//</span><span style="color: #008000;">创建表</span><span style="color: #008000;">
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)createTable;
</span><span style="color: #008000;">//</span><span style="color: #008000;">插入数据</span><span style="color: #008000;">
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)insertMainTable:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) username insertPassword:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) password;
</span><span style="color: #008000;">//</span><span style="color: #008000;">查询表</span><span style="color: #008000;">
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)checkIfHasUser; </span></strong><span style="color: #000000;">

@end

</span></div>
</div>
我们的代码文件如下。
<div class="code">
<div><span style="color: #000000;">#import </span><span style="color: #800000;">"</span><span style="color: #800000;">SqliteHelper.h</span><span style="color: #800000;">"</span><span style="color: #000000;">

@implementation SqliteHelper

</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)createTable
{
NSArray </span><span style="color: #000000;">*</span><span style="color: #000000;">path </span><span style="color: #000000;">=</span><span style="color: #000000;"> NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">paths </span><span style="color: #000000;">=</span><span style="color: #000000;"> [[path objectAtIndex:</span><span style="color: #800080;">0</span><span style="color: #000000;">] stringByAppendingPathComponent:kFileName];
NSFileManager </span><span style="color: #000000;">*</span><span style="color: #000000;">fileManager </span><span style="color: #000000;">=</span><span style="color: #000000;"> [NSFileManager defaultManager];
BOOL fileFinded </span><span style="color: #000000;">=</span><span style="color: #000000;"> [fileManager fileExistsAtPath:paths];

NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Database file path is %@</span><span style="color: #800000;">"</span><span style="color: #000000;">,paths);

</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(fileFinded)
{
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Database file existed</span><span style="color: #800000;">"</span><span style="color: #000000;">);

</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_open([paths UTF8String],</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">database)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)
{
sqlite3_close(database);
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Open Failed</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Database file is not existed</span><span style="color: #800000;">"</span><span style="color: #000000;">);

</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_open([paths UTF8String],</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">database)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)
{
sqlite3_close(database);
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Open Failed</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}
}

</span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">errorMsg;

NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">createSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@"</span><span style="color: #800000;">create table if not exists fields (userid integer primary key,username text,password text)</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)
{
sqlite3_close(database);
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Open failed or init filed</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}

</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;
}

</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)insertMainTable:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) username insertPassword:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) password
{
</span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">errorMsg;

NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">createSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@"</span><span style="color: #800000;">create table if not exists fields (userid integer primary key,username text,password text)</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)
{
sqlite3_close(database);
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Open failed or init filed</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}

NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">insertData </span><span style="color: #000000;">=</span><span style="color: #000000;"> [[NSString alloc] initWithFormat:</span><span style="color: #800000;">@"</span><span style="color: #800000;">insert or replace into fields (userid,username,password) values (%d,'%@','%@')</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800080;">0</span><span style="color: #000000;">,username,password];

</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[insertData UTF8String],NULL,NULL,</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)
{
sqlite3_close(database);
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Open failed or failed to insert</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}

</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;
}

</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)checkIfHasUser
{
NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">getUserCountSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@"</span><span style="color: #800000;">select * from fields</span><span style="color: #800000;">"</span><span style="color: #000000;">;
sqlite3_stmt </span><span style="color: #000000;">*</span><span style="color: #000000;">statement;

NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">checkIfHasUser</span><span style="color: #800000;">"</span><span style="color: #000000;">);

</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_prepare_v2(database,[getUserCountSQL UTF8String],</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">&#38;</span><span style="color: #000000;">statement,nil)</span><span style="color: #000000;">==</span><span style="color: #000000;">SQLITE_OK)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">while(sqlite3_step(statement) == SQLITE_ROW)
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> int row = sqlite3_column_int(statement,0);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> char* rowData = (char*)sqlite3_column_text(statement,2);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSString *fieldName = [[NSString alloc] initWithFormat:@"show%d",row];
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
</span><span style="color: #008000;">//</span><span style="color: #008000;">
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSLog(@"fieldName is :%@,fieldValue is :%@",fieldName,fieldValue);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> return [[NSString alloc] initWithFormat:@"fieldName is :%@,fieldValue is :%@",fieldName,fieldValue];
</span><span style="color: #008000;">//</span><span style="color: #008000;">
</span><span style="color: #008000;">//</span><span style="color: #008000;"> [fieldName release];
</span><span style="color: #008000;">//</span><span style="color: #008000;"> [fieldValue release];
</span><span style="color: #008000;">//</span><span style="color: #008000;">}
</span><span style="color: #008000;">//</span><span style="color: #008000;">sqlite3_finalize(statement);</span><span style="color: #008000;">
</span><span style="color: #000000;">
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_step(statement) </span><span style="color: #000000;">==</span><span style="color: #000000;"> SQLITE_ROW)
{
NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">Have user</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;
}
}

NSLog(</span><span style="color: #800000;">@"</span><span style="color: #800000;">No user</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;
}

@end

</span></div>
</div>
其中checkIfHasUser是检查数据，这个方法中我注释的是得到数据，因为我们这里只是check，所以不需要得到数据，直接看是否存在数据即可。上面的代码虽然没有过多的注释，但是代码本身已经很简单了，上下文也非常清楚，所以我就不写过多的注释了。]]></description>
			<content:encoded><![CDATA[<p>在开发应用程序的时候，当然需要经常的实用数据库进行数据的保存了，在移动设备上，我们可以使用文件，数据库等方式去保存，为了能够让用户无法使用其他的程序去修改，我这里认为使用数据库的方式是一个很好的方式。在iPhone上面，我们可以使用SQLite进行数据的持久化。另外值得一提的是Firefox是使用数据库的方式保存的，同样也是SQLite。</p>
<p>在iPhone开发重，我们需要首先添加一个SQLite的库，XCode本身就支持的，我们在左边的Frameworks里面选择Add，然后选择Existing Frameworks，在弹出窗口中选择SQLite的库libsqlite3.0.dylib。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/sqlite.png" alt="" style="border:none;background:transparent"/></p>
<p>添加之后，我们就可以使用SQLite在iPhone中进行数据的保存，查询，删除等操作了。</p>
<p>现在我们可以写一个SQLite的Helper文件，方便我们在其他的代码中使用，头文件（SqliteHelper.h）如下。</p>
<div class="code">
<div><span style="color: #000000;">#import </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Foundation</span><span style="color: #000000;">/</span><span style="color: #000000;">Foundation.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><strong><span style="color: #000000;">#import </span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">sqlite3.h</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> kFileName @&#8221;mydatabase.sql&#8221;</span><span style="color: #000000;"> </span></strong><span style="color: #000000;"></p>
<p>@interface SqliteHelper : NSObject {</p>
<p></span><strong><span style="color: #000000;">sqlite3 </span><span style="color: #000000;">*</span><span style="color: #000000;">database; </span></strong><span style="color: #000000;"><br />
}</p>
<p></span><strong><span style="color: #008000;">//</span><span style="color: #008000;">创建表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)createTable;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">插入数据</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)insertMainTable:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) username insertPassword:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) password;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">查询表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)checkIfHasUser; </span></strong><span style="color: #000000;"></p>
<p>@end</p>
<p></span></div>
</div>
<p>我们的代码文件如下。</p>
<div class="code">
<div><span style="color: #000000;">#import </span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">SqliteHelper.h</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;"></p>
<p>@implementation SqliteHelper</p>
<p></span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)createTable<br />
{<br />
NSArray </span><span style="color: #000000;">*</span><span style="color: #000000;">path </span><span style="color: #000000;">=</span><span style="color: #000000;"> NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">paths </span><span style="color: #000000;">=</span><span style="color: #000000;"> [[path objectAtIndex:</span><span style="color: #800080;">0</span><span style="color: #000000;">] stringByAppendingPathComponent:kFileName];<br />
NSFileManager </span><span style="color: #000000;">*</span><span style="color: #000000;">fileManager </span><span style="color: #000000;">=</span><span style="color: #000000;"> [NSFileManager defaultManager];<br />
BOOL fileFinded </span><span style="color: #000000;">=</span><span style="color: #000000;"> [fileManager fileExistsAtPath:paths];</p>
<p>NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Database file path is %@</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">,paths);</p>
<p></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(fileFinded)<br />
{<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Database file existed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_open([paths UTF8String],</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">database)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Open Failed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}<br />
}<br />
</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
{<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Database file is not existed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_open([paths UTF8String],</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">database)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Open Failed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}<br />
}</p>
<p></span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">errorMsg;</p>
<p>NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">createSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">create table if not exists fields (userid integer primary key,username text,password text)</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Open failed or init filed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}</p>
<p></span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;<br />
}</p>
<p></span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)insertMainTable:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) username insertPassword:(NSString</span><span style="color: #000000;">*</span><span style="color: #000000;">) password<br />
{<br />
</span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">errorMsg;</p>
<p>NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">createSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">create table if not exists fields (userid integer primary key,username text,password text)</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Open failed or init filed</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}</p>
<p>NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">insertData </span><span style="color: #000000;">=</span><span style="color: #000000;"> [[NSString alloc] initWithFormat:</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">insert or replace into fields (userid,username,password) values (%d,&#8217;%@&#8217;,'%@&#8217;)</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">,</span><span style="color: #800080;">0</span><span style="color: #000000;">,username,password];</p>
<p></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_exec(database,[insertData UTF8String],NULL,NULL,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">errorMsg)</span><span style="color: #000000;">!=</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Open failed or failed to insert</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}</p>
<p></span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;<br />
}</p>
<p></span><span style="color: #000000;">-</span><span style="color: #000000;"> (BOOL)checkIfHasUser<br />
{<br />
NSString </span><span style="color: #000000;">*</span><span style="color: #000000;">getUserCountSQL </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">select * from fields</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">;<br />
sqlite3_stmt </span><span style="color: #000000;">*</span><span style="color: #000000;">statement;</p>
<p>NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">checkIfHasUser</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_prepare_v2(database,[getUserCountSQL UTF8String],</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">statement,nil)</span><span style="color: #000000;">==</span><span style="color: #000000;">SQLITE_OK)<br />
{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">while(sqlite3_step(statement) == SQLITE_ROW)<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> int row = sqlite3_column_int(statement,0);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> char* rowData = (char*)sqlite3_column_text(statement,2);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSString *fieldName = [[NSString alloc] initWithFormat:@&#8221;show%d&#8221;,row];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> NSLog(@&#8221;fieldName is :%@,fieldValue is :%@&#8221;,fieldName,fieldValue);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> return [[NSString alloc] initWithFormat:@&#8221;fieldName is :%@,fieldValue is :%@&#8221;,fieldName,fieldValue];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> [fieldName release];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"> [fieldValue release];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">}<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">sqlite3_finalize(statement);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sqlite3_step(statement) </span><span style="color: #000000;">==</span><span style="color: #000000;"> SQLITE_ROW)<br />
{<br />
NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">Have user</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> YES;<br />
}<br />
}</p>
<p>NSLog(</span><span style="color: #800000;">@&#8221;</span><span style="color: #800000;">No user</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NO;<br />
}</p>
<p>@end</p>
<p></span></div>
</div>
<p>其中checkIfHasUser是检查数据，这个方法中我注释的是得到数据，因为我们这里只是check，所以不需要得到数据，直接看是否存在数据即可。上面的代码虽然没有过多的注释，但是代码本身已经很简单了，上下文也非常清楚，所以我就不写过多的注释了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/171/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; 多窗体应用：创建新窗体</title>
		<link>http://www.jguoer.com/blog/index.php/archives/176</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/176#comments</comments>
		<pubDate>Mon, 18 Jan 2010 13:41:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/01/18/iPhone-Development-Mutiple-Window-Based-Application-Create-New-Window-And-Open-New-Window.aspx</guid>
		<description><![CDATA[<p>在上一篇文章中我们知道了如何去手动的写一个窗体，写一个默认的Controller并连接MVC这三个模块，在我们了解了之后，我们就能够通过一种方式去创建一个新窗体了，例如当我们希望在主窗体中按一个按钮打开一个新窗体的时候，我们就需要手动的去创建一个新窗体，首先，我们先把MainWindow的界面做成如下图所示。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/main.png" alt="" style="border:none;background:transparent"/></p>
<p>然后我们再在MainWindowController头文件中写下如下代码，去连接我们的代码和UI。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@interface MainWindowController : UIViewController { <br />
&#160;&#160;&#160;&#160;</span><strong><span style="color: rgb(0, 0, 0);">IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; </span></strong><span style="color: rgb(0, 0, 0);"><br />
} <br />
</span><strong><span style="color: rgb(0, 0, 0);"><br />
@property (retain,nonatomic) IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; </span></strong><span style="color: rgb(0, 0, 0);"><br />
</span></div>
<div><strong><span style="color: rgb(0, 0, 0);">- (IBAction)buttonClicked:(id)sender</span></strong></div>
<div><span style="color: rgb(0, 0, 0);"><br />
@end</span></div>
</div>
<p>然后我们在内容文件中写下如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">@implementation MainWindowController <br />
<br />
<strong>@synthesize button; </strong><br />
<br />
</span><strong><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ <br />
<br />
}</span></strong></div>
</div>
<p>我们上面的代码写了一个button控件，然后实现了，然后还写了事件，现在我们只要连接控件ui和事件就可以了。如下图，我们先连接我们的UI到控件（记住按住control），让编译器知道我们这个按钮是我们上面写的button。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/mainconnect.png" /></p>
<p>连接完之后，我们还需要反向的连接一下，我们按住control，然后从button的事件中，选中Touch Up Inside，然后拖动到Main Window Controller中，然后选中buttonClicked，就连接了按钮的事件。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/eventconnect.png" alt="" /></p>
<p>这样，我们就连接MainWindow和MainWindowController，现在我们就要先创建一个新的窗口，然后再通过这个按钮事件去打开一个新窗口，所以我们先创建一个新窗口并取名叫MyMainWindow。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addLibFile.png" alt="" style="border:none;background:transparent"/></p>
<p style="text-align: left;">我们在资源文件中添加一个新的View XIB文件，然后打开这个文件，编写一个基本的UI，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/newwindow.png" style="border:none;background:transparent"/></p>
<p>新的窗口创建好了之后我们就要为新的窗口写Controller文件，例如我们可以创建一个新的类叫MyMainWindowController，记住我们这里一定要创建一个继承自UI的应用类文件并取名叫MyMainWindowController。虽然没有说名字非要取MyMainWindowController，但是这样取名是非常有必要也有好处的，我们能够一眼就知道这个UI是哪个Controller去控制的。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/newcfile.png" alt="" style="border:none;background:transparent"/></p>
<p>在创建好之后，我们再编辑MyMainWindow，在NIB窗口中，我们打开File's Owner，然后在类中，选择我们的Controller，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/fileowner.png" /></p>
<p style="text-align: left;">当打开时，有可能是默认继承自NSObject的，也有可能是MainWindowController，这里我们需要选的是MyMainWindowController，所以上面这个图是没有选择的，我们只需要在Class中选择相应的Controller即可，不过这里优先级不高。</p>
<p style="text-align: left;">当我们连接好UI和类文件之后，我们就创建了一个新的窗口，但是这里值得注意的有几点。</p>
<p style="text-align: left;"><strong>我们编写多窗口应用和创建View-based应用程序是不同的，我们创建的是Window-based应用程序。<br />
</strong></p>
<p style="text-align: left;"><strong>View-based默认创建了一个View并默认连接了，而Window-based默认创建的是应用程序委托（相当于定义了main函数），并连接了。<br />
</strong></p>
<p style="text-align: left;"><strong>因为Window-based是应用程序委托，所以要自己写Controller。<br />
</strong></p>
<p style="text-align: left;"><strong>Window-based默认的Controller连接的是应用程序委托，所以要创建View的实例，连接Controller。<br />
</strong></p>
<p style="text-align: left;"><strong>我们创建的View-based窗口（这里不是程序），不是连接委托，所以直接使用File's Owner即可连接Controller。</strong></p>
<p style="text-align: left;">大概了解了这些之后，我们就可以写按钮事件去打开新窗口了，代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
<strong>@class MyMainWindowController; </strong><br />
<br />
@interface MainWindowController : UIViewController { <br />
&#160;&#160;&#160;&#160;IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; <br />
&#160;&#160;&#160;&#160;</span><strong><span style="color: rgb(0, 0, 0);">MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mywindow;</span></strong><span style="color: rgb(0, 0, 0);"> <br />
} <br />
<br />
@property (retain,nonatomic) IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; <br />
</span><strong><span style="color: rgb(0, 0, 0);">@property (retain,nonatomic) MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mywindow;</span></strong><span style="color: rgb(0, 0, 0);"> <br />
<br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender; <br />
<br />
@end</span></div>
</div>
<p>写完头文件之后，我们还要写实现。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">MainWindowController.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><strong><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">MyMainWindowController.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> </span></strong><span style="color: rgb(0, 0, 0);"><br />
<br />
<br />
@implementation MainWindowController <br />
<br />
@synthesize button; <br />
<strong>@synthesize mywindow;</strong> <br />
<br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ <br />
&#160;&#160;&#160;&#160;</span><strong><span style="color: rgb(0, 0, 0);">MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">controller </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[MyMainWindowController alloc] initWithNibName:</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">MyMainWindow</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> bundle:nil]; <br />
&#160;&#160;&#160;&#160; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(self.mywindow </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> nil) <br />
&#160;&#160;&#160;&#160;{ <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;self.mywindow </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> controller; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[self.view addSubview:controller.view]; <br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[controller release]; <br />
&#160;&#160;&#160;&#160;} </span></strong><span style="color: rgb(0, 0, 0);"><br />
}</span></div>
</div>
<p>写完之后，我们就Build and GO GO GO，然后我们单击按钮，是不是就可以打开新的窗口了？是不是有点晕呼呼的，说实话把，我自己一开始看这东西的时候也觉得很麻烦，其实用会了之后，也不是那么麻烦了。</p>
<p><strong>代码下载<br />
</strong></p>
<p><a href="/blog/wp-content/uploads/2010/1/Window2.zip"><strong>Window2.zip (590.07 kb)</strong></a></p>]]></description>
			<content:encoded><![CDATA[<p>在上一篇文章中我们知道了如何去手动的写一个窗体，写一个默认的Controller并连接MVC这三个模块，在我们了解了之后，我们就能够通过一种方式去创建一个新窗体了，例如当我们希望在主窗体中按一个按钮打开一个新窗体的时候，我们就需要手动的去创建一个新窗体，首先，我们先把MainWindow的界面做成如下图所示。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/main.png" alt="" style="border:none;background:transparent"/></p>
<p>然后我们再在MainWindowController头文件中写下如下代码，去连接我们的代码和UI。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@interface MainWindowController : UIViewController { <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; </span></strong><span style="color: rgb(0, 0, 0);"><br />
} <br />
</span><strong><span style="color: rgb(0, 0, 0);"><br />
@property (retain,nonatomic) IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; </span></strong><span style="color: rgb(0, 0, 0);"><br />
</span></div>
<div><strong><span style="color: rgb(0, 0, 0);">- (IBAction)buttonClicked:(id)sender</span></strong></div>
<div><span style="color: rgb(0, 0, 0);"><br />
@end</span></div>
</div>
<p>然后我们在内容文件中写下如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">@implementation MainWindowController </p>
<p><strong>@synthesize button; </strong></p>
<p></span><strong><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ </p>
<p>}</span></strong></div>
</div>
<p>我们上面的代码写了一个button控件，然后实现了，然后还写了事件，现在我们只要连接控件ui和事件就可以了。如下图，我们先连接我们的UI到控件（记住按住control），让编译器知道我们这个按钮是我们上面写的button。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/mainconnect.png" /></p>
<p>连接完之后，我们还需要反向的连接一下，我们按住control，然后从button的事件中，选中Touch Up Inside，然后拖动到Main Window Controller中，然后选中buttonClicked，就连接了按钮的事件。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/eventconnect.png" alt="" /></p>
<p>这样，我们就连接MainWindow和MainWindowController，现在我们就要先创建一个新的窗口，然后再通过这个按钮事件去打开一个新窗口，所以我们先创建一个新窗口并取名叫MyMainWindow。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addLibFile.png" alt="" style="border:none;background:transparent"/></p>
<p style="text-align: left;">我们在资源文件中添加一个新的View XIB文件，然后打开这个文件，编写一个基本的UI，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/newwindow.png" style="border:none;background:transparent"/></p>
<p>新的窗口创建好了之后我们就要为新的窗口写Controller文件，例如我们可以创建一个新的类叫MyMainWindowController，记住我们这里一定要创建一个继承自UI的应用类文件并取名叫MyMainWindowController。虽然没有说名字非要取MyMainWindowController，但是这样取名是非常有必要也有好处的，我们能够一眼就知道这个UI是哪个Controller去控制的。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/newcfile.png" alt="" style="border:none;background:transparent"/></p>
<p>在创建好之后，我们再编辑MyMainWindow，在NIB窗口中，我们打开File&#8217;s Owner，然后在类中，选择我们的Controller，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/fileowner.png" /></p>
<p style="text-align: left;">当打开时，有可能是默认继承自NSObject的，也有可能是MainWindowController，这里我们需要选的是MyMainWindowController，所以上面这个图是没有选择的，我们只需要在Class中选择相应的Controller即可，不过这里优先级不高。</p>
<p style="text-align: left;">当我们连接好UI和类文件之后，我们就创建了一个新的窗口，但是这里值得注意的有几点。</p>
<p style="text-align: left;"><strong>我们编写多窗口应用和创建View-based应用程序是不同的，我们创建的是Window-based应用程序。<br />
</strong></p>
<p style="text-align: left;"><strong>View-based默认创建了一个View并默认连接了，而Window-based默认创建的是应用程序委托（相当于定义了main函数），并连接了。<br />
</strong></p>
<p style="text-align: left;"><strong>因为Window-based是应用程序委托，所以要自己写Controller。<br />
</strong></p>
<p style="text-align: left;"><strong>Window-based默认的Controller连接的是应用程序委托，所以要创建View的实例，连接Controller。<br />
</strong></p>
<p style="text-align: left;"><strong>我们创建的View-based窗口（这里不是程序），不是连接委托，所以直接使用File&#8217;s Owner即可连接Controller。</strong></p>
<p style="text-align: left;">大概了解了这些之后，我们就可以写按钮事件去打开新窗口了，代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p><strong>@class MyMainWindowController; </strong></p>
<p>@interface MainWindowController : UIViewController { <br />
&nbsp;&nbsp;&nbsp;&nbsp;IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mywindow;</span></strong><span style="color: rgb(0, 0, 0);"> <br />
} </p>
<p>@property (retain,nonatomic) IBOutlet UIButton </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">button; <br />
</span><strong><span style="color: rgb(0, 0, 0);">@property (retain,nonatomic) MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mywindow;</span></strong><span style="color: rgb(0, 0, 0);"> </p>
<p></span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender; </p>
<p>@end</span></div>
</div>
<p>写完头文件之后，我们还要写实现。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">MainWindowController.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><strong><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">MyMainWindowController.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </span></strong><span style="color: rgb(0, 0, 0);"></p>
<p>
@implementation MainWindowController </p>
<p>@synthesize button; <br />
<strong>@synthesize mywindow;</strong> </p>
<p></span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonClicked:(id)sender <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">MyMainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">controller </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[MyMainWindowController alloc] initWithNibName:</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">MyMainWindow</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> bundle:nil]; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(self.mywindow </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> nil) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.mywindow </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> controller; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.view addSubview:controller.view]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[controller release]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} </span></strong><span style="color: rgb(0, 0, 0);"><br />
}</span></div>
</div>
<p>写完之后，我们就Build and GO GO GO，然后我们单击按钮，是不是就可以打开新的窗口了？是不是有点晕呼呼的，说实话把，我自己一开始看这东西的时候也觉得很麻烦，其实用会了之后，也不是那么麻烦了。</p>
<p><strong>代码下载<br />
</strong></p>
<p><a href="/blog/wp-content/uploads/2010/1/Window2.zip"><strong>Window2.zip (590.07 kb)</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/176/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; 多窗体应用：编写主窗口</title>
		<link>http://www.jguoer.com/blog/index.php/archives/178</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/178#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:20:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/01/17/iPhone-Development-Mutiple-Window-Based-Application-Create-Main-Window-Controller.aspx</guid>
		<description><![CDATA[<p>当我们想开发基于多窗体的应用程序的时候，我们就需要使用多窗体的应用程序模板去开发，当然，这个时候我们就要去自己写一些窗体的应用开发了，所以在写多窗体应用程序开发的时候，我们首先要手动的去写一个窗体，于是我们就要创建一个Window-Based应用程序。我们按照下图创建一个Window-Based应用程序，并命名叫Window。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/windowbased1.png" style="border:none;background:transparent"/></p>
<p>创建完成后我们可以看到系统给我们创建的模板的东西很少，就只有一个WindowAppDelegate.h和WindowAppDelegate.m，这两个文件，由于前面我们说了iPhone是基于MVC模型开发的，所以在这里，我们的Delegate委托只是用于调用一个Controller而已，例如前面的项目中MainWindow调用了HelloWorldController一样，只是不同的是现在我们要自己写Controller。不过，在自己写之前，我们还要更改委托类的代码。我们首先添加一个Controller，我们就命名为MainWindowController。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addUIcontroller.png" alt="" style="border:none;background:transparent"/></p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/addClassName.png" style="border:none;background:transparent"/></p>
<p>创建好之后，我们就可以在代码中更改如下代码了，我们可以给.h和.m代码分别更改如下（加粗为更改的代码）。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
<strong>@class MainWindowController; </strong><br />
<br />
@interface WindowAppDelegate : NSObject </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">UIApplicationDelegate</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> { <br />
&#160;&#160;&#160;&#160;UIWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window; <br />
&#160;&#160;&#160;&#160;</span><strong><span style="color: rgb(0, 0, 0);">IBOutlet MainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mainWindow; </span></strong><span style="color: rgb(0, 0, 0);"><br />
} <br />
<br />
@property (nonatomic, retain) IBOutlet UIWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window; <br />
<strong>@property (nonatomic, retain) IBOutlet MainWindowController *mainWindow; </strong><br />
<br />
@end</span></div>
</div>
<p>然后编写实现的类，代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">WindowAppDelegate.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><strong><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">MainWindowController.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> </span></strong><span style="color: rgb(0, 0, 0);"><br />
<br />
@implementation WindowAppDelegate <br />
<br />
@synthesize window; <br />
<strong>@synthesize mainWindow;</strong> <br />
<br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">)applicationDidFinishLaunching:(UIApplication </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)application {&#160;&#160;&#160;&#160; <br />
<br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Override point for customization after application launch</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;<strong>[window addSubview:mainWindow.view];</strong> <br />
&#160;&#160;&#160;&#160;[window makeKeyAndVisible]; <br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">)dealloc { <br />
&#160;&#160;&#160;&#160;<strong>[mainWindow release];</strong> <br />
&#160;&#160;&#160;&#160;[window release]; <br />
&#160;&#160;&#160;&#160;[super dealloc]; <br />
}<br />
<br />
@end</span></div>
</div>
<p>这样，在开始主程序的时候会通过MainWindowController打开窗体，现在，我们要连接MainWindow.xib到我们的MainWindowController。首先我们打开MainWindowController，我们可以看到一个主窗口，打开之后我们需要为主窗口增加一个View，我们可以双击下面的View Controller图标，创建一个类似灰色图形区域的View实例。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addview.png" alt="" /></p>
<p>双击上面的View控制器添加，如果双击不起作用，可以关闭当前Interface Builder然后再打开，双击后可以看到如下图所示的窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/addedview.png" style="border:none;background:transparent"/></p>
<p>当我们创建好之后，可以在身份检查器中看到该View的类的定义，而且也可以看到MainWindow.xib的控制窗体中增加了一个Main Window Controller图标，我们可以点击上面的View，也可以点击图标，然后在类定义中选择我们刚才创建的类MainWindowController，如下图所示。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/changeClass.png" alt="" /></p>
<p>更改了类名称之后，就是告诉MainWindow.lib连接MainWindowController这个类，这样这个UI就知道如何去使用类了。</p>
<p>这里还需要指出的是，我们这里添加了一个View的实例到MainWindow，然后更改了View这个实例的类的连接，所以我们只需要在MainWindowController下面去更改任何代码，即可以实现我们想要的效果了，如添加事件等等。我们可以看到我们的控制窗口如下。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/controlWindow.png" style="border:none;background:transparent"/></p>
<p>我们右键点击File's Owner，可以看到File's Owner是连接自WindowAppDelegate的，而新的Main Window Controller才是我们真正需要连接的类，这里可能有点难以理解，但是必须要理解这个地方。和前面的基于View的应用程序不同，主窗体是通过AppDelegate去启动的，启动之后，我们创建了View的实例并连接到了View的类（Controller）。所以Main Window Controller才是我们的Controller对象，和单独的View的窗体不同，这点我会在后面再解释。</p>
<p>在连接了之后，我们还需要将deletegate连接到Main Window Controller，我们只需要按住Control然后将Window App Delegate拖到Main Window Controller即可，如下操作。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/connectDelegate.png" alt="" /></p>
<p>在小的灰色窗口中我们选择mainWindow，也就是我们在WindowAppDelegate中写的MainWindowController的实例，可以看前面的代码段。这样我们就连接了UI，MainWindowController和AppDelegate了，是不是感觉很难理解？确实，我自己也觉得有点难理解。</p>
<p>连接好之后，我们运行应用程序，就会发现，打开的窗口就是我们新写的View的实例了，在开发中，我们就为我们的MainWindow写了一个MainWindowController并连接了，这样就可以使用MainWindowController去更改我们的MainWindow的UI和相应的事件了。</p>
<p>总结这个步骤：</p>
<ul>
    <li>创建Window-based应用程序。</li>
    <li>创建MainWindowController。</li>
    <li>更改AppDelegate代码，引用MainWindowController。</li>
    <li>打开MainWindow.lib，并增加一个新View的实例。</li>
    <li>更改新View的Class。</li>
    <li>连接Delegate到新View。</li>
</ul>
<p>通过上面几个步骤，我们就编写了主窗口。</p>
<p>在编写了主窗口之后，我们才能考虑如何去编写多窗体的应用程序。</p>
<p><strong>示例代码<br />
</strong></p>
<p><a href="/blog/wp-content/uploads/2010/1/Window.zip"><strong>Window.zip (559.15 kb)</strong></a></p>]]></description>
			<content:encoded><![CDATA[<p>当我们想开发基于多窗体的应用程序的时候，我们就需要使用多窗体的应用程序模板去开发，当然，这个时候我们就要去自己写一些窗体的应用开发了，所以在写多窗体应用程序开发的时候，我们首先要手动的去写一个窗体，于是我们就要创建一个Window-Based应用程序。我们按照下图创建一个Window-Based应用程序，并命名叫Window。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/windowbased1.png" style="border:none;background:transparent"/></p>
<p>创建完成后我们可以看到系统给我们创建的模板的东西很少，就只有一个WindowAppDelegate.h和WindowAppDelegate.m，这两个文件，由于前面我们说了iPhone是基于MVC模型开发的，所以在这里，我们的Delegate委托只是用于调用一个Controller而已，例如前面的项目中MainWindow调用了HelloWorldController一样，只是不同的是现在我们要自己写Controller。不过，在自己写之前，我们还要更改委托类的代码。我们首先添加一个Controller，我们就命名为MainWindowController。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addUIcontroller.png" alt="" style="border:none;background:transparent"/></p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/addClassName.png" style="border:none;background:transparent"/></p>
<p>创建好之后，我们就可以在代码中更改如下代码了，我们可以给.h和.m代码分别更改如下（加粗为更改的代码）。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p><strong>@class MainWindowController; </strong></p>
<p>@interface WindowAppDelegate : NSObject </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">UIApplicationDelegate</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> { <br />
&nbsp;&nbsp;&nbsp;&nbsp;UIWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0, 0, 0);">IBOutlet MainWindowController </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">mainWindow; </span></strong><span style="color: rgb(0, 0, 0);"><br />
} </p>
<p>@property (nonatomic, retain) IBOutlet UIWindow </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">window; <br />
<strong>@property (nonatomic, retain) IBOutlet MainWindowController *mainWindow; </strong></p>
<p>@end</span></div>
</div>
<p>然后编写实现的类，代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">WindowAppDelegate.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><strong><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">MainWindowController.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </span></strong><span style="color: rgb(0, 0, 0);"></p>
<p>@implementation WindowAppDelegate </p>
<p>@synthesize window; <br />
<strong>@synthesize mainWindow;</strong> </p>
<p></span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">)applicationDidFinishLaunching:(UIApplication </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)application {&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Override point for customization after application launch</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<strong>[window addSubview:mainWindow.view];</strong> <br />
&nbsp;&nbsp;&nbsp;&nbsp;[window makeKeyAndVisible]; <br />
}</p>
<p></span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">)dealloc { <br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>[mainWindow release];</strong> <br />
&nbsp;&nbsp;&nbsp;&nbsp;[window release]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc]; <br />
}</p>
<p>@end</span></div>
</div>
<p>这样，在开始主程序的时候会通过MainWindowController打开窗体，现在，我们要连接MainWindow.xib到我们的MainWindowController。首先我们打开MainWindowController，我们可以看到一个主窗口，打开之后我们需要为主窗口增加一个View，我们可以双击下面的View Controller图标，创建一个类似灰色图形区域的View实例。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/addview.png" alt="" /></p>
<p>双击上面的View控制器添加，如果双击不起作用，可以关闭当前Interface Builder然后再打开，双击后可以看到如下图所示的窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/addedview.png" style="border:none;background:transparent"/></p>
<p>当我们创建好之后，可以在身份检查器中看到该View的类的定义，而且也可以看到MainWindow.xib的控制窗体中增加了一个Main Window Controller图标，我们可以点击上面的View，也可以点击图标，然后在类定义中选择我们刚才创建的类MainWindowController，如下图所示。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/changeClass.png" alt="" /></p>
<p>更改了类名称之后，就是告诉MainWindow.lib连接MainWindowController这个类，这样这个UI就知道如何去使用类了。</p>
<p>这里还需要指出的是，我们这里添加了一个View的实例到MainWindow，然后更改了View这个实例的类的连接，所以我们只需要在MainWindowController下面去更改任何代码，即可以实现我们想要的效果了，如添加事件等等。我们可以看到我们的控制窗口如下。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/controlWindow.png" style="border:none;background:transparent"/></p>
<p>我们右键点击File&#8217;s Owner，可以看到File&#8217;s Owner是连接自WindowAppDelegate的，而新的Main Window Controller才是我们真正需要连接的类，这里可能有点难以理解，但是必须要理解这个地方。和前面的基于View的应用程序不同，主窗体是通过AppDelegate去启动的，启动之后，我们创建了View的实例并连接到了View的类（Controller）。所以Main Window Controller才是我们的Controller对象，和单独的View的窗体不同，这点我会在后面再解释。</p>
<p>在连接了之后，我们还需要将deletegate连接到Main Window Controller，我们只需要按住Control然后将Window App Delegate拖到Main Window Controller即可，如下操作。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/connectDelegate.png" alt="" /></p>
<p>在小的灰色窗口中我们选择mainWindow，也就是我们在WindowAppDelegate中写的MainWindowController的实例，可以看前面的代码段。这样我们就连接了UI，MainWindowController和AppDelegate了，是不是感觉很难理解？确实，我自己也觉得有点难理解。</p>
<p>连接好之后，我们运行应用程序，就会发现，打开的窗口就是我们新写的View的实例了，在开发中，我们就为我们的MainWindow写了一个MainWindowController并连接了，这样就可以使用MainWindowController去更改我们的MainWindow的UI和相应的事件了。</p>
<p>总结这个步骤：</p>
<ul>
<li>创建Window-based应用程序。</li>
<li>创建MainWindowController。</li>
<li>更改AppDelegate代码，引用MainWindowController。</li>
<li>打开MainWindow.lib，并增加一个新View的实例。</li>
<li>更改新View的Class。</li>
<li>连接Delegate到新View。</li>
</ul>
<p>通过上面几个步骤，我们就编写了主窗口。</p>
<p>在编写了主窗口之后，我们才能考虑如何去编写多窗体的应用程序。</p>
<p><strong>示例代码<br />
</strong></p>
<p><a href="/blog/wp-content/uploads/2010/1/Window.zip"><strong>Window.zip (559.15 kb)</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/178/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; Object-c Base64编码问题</title>
		<link>http://www.jguoer.com/blog/index.php/archives/180</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/180#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:07:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/01/16/iPhone-Development-Object-C-Base64-Encode-And-Decode.aspx</guid>
		<description><![CDATA[<p>这两天开始着手写嘀咕的iPhone应用程序，一是现在的iPhone应用程序不符合我的要求（我自己使用的一个底线，ui功能等），另一方面也是更重要的一个方面就是锻炼iPhone库的熟练度，和一些开发平台方面的测试了。</p>
<p>在写嘀咕这个程序的时候，需要从Web Open API得到一些信息，我发我的身份给服务器，那么服务器就会验证然后返回信息给我，那么我就可以得到消息了。但是大部分的这种API都是通过username:password再base64一下就可以了，但是Object-c里没有默认的base64的库，那么，我们就需要自己去查了。</p>
<p>于是我查，顺带就要说一句，真的很难查，还有很多国内的博客作者极度不负责任，转载文章不说，转载一半不说，不能运行不说，用了其他的库也不说明一下，害我浪费了3个小时找这个base64的算法，自己写肯定不太可能，不是能力问题，是时间问题，最后发现Google有一个库，可以提供使用。</p>
<p>我这里保证现在是绝对没有问题，而且非常方便容易使用，可不是给你两个函数让你自己去琢磨怎么使用。</p>
<p>下载下面的base64.zip然后皆压缩放到你的项目里面。</p>
<p>然后我们自己写一个方法去调用即可，很简单，我自己封装了一个类去做，这样对我来说，库里的函数就比较透明了，当然也不是必须的。在我当前机器上可以使用，如果有问题请联系我。&#160;</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">.h文件，默认即可</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">Foundation</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">Foundation.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@interface Utility : NSObject { <br />
<br />
} <br />
<br />
</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)encodeBase64:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)input; <br />
<br />
@end</span></div>
</div>
<p>上面是头文件，下面是代码文件，我这样写是方便理解，可以自己把这个方法写到任意代码里都行。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">Utility.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">使用头文件</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">GTMBase64.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@implementation Utility <br />
<br />
</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)encodeBase64:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)input <br />
{ <br />
&#160;&#160;&#160;&#160;NSData </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; <br />
&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">转换到base64</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [GTMBase64 encodeData:data]; <br />
&#160;&#160;&#160; NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> base64String </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> base64String; <br />
} <br />
<br />
@end</span></div>
</div>
<p>下次需要将字符串转换成base64的时候，直接使用encodeBase64即可。</p>
<p><a href="/blog/wp-content/uploads/2010/1/base64.zip">base64.zip (10.41 kb)</a></p>]]></description>
			<content:encoded><![CDATA[<p>这两天开始着手写嘀咕的iPhone应用程序，一是现在的iPhone应用程序不符合我的要求（我自己使用的一个底线，ui功能等），另一方面也是更重要的一个方面就是锻炼iPhone库的熟练度，和一些开发平台方面的测试了。</p>
<p>在写嘀咕这个程序的时候，需要从Web Open API得到一些信息，我发我的身份给服务器，那么服务器就会验证然后返回信息给我，那么我就可以得到消息了。但是大部分的这种API都是通过username:password再base64一下就可以了，但是Object-c里没有默认的base64的库，那么，我们就需要自己去查了。</p>
<p>于是我查，顺带就要说一句，真的很难查，还有很多国内的博客作者极度不负责任，转载文章不说，转载一半不说，不能运行不说，用了其他的库也不说明一下，害我浪费了3个小时找这个base64的算法，自己写肯定不太可能，不是能力问题，是时间问题，最后发现Google有一个库，可以提供使用。</p>
<p>我这里保证现在是绝对没有问题，而且非常方便容易使用，可不是给你两个函数让你自己去琢磨怎么使用。</p>
<p>下载下面的base64.zip然后皆压缩放到你的项目里面。</p>
<p>然后我们自己写一个方法去调用即可，很简单，我自己封装了一个类去做，这样对我来说，库里的函数就比较透明了，当然也不是必须的。在我当前机器上可以使用，如果有问题请联系我。&nbsp;</p>
<div class="code">
<div><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">.h文件，默认即可</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Foundation</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">Foundation.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@interface Utility : NSObject { </p>
<p>} </p>
<p></span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)encodeBase64:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)input; </p>
<p>@end</span></div>
</div>
<p>上面是头文件，下面是代码文件，我这样写是方便理解，可以自己把这个方法写到任意代码里都行。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">Utility.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">使用头文件</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">GTMBase64.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@implementation Utility </p>
<p></span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)encodeBase64:(NSString</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)input <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;NSData </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">转换到base64</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [GTMBase64 encodeData:data]; <br />
&nbsp;&nbsp;&nbsp; NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> base64String </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> base64String; <br />
} </p>
<p>@end</span></div>
</div>
<p>下次需要将字符串转换成base64的时候，直接使用encodeBase64即可。</p>
<p><a href="/blog/wp-content/uploads/2010/1/base64.zip">base64.zip (10.41 kb)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/180/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; 添加事件</title>
		<link>http://www.jguoer.com/blog/index.php/archives/182</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/182#comments</comments>
		<pubDate>Mon, 11 Jan 2010 15:21:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[事件]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/01/11/iPhone-Development-Add-Event.aspx</guid>
		<description><![CDATA[<p>前面我们做了一个简单的iPhone的Hello World，而且我们也可以编写一个非常简单的ui的应用程序，现在我们就要想如何去连接这些ui（也就是说添加事件了），例如我想要有一个这样的效果，上面我写了一个Hello World的文本框，现在我就想要单击一个按钮，将这个文本更改，也就是触发事件。</p>
<p>iPhone里面的事件是用委托形式触发的，这个我就不多说了，我们想要得到的效果如下所示。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/result.png" style="border:none;background:transparent"/></p>
<p>虽然我们有界面编辑器，但是事件并不象VS里面单击某个控件那样会自动生成代码，我们需要编写一点代码去实现这个效果。首先我们还得回忆起来，iPhone是MVC的开发模式，于是我们直接在相应的Controller里写代码即刻，我们先在头文件中编写如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&#60;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&#62;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@interface HelloWorldViewController : UIViewController { <br />
&#160;&#160;&#160; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化一个控件</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;IBOutlet UILabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">helloworldText; <br />
} <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">定义控件这个属性</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">@property (retain,nonatomic) UILabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">helloworldText; <br />
<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">编写一个事件的代码</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonPressed:(id)sender; <br />
<br />
@end</span></div>
</div>
<p>上面是我们写的头文件的代码，这个时候我们还需要写.m，也就是代码文件的代码，来实现我们相应的要求。代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(128, 0, 0);">HelloWorldViewController.h</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);"> <br />
<br />
@implementation HelloWorldViewController <br />
<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">分配一些空间</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">@synthesize helloworldText; <br />
<br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonPressed:(id)sender <br />
{ <br />
&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化一个字符串</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&#160;&#160;&#160;&#160;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">text </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithFormat:</span><span style="color: rgb(128, 0, 0);">@&#34;</span><span style="color: rgb(128, 0, 0);">Clicked</span><span style="color: rgb(128, 0, 0);">&#34;</span><span style="color: rgb(0, 0, 0);">]; <br />
&#160;&#160;&#160;&#160;helloworldText.text </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> text; <br />
}</span></div>
</div>
<p>现在我们的头文件和代码文件都写完了，逻辑很简单，就是buttonPressed事件触发了之后执行相应的代码。</p>
<p>注意：事件的写法一般都会加一个sender，我们通过sender对象获取发送事件的对象。</p>
<p>在编写好之后，我们再打开界面编辑器，连接这些控件。</p>
<p>首先，我们按住control，拖动File's Owner，然后拖动到文本控件上，然后放开，这个时候你会看到一个灰色的小的popup，我们选择小的popup里面需要连接的对象即可，这里我们的变量名字是helloworldText，于是我们选种helloworldText。</p>
<p>选中之后，我们就添加File's Owner到ui上了，然后我们就可以添加按钮事件了，我们选择按钮，在Connections Inspect中可以看到有个很像尺子的小图标，这个图标的左边就是事件按钮了，我们选择，在需要的事件右边的小圆圈中，这个时候不需要按住control，直接点击鼠标，拖动到按钮上即可。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/event1.png" alt="" /></p>
<p>添加完成之后，我们就可以看到我们的事件已经添加完毕了。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/event2.png" /></p>
<p>这里我添加的是Touch Up Inside事件，为什么是Touch Up Inside事件呢，因为苹果为用户体验以及很多细节都做了思考，例如我们有这个按钮，当我们按下去的时候发现又不想按了（这种情况时常发生），于是我们会拖动我们的指头到外面然后放开，这个时候我们的iPhone就知道用户其实是不想按的，所以Touch Up Inside事件是不会被触发的，其他的事件同理了。我就不需要多说了。</p>
<p>然后我们选择Build and GO，看看我们的事件是不是添加成功了？：）</p>]]></description>
			<content:encoded><![CDATA[<p>前面我们做了一个简单的iPhone的Hello World，而且我们也可以编写一个非常简单的ui的应用程序，现在我们就要想如何去连接这些ui（也就是说添加事件了），例如我想要有一个这样的效果，上面我写了一个Hello World的文本框，现在我就想要单击一个按钮，将这个文本更改，也就是触发事件。</p>
<p>iPhone里面的事件是用委托形式触发的，这个我就不多说了，我们想要得到的效果如下所示。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/result.png" style="border:none;background:transparent"/></p>
<p>虽然我们有界面编辑器，但是事件并不象VS里面单击某个控件那样会自动生成代码，我们需要编写一点代码去实现这个效果。首先我们还得回忆起来，iPhone是MVC的开发模式，于是我们直接在相应的Controller里写代码即刻，我们先在头文件中编写如下代码。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">UIKit</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">UIKit.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@interface HelloWorldViewController : UIViewController { <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化一个控件</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;IBOutlet UILabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">helloworldText; <br />
} <br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">定义控件这个属性</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">@property (retain,nonatomic) UILabel </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">helloworldText; </p>
<p></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">编写一个事件的代码</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonPressed:(id)sender; </p>
<p>@end</span></div>
</div>
<p>上面是我们写的头文件的代码，这个时候我们还需要写.m，也就是代码文件的代码，来实现我们相应的要求。代码如下。</p>
<div class="code">
<div><span style="color: rgb(0, 0, 0);">#import </span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(128, 0, 0);">HelloWorldViewController.h</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);"> </p>
<p>@implementation HelloWorldViewController </p>
<p></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">分配一些空间</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">@synthesize helloworldText; </p>
<p></span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> (IBAction)buttonPressed:(id)sender <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">初始化一个字符串</span><span style="color: rgb(0, 128, 0);"> <br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;NSString </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">text </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [[NSString alloc] initWithFormat:</span><span style="color: rgb(128, 0, 0);">@&quot;</span><span style="color: rgb(128, 0, 0);">Clicked</span><span style="color: rgb(128, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;helloworldText.text </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> text; <br />
}</span></div>
</div>
<p>现在我们的头文件和代码文件都写完了，逻辑很简单，就是buttonPressed事件触发了之后执行相应的代码。</p>
<p>注意：事件的写法一般都会加一个sender，我们通过sender对象获取发送事件的对象。</p>
<p>在编写好之后，我们再打开界面编辑器，连接这些控件。</p>
<p>首先，我们按住control，拖动File&#8217;s Owner，然后拖动到文本控件上，然后放开，这个时候你会看到一个灰色的小的popup，我们选择小的popup里面需要连接的对象即可，这里我们的变量名字是helloworldText，于是我们选种helloworldText。</p>
<p>选中之后，我们就添加File&#8217;s Owner到ui上了，然后我们就可以添加按钮事件了，我们选择按钮，在Connections Inspect中可以看到有个很像尺子的小图标，这个图标的左边就是事件按钮了，我们选择，在需要的事件右边的小圆圈中，这个时候不需要按住control，直接点击鼠标，拖动到按钮上即可。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/event1.png" alt="" /></p>
<p>添加完成之后，我们就可以看到我们的事件已经添加完毕了。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/event2.png" /></p>
<p>这里我添加的是Touch Up Inside事件，为什么是Touch Up Inside事件呢，因为苹果为用户体验以及很多细节都做了思考，例如我们有这个按钮，当我们按下去的时候发现又不想按了（这种情况时常发生），于是我们会拖动我们的指头到外面然后放开，这个时候我们的iPhone就知道用户其实是不想按的，所以Touch Up Inside事件是不会被触发的，其他的事件同理了。我就不需要多说了。</p>
<p>然后我们选择Build and GO，看看我们的事件是不是添加成功了？：）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/182/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iPhone开发 &#8211; Hello World</title>
		<link>http://www.jguoer.com/blog/index.php/archives/187</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/187#comments</comments>
		<pubDate>Sun, 03 Jan 2010 11:07:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[hello world]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">/post/2010/01/03/iPhone-Development-HelloWorld.aspx</guid>
		<description><![CDATA[<p>其实我写这些技术博客，一方面是写给新手去看，这样这些新手就不会像我这样找了半天找不到国内的资源，另外一方面也是留给自己看，本来我的博客访问量也不是很大，所以，大部分还是留给自己看。=。=</p>
<p>OK，如果你喜欢做一点iPhone的开发的话，可以尝试一下，iPhone的用户体验很不错，不过最近Google的手机也是很火，这个就看自己的方向了，不过程序开发都是那样，大同小异。首先，我们必须要做的就是有一个Mac系统，然后去下载一个XCode，<a href="http://developer.apple.com/technology/xcode.html">XCode可以去这里下载</a>。</p>
<p>下载完成之后，同样，我们需要写一个Hello World来上上手，我们打开XCode，然后创建一个新的项目，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode1.png" /></p>
<p>单击New Project，我们就能够创建一个新项目，这里我们选择iPhone的Application，并且我们先选择View-based Application，iPhone的应用程序是基于MVC的开发模式开发的，也就是Model，View和Controller，也就将传统的面向对象设计分开为模型层，视图层和控制层，更加深入的MVC的概念我就不多说了，现在我们只是开始动手做一个简单的应用程序。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/xcode2.png" alt="" style="border:none;background:transparent"/></p>
<p>我们选择ViewBased Application创建一个新程序，创建好之后我们就可以看到如下窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode4.png" style="border:none;background:transparent"/></p>
<p>我们可以看到右边上面的是文件区域，也就是文件管理区域了，右边的下面是代码区域，当我们选择了相应的上面的文件之后，下面的代码区域就会显示相应的代码提供编辑。感觉很废话吧，不过我们还是要说说几种文件类型。我们现在首先需要关心的是三种文件类型，分别为.h，.m，.xib。</p>
<ul>
    <li>.h：头文件类型。</li>
    <li>.m：代码文件类型。</li>
    <li>.xib：用户界面之类的文件类型。</li>
</ul>
<p>暂时在这里我们这里无需自己编写代码，我们直接打开xib文件打开设计器直接设计iPhone应用程序即可，这里我们需要打开的是mainWindow.xib，<strong>虽然我们通常情况下不会直接编辑此界面文件</strong>。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/xcode5.png" alt="" /></p>
<p>我们可以看到主窗体的界面是载自MyHelloWorldViewController，我们单击这个像超链接的就可以编辑这个Controller。</p>
<p>我们需要打开Tools菜单里面的Library，Attributes Inspector和Connections Inspector，这三个分别为空间的库，一个为属性窗口和联系窗口（相当于事件了）。</p>
<p>我们可以从最右侧的Library中拖动一个View控件到我们的窗体中，然后我们编辑相应的控件，然后就能够写一个简单的Hello World文本，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode6.png" style="border:none;background:transparent"/><img src="/blog/wp-content/uploads/2010/1/xcode7.png" alt="" style="border:none;background:transparent"/></p>
<p>然后呢，然后我们在Xcode编辑器中选择Build And Go就能够运行我们的程序了，看上面的iPhone模拟器运行的效果，是不是还不错，不过写HelloWorld虽然不难，但是却让我们能够对iPhone应用程序有一个基本的简单的初步印象，代码是如何运行的，各个文件是如何协调的，然后就是MVC的设计模式。</p>
<p>马上我们最需要关心的就是如何写做一些比较复杂的事情，然后给不同的控件添加事件，这方面没有VS来的方便，不过还算比较方便，但是作为C/C++开发的人员估计一开始上手都觉得很别扭，不过还好，我们下次就会说如何添加事件了，但是首先最主要的是，看看iPhone的结构是如何开发的，当然，还要看看一些Object-C的基础了。</p>]]></description>
			<content:encoded><![CDATA[<p>其实我写这些技术博客，一方面是写给新手去看，这样这些新手就不会像我这样找了半天找不到国内的资源，另外一方面也是留给自己看，本来我的博客访问量也不是很大，所以，大部分还是留给自己看。=。=</p>
<p>OK，如果你喜欢做一点iPhone的开发的话，可以尝试一下，iPhone的用户体验很不错，不过最近Google的手机也是很火，这个就看自己的方向了，不过程序开发都是那样，大同小异。首先，我们必须要做的就是有一个Mac系统，然后去下载一个XCode，<a href="http://developer.apple.com/technology/xcode.html">XCode可以去这里下载</a>。</p>
<p>下载完成之后，同样，我们需要写一个Hello World来上上手，我们打开XCode，然后创建一个新的项目，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode1.png" /></p>
<p>单击New Project，我们就能够创建一个新项目，这里我们选择iPhone的Application，并且我们先选择View-based Application，iPhone的应用程序是基于MVC的开发模式开发的，也就是Model，View和Controller，也就将传统的面向对象设计分开为模型层，视图层和控制层，更加深入的MVC的概念我就不多说了，现在我们只是开始动手做一个简单的应用程序。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/xcode2.png" alt="" style="border:none;background:transparent"/></p>
<p>我们选择ViewBased Application创建一个新程序，创建好之后我们就可以看到如下窗口。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode4.png" style="border:none;background:transparent"/></p>
<p>我们可以看到右边上面的是文件区域，也就是文件管理区域了，右边的下面是代码区域，当我们选择了相应的上面的文件之后，下面的代码区域就会显示相应的代码提供编辑。感觉很废话吧，不过我们还是要说说几种文件类型。我们现在首先需要关心的是三种文件类型，分别为.h，.m，.xib。</p>
<ul>
<li>.h：头文件类型。</li>
<li>.m：代码文件类型。</li>
<li>.xib：用户界面之类的文件类型。</li>
</ul>
<p>暂时在这里我们这里无需自己编写代码，我们直接打开xib文件打开设计器直接设计iPhone应用程序即可，这里我们需要打开的是mainWindow.xib，<strong>虽然我们通常情况下不会直接编辑此界面文件</strong>。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2010/1/xcode5.png" alt="" /></p>
<p>我们可以看到主窗体的界面是载自MyHelloWorldViewController，我们单击这个像超链接的就可以编辑这个Controller。</p>
<p>我们需要打开Tools菜单里面的Library，Attributes Inspector和Connections Inspector，这三个分别为空间的库，一个为属性窗口和联系窗口（相当于事件了）。</p>
<p>我们可以从最右侧的Library中拖动一个View控件到我们的窗体中，然后我们编辑相应的控件，然后就能够写一个简单的Hello World文本，如下图。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2010/1/xcode6.png" style="border:none;background:transparent"/><img src="/blog/wp-content/uploads/2010/1/xcode7.png" alt="" style="border:none;background:transparent"/></p>
<p>然后呢，然后我们在Xcode编辑器中选择Build And Go就能够运行我们的程序了，看上面的iPhone模拟器运行的效果，是不是还不错，不过写HelloWorld虽然不难，但是却让我们能够对iPhone应用程序有一个基本的简单的初步印象，代码是如何运行的，各个文件是如何协调的，然后就是MVC的设计模式。</p>
<p>马上我们最需要关心的就是如何写做一些比较复杂的事情，然后给不同的控件添加事件，这方面没有VS来的方便，不过还算比较方便，但是作为C/C++开发的人员估计一开始上手都觉得很别扭，不过还好，我们下次就会说如何添加事件了，但是首先最主要的是，看看iPhone的结构是如何开发的，当然，还要看看一些Object-C的基础了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/187/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>快速上手iPhone皮肤制作</title>
		<link>http://www.jguoer.com/blog/index.php/archives/246</link>
		<comments>http://www.jguoer.com/blog/index.php/archives/246#comments</comments>
		<pubDate>Mon, 26 Oct 2009 14:24:00 +0000</pubDate>
		<dc:creator>诡异的西红柿</dc:creator>
				<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[小分享]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[制作]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[皮肤]]></category>

		<guid isPermaLink="false">/post/2009/10/26/How-To-Make-A-iPhone-WinterBoard-Theme.aspx</guid>
		<description><![CDATA[<p>这两天除了爬香山以外，在家里无聊还研究了一下iPhone的皮肤制作，虽然我自己本身不怎么想做这个皮肤，但是无奈太多皮肤设计的都太不好了，并不是说图标不好，而是整体感觉不好，所以为了整体感觉，我就想为我iPhone里所有的程序都自己设计一下图标，这样就会好很多。这里也是为了自己记住，也方便新手去看，这里iPhone都需要越狱并且安装WinterBoard。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0001.png" />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0002.png" /></p>
<p>首先我们要说的是如何安装主题，进行文件传输，这里可以使用两个工具，一个就是91助手了，另一个就是WinSCP，一般主题都会放在/private/var/stash/Themes.******/目录下，后面是&#215;&#215;&#215;因为不同的机器编号也不一样，但是用91助手的话就会简单一点，建议一开始做皮肤的使用91助手，直接添加主题的文件夹即可。</p>
<p>一般主题里面包括如下这几个文件夹和文件：</p>
<ul>
    <li>-- Bundles</li>
    <li>-- Icons</li>
    <li>-- Private</li>
    <li>-- UIImages</li>
    <li>-- UISounds</li>
    <li>-- Info.plist</li>
    <li>-- StatusBar.png</li>
    <li>-- Wallpaper.png</li>
    <li>-- Dock.png</li>
    <li>-- Wallpaper.html</li>
</ul>
<p>这几个文件夹及文件的基本作用如下。</p>
<ul>
    <li>Info.plist:主要用来定义图标文字的颜色、大小等。</li>
    <li>StatusBar.png:顶部状态条图片。</li>
    <li>Wallpaper.png:背景壁纸。</li>
    <li>Dock.png:DOCK的样式。</li>
    <li>Wallpaper.html:这里可以调用动态壁纸等。</li>
</ul>
<p>当然，我这里只写了一点点，要完全写出来也不是一件很现实的事情，所以这里我们就必须手动的来做一下。下面我传了我做的这个的主题包，可以自己去看，我在后面分别讲解。</p>
<p><a href="/blog/wp-content/uploads/2009/10/GuoJing.Theme.Lite.rar">GuoJing.Theme.Lite.rar (522.38 kb)</a></p>
<p>1.首先我们要做主题的背景，并保存为Wallpaper.png并放置到我们的皮肤的根目录下。</p>
<p>2.短信背景可以制作一个图片SMSBackground.png并放置到根目录下，我们就可以看到短信背景被改变了。（是不是很简单？）</p>
<p>3.如果要改短信的冒泡的图标，需要制作Balloon_1.png和Balloon_2.png这两个文件。Balloon_1.png 是发短信的样式，Balloon_2.png 是接收短信样式。我们只需要放置到/private/var/stash/Themes.******/istyle.theme/Bundles/com.apple.MobileSMS/里面即可。（<strong>如果没有文件夹就自己建立一个</strong>）</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/send.png" alt="" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <img alt="" src="/blog/wp-content/uploads/2009/10/receive.png" /></p>
<p style="text-align: center;">Balloon_1.png&#160;&#160; Balloon_2.png</p>
<p>4.如果要替换锁屏的背景，可以制作UILCDBackground.png放置到/private/var/stash/Themes.******/制作的主题/UIImages/里面。</p>
<p>5.我们还可以做屏幕滑块图片，bottombarknobgray.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.TelephonyUI/，同样，我们还可以更改屏幕滑块背景保存到这个文件夹，保存为bottombarbkgndlock.png即可。</p>
<p>6.如果要更改图标右上角那个小的提示的数字的背景的话，可以使用这个保存为SBBadgeBG.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard下面。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/10/red.png" /><img src="/blog/wp-content/uploads/2009/10/jin.png" alt="" /><img alt="" src="/blog/wp-content/uploads/2009/10/green.png" /><img src="/blog/wp-content/uploads/2009/10/blue.png" alt="" /><img alt="" src="/blog/wp-content/uploads/2009/10/black.png" /></p>
<p>7.如果我们要改iPhone下面四个按钮的背景的颜色，也就是Dock的背景的话，我们可以将SBDockBG.png保存到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard/</p>
<p>8.如果我们要更改顶部的状态栏的话，我们需要做一个StatusBar.png替换到主题根目录下。</p>
<p>9.如果我们要更改如短信，提醒的弹出窗口的UI界面的话，我们就需要制作UIPopupAlertSheetBackground.png保存到主题下面的UIImages里面即可。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/UIPopupAlertSheetBackground.png" alt="" /></p>
<p style="text-align: center;">上图是我做的一个弹出界面，保存即可更改提醒方式</p>
<p>&#160;10.下面可以看一下提醒的效果图，做完效果图，我们就要做icon了，做icon我们最好把语言设置为英语，因为只有设置为英语了我们才能够按照相应的名字去做icon。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/IMG_0003.png" alt="" />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0005.png" /></p>
<p>左边是提醒的一个演示，右边就是我们要做的icon了，我们做好的了icon，并命名为相应的同名的png保存在Icons目录下即可，记得，如果图标是Mail，就要保存为Main.png，如果是人人的话，保存为人人.png即可。</p>
<p>看完整个iPhone皮肤制作，是不是觉得不是很难，对，只要替换一下相应的图标即可，不过这个是初级的制作了，我们还可以更改充电的图标，蓝牙的图标，无线的图标，运营商的图标，很多很多了，建议大家自己下几个做的很完美的主题去看，这样就能够学到更多的东西，如果以后我会做复杂的主题的话，我可能还会上来写如何制作复杂的主题。</p>
<p>PS：其中一部分图标是来自Deep主题（国外的免费主题）的，为了达到整体效果统一，我自己做了一些相同风格的图标，已经一并打包上传了，可以自己下下来修改，PSD源文件可以从这里下载。</p>
<p><a href="/blog/wp-content/uploads/2009/10/iphoneicon.psd">iphoneicon.psd (188.99 kb)</a></p>]]></description>
			<content:encoded><![CDATA[<p>这两天除了爬香山以外，在家里无聊还研究了一下iPhone的皮肤制作，虽然我自己本身不怎么想做这个皮肤，但是无奈太多皮肤设计的都太不好了，并不是说图标不好，而是整体感觉不好，所以为了整体感觉，我就想为我iPhone里所有的程序都自己设计一下图标，这样就会好很多。这里也是为了自己记住，也方便新手去看，这里iPhone都需要越狱并且安装WinterBoard。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0001.png" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0002.png" /></p>
<p>首先我们要说的是如何安装主题，进行文件传输，这里可以使用两个工具，一个就是91助手了，另一个就是WinSCP，一般主题都会放在/private/var/stash/Themes.******/目录下，后面是&times;&times;&times;因为不同的机器编号也不一样，但是用91助手的话就会简单一点，建议一开始做皮肤的使用91助手，直接添加主题的文件夹即可。</p>
<p>一般主题里面包括如下这几个文件夹和文件：</p>
<ul>
<li>&#8211; Bundles</li>
<li>&#8211; Icons</li>
<li>&#8211; Private</li>
<li>&#8211; UIImages</li>
<li>&#8211; UISounds</li>
<li>&#8211; Info.plist</li>
<li>&#8211; StatusBar.png</li>
<li>&#8211; Wallpaper.png</li>
<li>&#8211; Dock.png</li>
<li>&#8211; Wallpaper.html</li>
</ul>
<p>这几个文件夹及文件的基本作用如下。</p>
<ul>
<li>Info.plist:主要用来定义图标文字的颜色、大小等。</li>
<li>StatusBar.png:顶部状态条图片。</li>
<li>Wallpaper.png:背景壁纸。</li>
<li>Dock.png:DOCK的样式。</li>
<li>Wallpaper.html:这里可以调用动态壁纸等。</li>
</ul>
<p>当然，我这里只写了一点点，要完全写出来也不是一件很现实的事情，所以这里我们就必须手动的来做一下。下面我传了我做的这个的主题包，可以自己去看，我在后面分别讲解。</p>
<p><a href="/blog/wp-content/uploads/2009/10/GuoJing.Theme.Lite.rar">GuoJing.Theme.Lite.rar (522.38 kb)</a></p>
<p>1.首先我们要做主题的背景，并保存为Wallpaper.png并放置到我们的皮肤的根目录下。</p>
<p>2.短信背景可以制作一个图片SMSBackground.png并放置到根目录下，我们就可以看到短信背景被改变了。（是不是很简单？）</p>
<p>3.如果要改短信的冒泡的图标，需要制作Balloon_1.png和Balloon_2.png这两个文件。Balloon_1.png 是发短信的样式，Balloon_2.png 是接收短信样式。我们只需要放置到/private/var/stash/Themes.******/istyle.theme/Bundles/com.apple.MobileSMS/里面即可。（<strong>如果没有文件夹就自己建立一个</strong>）</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/send.png" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="/blog/wp-content/uploads/2009/10/receive.png" /></p>
<p style="text-align: center;">Balloon_1.png&nbsp;&nbsp; Balloon_2.png</p>
<p>4.如果要替换锁屏的背景，可以制作UILCDBackground.png放置到/private/var/stash/Themes.******/制作的主题/UIImages/里面。</p>
<p>5.我们还可以做屏幕滑块图片，bottombarknobgray.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.TelephonyUI/，同样，我们还可以更改屏幕滑块背景保存到这个文件夹，保存为bottombarbkgndlock.png即可。</p>
<p>6.如果要更改图标右上角那个小的提示的数字的背景的话，可以使用这个保存为SBBadgeBG.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard下面。</p>
<p style="text-align: center;"><img alt="" src="/blog/wp-content/uploads/2009/10/red.png" /><img src="/blog/wp-content/uploads/2009/10/jin.png" alt="" /><img alt="" src="/blog/wp-content/uploads/2009/10/green.png" /><img src="/blog/wp-content/uploads/2009/10/blue.png" alt="" /><img alt="" src="/blog/wp-content/uploads/2009/10/black.png" /></p>
<p>7.如果我们要改iPhone下面四个按钮的背景的颜色，也就是Dock的背景的话，我们可以将SBDockBG.png保存到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard/</p>
<p>8.如果我们要更改顶部的状态栏的话，我们需要做一个StatusBar.png替换到主题根目录下。</p>
<p>9.如果我们要更改如短信，提醒的弹出窗口的UI界面的话，我们就需要制作UIPopupAlertSheetBackground.png保存到主题下面的UIImages里面即可。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/UIPopupAlertSheetBackground.png" alt="" /></p>
<p style="text-align: center;">上图是我做的一个弹出界面，保存即可更改提醒方式</p>
<p>&nbsp;10.下面可以看一下提醒的效果图，做完效果图，我们就要做icon了，做icon我们最好把语言设置为英语，因为只有设置为英语了我们才能够按照相应的名字去做icon。</p>
<p style="text-align: center;"><img src="/blog/wp-content/uploads/2009/10/IMG_0003.png" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="/blog/wp-content/uploads/2009/10/IMG_0005.png" /></p>
<p>左边是提醒的一个演示，右边就是我们要做的icon了，我们做好的了icon，并命名为相应的同名的png保存在Icons目录下即可，记得，如果图标是Mail，就要保存为Main.png，如果是人人的话，保存为人人.png即可。</p>
<p>看完整个iPhone皮肤制作，是不是觉得不是很难，对，只要替换一下相应的图标即可，不过这个是初级的制作了，我们还可以更改充电的图标，蓝牙的图标，无线的图标，运营商的图标，很多很多了，建议大家自己下几个做的很完美的主题去看，这样就能够学到更多的东西，如果以后我会做复杂的主题的话，我可能还会上来写如何制作复杂的主题。</p>
<p>PS：其中一部分图标是来自Deep主题（国外的免费主题）的，为了达到整体效果统一，我自己做了一些相同风格的图标，已经一并打包上传了，可以自己下下来修改，PSD源文件可以从这里下载。</p>
<p><a href="/blog/wp-content/uploads/2009/10/iphoneicon.psd">iphoneicon.psd (188.99 kb)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jguoer.com/blog/index.php/archives/246/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

