<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>IOS on Dapeng Zhang</title><link>https://zhangdapeng.dev/tags/ios/</link><description>Recent content in IOS on Dapeng Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 15 Jul 2025 09:51:00 +0000</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/ios/index.xml" rel="self" type="application/rss+xml"/><item><title>iOS与JavaScript交互: MessageHandler</title><link>https://zhangdapeng.dev/p/ios-yu-javascript-jiao-hu-messagehandler/</link><pubDate>Tue, 15 Jul 2025 09:51:00 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-yu-javascript-jiao-hu-messagehandler/</guid><description>&lt;p&gt;WKWebView有一个内容交互控制器，该对象提供了通过JS向WKWebView发送消息的途径。需要设置MessageHandler，我把这个功能简称为MessageHandler。&lt;/p&gt;
&lt;p&gt;首先了解下iOS开发中需要调用的方法&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)addScriptMessageHandler:(id &amp;lt;WKScriptMessageHandler&amp;gt;)scriptMessageHandler name:(NSString *)name;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;和&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)removeScriptMessageHandlerForName:(NSString *)name;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;下面看下如何调用&lt;/p&gt;
&lt;p&gt;添加MessageHandler&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.webView.configuration.userContentController addScriptMessageHandler:self name:&lt;span style="color:#e6db74"&gt;@&amp;#34;showAlert&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;移除MessageHandler&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.webView.configuration.userContentController removeScriptMessageHandlerForName:&lt;span style="color:#e6db74"&gt;@&amp;#34;showAlert&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="js调用"&gt;JS调用
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;window.webkit.messageHandlers.&amp;lt;name&amp;gt;.postMessage(&amp;lt;messageBody&amp;gt;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个name就是设置MessageHandler的第二个参数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;window.webkit.messageHandlers.getString.postMessage(null);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="注意点"&gt;注意点
&lt;/h3&gt;&lt;p&gt;在JS中写起来简单，不用再用创建URL的方式那么麻烦了。&lt;/p&gt;
&lt;p&gt;JS传递参数更方便。使用拦截URL的方式传递参数，只能把参数拼接在后面，如果遇到要传递的参数中有特殊字符，如&amp;amp;、=、?等，必须得转换，否则参数解析肯定会出错。&lt;/p&gt;
&lt;h3 id="示例演示"&gt;示例演示
&lt;/h3&gt;&lt;p&gt;html代码部分&lt;/p&gt;
&lt;p&gt;四个按钮分别演示JS传NULL给WKWebView，然后WKWebView调用JS方法；JS传字符串、JS传数组、JS传字典改变导航背景。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;Title&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;loadURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;createElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;iframe&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;src&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;style&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;display:none;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0px&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;width&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0px&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;frameborder&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;appendChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 发起请求后这个iFrame就没用了，所以把它从dom上移除掉
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parentNode&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;removeChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;iFrame&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;asyncAlert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showAlert&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;webkit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;messageHandlers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;showAlert&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;postMessage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alertWithMessage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;asyncAlert&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;returnValue&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;postString&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;webkit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;messageHandlers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;postString&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;postMessage&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;r=10,g=170,b=250,a=0.5&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;postArray&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;webkit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;messageHandlers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;postArray&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;postMessage&lt;/span&gt;([Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;postDictionary&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;webkit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;messageHandlers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;postDictionary&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;postMessage&lt;/span&gt;({&lt;span style="color:#a6e22e"&gt;red&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;green&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;blue&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;()&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alpha&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;OC调用JS方法&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onclick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;showAlert()&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;JS传字符串&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onclick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;postString()&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;JS传数组&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onclick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;postArray()&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;JS传字典&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onclick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;postDictionary()&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;object-c代码部分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加载WKWebView&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;loadWebView&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 偏好配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WKWebViewConfiguration &lt;span style="color:#f92672"&gt;*&lt;/span&gt;config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [WKWebViewConfiguration new];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config.preferences &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [WKPreferences new];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config.preferences.minimumFontSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config.preferences.javaScriptCanOpenWindowsAutomatically &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.webView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.webView.UIDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; &lt;span style="color:#75715e"&gt;// 设置交互代理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.webView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 加载HTML
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;index2&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;html&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;htmlStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView loadHTMLString:htmlStr baseURL:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;添加和移除处理&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewWillAppear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController addScriptMessageHandler:self name:&lt;span style="color:#e6db74"&gt;@&amp;#34;showAlert&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController addScriptMessageHandler:self name:&lt;span style="color:#e6db74"&gt;@&amp;#34;postString&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController addScriptMessageHandler:self name:&lt;span style="color:#e6db74"&gt;@&amp;#34;postArray&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController addScriptMessageHandler:self name:&lt;span style="color:#e6db74"&gt;@&amp;#34;postDictionary&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:&lt;span style="color:#e6db74"&gt;@&amp;#34;showAlert&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:&lt;span style="color:#e6db74"&gt;@&amp;#34;postString&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:&lt;span style="color:#e6db74"&gt;@&amp;#34;postArray&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:&lt;span style="color:#e6db74"&gt;@&amp;#34;postDictionary&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;实现协议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我这里实现了两个协议 WKUIDelegate,WKScriptMessageHandler，WKUIDelegate是因为我在JS中弹出了alert。WKScriptMessageHandler是因为我们要处理JS调用OC方法的请求。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - WKScriptMessageHandler
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;userContentController:&lt;/span&gt;(WKUserContentController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)userContentController &lt;span style="color:#a6e22e"&gt;didReceiveScriptMessage:&lt;/span&gt;(WKScriptMessage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)message {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([message.name isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;showAlert&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self alert];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([message.name isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;postString&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self changeColorWithString:message.body];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([message.name isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;postArray&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self changeColorWithArray:message.body];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([message.name isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;postDictionary&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self changeColorWithDictionary:message.body];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;alert&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// OC调用JS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;alertWithMessage(&amp;#39;%@&amp;#39;)&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;OC调用JS的方法&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView evaluateJavaScript:jsStr completionHandler:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; _Nullable result, NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt; _Nullable error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@----%@&amp;#34;&lt;/span&gt;,result, error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;changeColorWithString:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;params &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[string componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;,&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paramStr &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; params) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dicArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paramStr componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;=&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (dicArray.count &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;decodeValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dicArray[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tempDic setObject:decodeValue forKey:dicArray[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[tempDic objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;r&amp;#34;&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat g &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[tempDic objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;g&amp;#34;&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[tempDic objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;b&amp;#34;&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[tempDic objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;a&amp;#34;&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:r&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:g&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:b&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:a];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;changeColorWithArray:&lt;/span&gt;(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)array {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat g &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:r green:g blue:b alpha:alpha];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;changeColorWithDictionary:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dict {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict[&lt;span style="color:#e6db74"&gt;@&amp;#34;red&amp;#34;&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat g &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict[&lt;span style="color:#e6db74"&gt;@&amp;#34;green&amp;#34;&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict[&lt;span style="color:#e6db74"&gt;@&amp;#34;blue&amp;#34;&lt;/span&gt;] floatValue]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict[&lt;span style="color:#e6db74"&gt;@&amp;#34;alpha&amp;#34;&lt;/span&gt;] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:r green:g blue:b alpha:alpha];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;WKWebView中使用弹窗&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - WKUIDelegate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webView:&lt;/span&gt;(WKWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView &lt;span style="color:#a6e22e"&gt;runJavaScriptAlertPanelWithMessage:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)message &lt;span style="color:#a6e22e"&gt;initiatedByFrame:&lt;/span&gt;(WKFrameInfo &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)frame &lt;span style="color:#a6e22e"&gt;completionHandler:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; (&lt;span style="color:#f92672"&gt;^&lt;/span&gt;)(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;))completionHandler {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alertCrontroller &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIAlertController alertControllerWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;提示&amp;#34;&lt;/span&gt; message:message preferredStyle:UIAlertControllerStyleAlert];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alertCrontroller addAction:[UIAlertAction actionWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;知道了&amp;#34;&lt;/span&gt; style:UIAlertActionStyleCancel handler:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(UIAlertAction &lt;span style="color:#f92672"&gt;*&lt;/span&gt; _Nonnull action) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completionHandler();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:alertCrontroller animated:YES completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文章参考：https://www.jianshu.com/p/160f529e16fa&lt;/p&gt;</description></item><item><title>转载 - iOS 内购（In-App Purchase）总结</title><link>https://zhangdapeng.dev/p/zhuan-zai-ios-nei-gou-in-app-purchase-zong-jie/</link><pubDate>Fri, 11 Jul 2025 10:40:18 +0000</pubDate><guid>https://zhangdapeng.dev/p/zhuan-zai-ios-nei-gou-in-app-purchase-zong-jie/</guid><description>&lt;p&gt;IAP 全称：&lt;code&gt;In-App Purchase&lt;/code&gt;，是指苹果 App Store 的应用内购买，是苹果为 App 内购买虚拟商品或服务提供的一套交易系统&lt;/p&gt;
&lt;h3 id="iap-的适用范围"&gt;&lt;strong&gt;IAP 的适用范围&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;在 App 内需要付费使用的产品功能或虚拟商品/服务，如游戏道具、电子书、音乐、视频、订阅会员、App的高级功能等需要使用 IAP，而在 App 内购买实体商品（如淘宝购买手机）或者不在 App 内使用的虚拟商品（如充话费）或服务（如滴滴叫车）则不适用于 IAP&lt;/p&gt;
&lt;p&gt;简而言之，苹果规定：适用范围内的虚拟商品或服务，必须使用 IAP 进行购买支付，不允许使用支付宝、微信支付等其它第三方支付方式（包括Apple Pay），也不允许以任何方式（包括跳出App、提示文案等）引导用户通过应用外部渠道购买&lt;/p&gt;
&lt;h3 id="ios-内购的准备"&gt;&lt;strong&gt;iOS 内购的准备&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;App 内集成内购代码之前需要先去开发账号的 Itunes Connect 后台填写银行账户信息、配置内购商品（包括产品ID、价格等），还需要配置沙盒账号用于 IAP 测试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;银行账户信息填写&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关于如何去 Itunes Connect 后台填写账户信息，本文不做讨论，可以参考以下文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.jianshu.com/p/4f5f0b45b083" target="_blank" rel="noopener"
 &gt;iOS内购一条龙—账户信息填写&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置内购商品&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IAP 是一套商品交易系统，而非简单的支付系统，每一个购买项目都需要在开发者后台的Itunes Connect后台为 App 创建一个对应的商品，提交给苹果审核通过后，购买项目才会生效&lt;/p&gt;
&lt;p&gt;Itunes Connect 后台选择 &lt;code&gt;我的APP&lt;/code&gt;，选择需要内购 App，选择 &lt;code&gt;功能&lt;/code&gt;，可以进入到配置内购商品的页面&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum1.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="549px" data-flex-grow="229" height="801" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum1.png" srcset="https://zhangdapeng.dev/iap_sum1_12460503038406231330_hu_a1f4240c08bc6d37.png 800w, https://zhangdapeng.dev/iap_sum1_12460503038406231330_hu_855619930f40014c.png 1600w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum1.png 1835w" width="1835"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;新建内购商品有四种选择分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;消耗型项目&lt;/strong&gt;：只可使用一次的产品，使用之后即失效，必须再次购买，如：游戏币、一次性虚拟道具等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非消耗型项目&lt;/strong&gt;：只需购买一次，不会过期或随着使用而减少的产品。如：电子书&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动续期订阅&lt;/strong&gt;：允许用户在固定时间段内购买动态内容的产品。除非用户选择取消，否则此类订阅会自动续期，如：Apple Music这类按月订阅的商品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非续期订阅&lt;/strong&gt;：允许用户购买有时限性服务的产品，此 App 内购买项目的内容可以是静态的。此类订阅不会自动续期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum2.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="549" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum2.png" width="702"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一般情况下用的最多的是消耗型商品，根据 App 类型也会使用到非消耗型和自动续期订阅，以消耗型商品举例&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum3.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="458px" data-flex-grow="191" height="959" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum3.png" srcset="https://zhangdapeng.dev/iap_sum3_3511878737032919712_hu_f73ecb79c43d7ca0.png 800w, https://zhangdapeng.dev/iap_sum3_3511878737032919712_hu_184d5c6dadefdc0b.png 1600w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum3.png 1834w" width="1834"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里需要注意的是产品 ID 具有唯一性，建议使用项目的 &lt;code&gt;Bundle Identidier&lt;/code&gt; 作为前缀后面拼接自定义的唯一的商品名或者 ID（字母、数字），这里有个坑：&lt;strong&gt;一旦新建一个内购商品，它的产品ID将永远被占用，即使该商品已经被删除&lt;/strong&gt;，已创建的内购商品除了产品 ID 之外的所有信息都可以修改，如果删除了一个内购商品，将无法再创建一个相同产品 ID 的商品，也意味着该产品 ID 永久失效，一般来说产品ID有特定的命名规则，如果命名规则下有某个产品 ID 永久失效，可能会导致整个产品ID命名规则都要修改，这里千万要注意！&lt;/p&gt;
&lt;p&gt;另外内购商品的定价只能从苹果提供的价格等级去选择，这个价格等级是固定的，同一价格等级会对应各个国家的货币，也就是说内购商品的价格是根据 Apple ID 所在区域的货币进行结算的，比如：一个内购商品你选择等级1，那么这个商品在美区是 0.66 美元，在中区是 6 元人民币，在香港去是 8 港币，这些价格一般是固定的，除非某些货币出现大的变动（印象中有过一次卢布大跌，苹果调整过俄区的价格），价格等级表可以点击上图右边的 &lt;code&gt;所有价格和货币&lt;/code&gt; 查看&lt;/p&gt;
&lt;p&gt;另外要注意：&lt;strong&gt;苹果内购是需要抽取30%的分成&lt;/strong&gt;，实际结算是分成之前需要先扣除交易税，不同地区交易税不同，具体分成数额参看价格表&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum4.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="505px" data-flex-grow="210" height="870" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum4.png" srcset="https://zhangdapeng.dev/iap_sum4_15797327972406146353_hu_8bcc7c9db30da539.png 800w, https://zhangdapeng.dev/iap_sum4_15797327972406146353_hu_3ab8bc3d493b03cc.png 1600w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum4.png 1834w" width="1834"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;iOS 11 用户可以在 App Store 内 App 的下载页面内直接购买应用的内购商品，这项功能苹果称作做 &lt;code&gt;Promoting In-App Purchases&lt;/code&gt;，如果你的 App 需要在 App Store 推广自己的内购商品，则需要在上图的 &lt;code&gt;App Store 推广&lt;/code&gt; 里上传推广用的图像，另外苹果也在 iOS11 SDK 里面新增了从 App Store 购买内购项目跳转到 App 的新方法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置沙箱测试账号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;内购也是需要测试的，但是内购涉及到钱，所以苹果为内购测试提供了 &lt;code&gt;沙箱测试账号&lt;/code&gt; 的功能，Apple Pay 推出之后 &lt;code&gt;沙箱测试账号&lt;/code&gt; 也可以用于 Apple Pay 支付的测试，&lt;code&gt;沙箱测试账号&lt;/code&gt; 简单理解就是：只能用于内购和 Apple Pay 测试功能的 Apple ID，它并不是真实的 Apple ID，下面看如何创建 &lt;code&gt;沙箱测试账号&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Itunes Connect 后台选择 &lt;code&gt;用户和职能&lt;/code&gt;，选择 &lt;code&gt;+&lt;/code&gt; 添加测试账号&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum6.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="874px" data-flex-grow="364" height="508" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum6.png" srcset="https://zhangdapeng.dev/iap_sum6_16587146621793585997_hu_c8a42aca1d2c7fa3.png 800w, https://zhangdapeng.dev/iap_sum6_16587146621793585997_hu_5dace0e833e6d31.png 1600w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum6.png 1852w" width="1852"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum7.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="559px" data-flex-grow="233" height="790" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum7.png" srcset="https://zhangdapeng.dev/iap_sum7_4163431414591708266_hu_c5c22ea400e2444b.png 800w, https://zhangdapeng.dev/iap_sum7_4163431414591708266_hu_a474166468b088aa.png 1600w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum7.png 1842w" width="1842"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;填写沙箱测试账号信息需要注意以下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电子邮件不能是别人已经注册过 AppleID 的邮箱&lt;/li&gt;
&lt;li&gt;电子邮箱可以不是真实的邮箱，但是必须符合邮箱格式&lt;/li&gt;
&lt;li&gt;App Store 地区的选择，测试的时候弹出的提示框以及结算的价格会按照沙箱账号选择的地区来，建议测试的时候新建几个不同地区的账号进行测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置好测试账号之后，看一下沙箱账号测试的时候如何使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先沙箱测试账号必须在真机环境下进行测试，并且是 adhoc 证书或者 develop 证书签名的安装包，沙盒账号不支持直接从 App Store 下载的安装包&lt;/li&gt;
&lt;li&gt;去真机的 App Store 退出真实的 Apple ID 账号，退出之后并不需要在App Store 里面登录沙箱测试账号&lt;/li&gt;
&lt;li&gt;然后去 App 里面测试购买商品，会弹出登录框，选择 &lt;code&gt;使用现有的 Apple ID&lt;/code&gt;，然后登录沙箱测试账号，登录成功之后会弹出购买提示框，点击 &lt;code&gt;购买&lt;/code&gt;，然后会弹出提示框完成购买&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum8.png" target="_blank" rel="noopener"
 &gt;&lt;img class="gallery-image" data-flex-basis="548px" data-flex-grow="228" height="1137" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum8.png" srcset="https://zhangdapeng.dev/iap_sum8_4972216988175615165_hu_1ea6d4bcc4fa7d52.png 800w, https://zhangdapeng.dev/iap_sum8_4972216988175615165_hu_9b2398c2dc03d46b.png 1600w, https://zhangdapeng.dev/iap_sum8_4972216988175615165_hu_61740caacfd37c28.png 2400w, https://blog-images-1256154150.cos.ap-guangzhou.myqcloud.com/iap_sum8.png 2598w" width="2598"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上面说了这么多只是集成内购的一些准备，真正重要的是下面的内购代码的实现&lt;/p&gt;
&lt;h3 id="ios-内购具体代码"&gt;&lt;strong&gt;iOS 内购具体代码&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;写代码之前先来了解对比一下 IPA 和支付宝支付，首先看支付宝的支付流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App 发起一笔支付交易，然后服务端根据支付宝的要求把订单信息进行加密签名&lt;/li&gt;
&lt;li&gt;服务端把加密的交易信息返回给 App，App 拿到交易信息调用支付宝的 SDK，把支付信息给到支付宝的服务端验证&lt;/li&gt;
&lt;li&gt;验证通过后，App 跳转到支付宝 App 或者网页版支付宝，用户使用支付宝进行支付&lt;/li&gt;
&lt;li&gt;支付成功后从支付宝 App 跳转回到我们自己 APP，我们在 App 里处理回调结果刷新UI等&lt;/li&gt;
&lt;li&gt;同时支付宝的服务器也会回调我们自己服务器，把收据传给服务器，支付宝服务器会一直回调我们的服务器直到我们的服务器确认收到收据&lt;/li&gt;
&lt;li&gt;我们的服务器收到回调确认之后，确认订单支付成功&lt;/li&gt;
&lt;li&gt;为了以防万一，App 上回调返回成功之后我们还需要去自己服务器验证是否真的支付成功（一切以服务器为准）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;微信支付和支付宝支付的流程是类似的，来看看 IAP 的支付流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App 发起一笔内购支付，然后服务端生成一个订单号并且返回给 App&lt;/li&gt;
&lt;li&gt;App 拿到交易订单之后调用 IPA 创建一个 IPA 交易，并且添加到支付队列&lt;/li&gt;
&lt;li&gt;然后 IAP 会调用 Apple ID 支付页面等待用户确认支付，IPA 和苹果自己的 IPA 服务器通讯，回调购买成功，并且把收据写入 App 沙盒&lt;/li&gt;
&lt;li&gt;然后 App 去沙盒获取收据并且上传到自己的服务器&lt;/li&gt;
&lt;li&gt;服务器去 IAP 服务器查询收据的有效性并且对应到某个订单号，如果有效就通知 App，并且发放该内购商品，App 调用IAP 支付队列去结束该 IPA 交易&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比来看两者区别好像也不大，支付宝或者微信支付，一旦App 端支付成功，之后的验证工作就完全是我们的服务器和支付宝服务器之前的通讯了，服务端之间的通讯就保证了交易的可靠性，但是看看 IAP，同样的交易，服务端的验证却需要 App 端去驱动，由于 App 的网络环境比服务端复杂、用户操作的不确定性可能会导致 APP 无法正确的驱动服务端验证交易，另一方面 IAP 的服务器在美国，验证查询交易的延迟也很严重&lt;/p&gt;
&lt;p&gt;苹果 IAP 的那些坑后面再讲，先按照上面的流程，我们把 IPA 代码的逻辑理一理：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIKit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StoreKit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ViewController&lt;/span&gt;: UIViewController, SKProductsRequestDelegate,SKPaymentTransactionObserver {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;.viewDidLoad()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 监听支付队列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SKPaymentQueue.&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;().add(&lt;span style="color:#66d9ef"&gt;self&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; SKPaymentTransactionObserver)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;deinit&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SKPaymentQueue.&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;().remove(&lt;span style="color:#66d9ef"&gt;self&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; SKPaymentTransactionObserver)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 点击购买&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@IBAction&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;buy&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; sender: UIButton) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; SKPaymentQueue.canMakePayments() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; requestProductInfo(&lt;span style="color:#e6db74"&gt;&amp;#34;com.xiaovv.IAPDemo.vip1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;用户禁止购买&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 请求查询 iTunes Connect 后台配置的内购商品&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;requestProductInfo&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; productId: String) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; identifiers: Set&amp;lt;String&amp;gt; = [productId]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; request = SKProductsRequest(productIdentifiers: identifiers)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; request.delegate = &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; request.start()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transcationPurchasing&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; transcation: SKPaymentTransaction) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;交易中...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transcationPurchased&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; transcation: SKPaymentTransaction) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;交易成功...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 持久化订单信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; receiptUrl = Bundle.main.appStoreReceiptURL {&lt;span style="color:#75715e"&gt;//获取收据地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; receipt = NSData(contentsOf: receiptUrl)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; receiptStr = receipt?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DispatchQueue.main.asyncAfter(deadline: DispatchTime(uptimeNanoseconds: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)) {&lt;span style="color:#75715e"&gt;// 模拟上传收据到服务端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;receiptStr:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;\(&lt;/span&gt;String&lt;span style="color:#e6db74"&gt;(&lt;/span&gt;describing: receiptStr&lt;span style="color:#e6db74"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;applicationUsername:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;\(&lt;/span&gt;String&lt;span style="color:#e6db74"&gt;(&lt;/span&gt;describing: transcation.payment.applicationUsername&lt;span style="color:#e6db74"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 收据发送到服务器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 收据验证成功之后结束交易&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SKPaymentQueue.&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;().finishTransaction(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 删除保存的订单信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transcationFailed&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; transcation: SKPaymentTransaction) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;交易失败...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transcationRrestored&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; transcation: SKPaymentTransaction) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;已经购买该商品...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fileprivate &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transcationDeferred&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; transcation: SKPaymentTransaction) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;交易延期...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//&lt;/span&gt;&lt;span style="color:#75715e"&gt;MARK:&lt;/span&gt;&lt;span style="color:#75715e"&gt; - SKPaymentTransactionObserver&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 购买内购商品之后会调用的代理方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paymentQueue&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; transcation &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; transactions {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (transcation.transactionState) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .purchasing:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transcationPurchasing(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .purchased:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transcationPurchased(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .failed:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transcationFailed(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .restored:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transcationRrestored(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .deferred:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transcationDeferred(transcation)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//&lt;/span&gt;&lt;span style="color:#75715e"&gt;MARK:&lt;/span&gt;&lt;span style="color:#75715e"&gt; - SKProductsRequestDelegate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 查询iTunes Connect 后台内购商品的回调代理方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;productsRequest&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; request: SKProductsRequest, didReceive response: SKProductsResponse) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response.products.count &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; payment = SKMutablePayment(product: response.products.first!)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// applicationUsername 可以把我们的自己订单和IAP的交易订单绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; payment.applicationUsername = &lt;span style="color:#e6db74"&gt;&amp;#34;orderid，userid and so on&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;没有可以购买的商品&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IAP 的代码看起来并不多流程也比较清晰，主要是下面几步：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根据内购商品的产品 ID 初始化一个 &lt;code&gt;SKProductsRequest&lt;/code&gt; 对象，调用该对象的 &lt;code&gt;start()&lt;/code&gt; 方法进行内购商品的请求&lt;/li&gt;
&lt;li&gt;把商品请求中获取到的 &lt;code&gt;SKProduct&lt;/code&gt; 对象生成一个 &lt;code&gt;SKPayment&lt;/code&gt; 对象，并把它压入到 &lt;code&gt;SKPaymentQueue&lt;/code&gt; 支付队列中&lt;/li&gt;
&lt;li&gt;然后从支付队列的代理方法 &lt;code&gt;func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])&lt;/code&gt; 里面获取到交易（transaction）的状态，交易完成后调用支付队列的 &lt;code&gt;finishTransaction()&lt;/code&gt;完成内购支付&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ios-内购减少丢单处理"&gt;&lt;strong&gt;iOS 内购减少丢单处理&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;上面说到 IAP 的坑，下面就列举一下 IAP 留给开发者的 “坑”：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户输入完 Apple ID 密码或者验证完指纹支付成功之后，网络突然中断导致 IAP 没有收到支付成功的通知，App 就无法在支付队列的代理方法中获取支付成功的通知，后续的发放内购商品也就不可能了&lt;/li&gt;
&lt;li&gt;App 在代理方法里收到了支付成功的通知，但是 App 上传交易收据到我们服务器去查询的时候如果查询失败，那么服务器就无法发放内购商品，因为这个行为是 App 驱动服务器的行为，这里有个坑就是支付队列的代理方法 &lt;code&gt;func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])&lt;/code&gt; 需要下次 App 重新启动才会重新调用，这个时候我们 App 才能重新去驱动服务器查询交易，由于用户操作的不确定性，不知道什么时候用户才会重新打开App，发放内购商品的周期自然也不确定&lt;/li&gt;
&lt;li&gt;之前有开发者反应，IAP 通知代理方法交易成功，但是沙盒里面取收据的时候发现为空，或者当前支付成功的订单并没有写入沙盒的收据，导致上传到服务器的收据查询不到结果&lt;/li&gt;
&lt;li&gt;如果用户支付成功，收据也上传服务器成功，但是在服务器验证阶段用户删除了App，导致App 无法去处理这些没有被验证完的订单&lt;/li&gt;
&lt;li&gt;如何处理越狱iOS手机内购的问题&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上问题都可能会导致用户支付成功了，却收不到我们发放的内购商品，统一起来称为：&lt;strong&gt;内购丢单&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来讨论一下如何处理 IAP 支付的一些细节问题克服上述 IAP 的坑&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;越狱问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我本人也折腾过 iOS 越狱，安装实用插件、美化主题等，自从iOS 9 之后越狱社区越来越不活跃了，能完美越狱的基本都是iPhone 5 以及更老的 32位设备了，这也侧面也说明了 iOS 在功能方面已经非常完善了，导致折腾越狱的人越来越少了，当前 iOS 版本是否越狱可以去这个网站查看：&lt;strong&gt;&lt;a class="link" href="https://canijailbreak.com/" target="_blank" rel="noopener"
 &gt;Can I jailbreak&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回归正题，因为越狱之后会导致系统不确定的问题很多，我觉得可以采用宁可错杀一千也不放过一个原则，对于已越狱的iOS 设备全部不允许内购行为，简单粗暴有效，可以通过下面工具的方法判断iOS设备是否越狱&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.h &lt;span style="color:#960050;background-color:#1e0010"&gt;文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JailbreakDetectTool&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 检查当前设备是否已经越狱。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectCurrentDeviceIsJailbroken&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.m &lt;span style="color:#960050;background-color:#1e0010"&gt;文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;JailbreakDetectTool.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JailbreakDetectTool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 四种检查是否越狱的方法, 只要命中一个, 就说明已经越狱.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectCurrentDeviceIsJailbroken&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self detectJailBreakByJailBreakFileExisted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self detectJailBreakByAppPathExisted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self detectJailBreakByEnvironmentExisted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self detectJailBreakByCydiaPathExisted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 判定常见的越狱文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * /Applications/Cydia.app
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * /Library/MobileSubstrate/MobileSubstrate.dylib
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * /usr/sbin/sshd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * /etc/apt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 这个表可以尽可能的列出来，然后判定是否存在，只要有存在的就可以认为机器是越狱了。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; jailbreak_tool_pathes[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/Applications/Cydia.app&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/Library/MobileSubstrate/MobileSubstrate.dylib&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/usr/sbin/sshd&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/etc/apt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectJailBreakByJailBreakFileExisted&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;ARRAY_SIZE(jailbreak_tool_pathes); i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is NOT jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 判断cydia的URL scheme.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectJailBreakByCydiaPathExisted&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;cydia://&amp;#34;&lt;/span&gt;]]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is NOT jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 读取系统所有应用的名称.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 这个是利用不越狱的机器没有这个权限来判定的。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define USER_APP_PATH @&amp;#34;/User/Applications/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectJailBreakByAppPathExisted&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;applist &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;applist = %@&amp;#34;&lt;/span&gt;, applist);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is NOT jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 这个DYLD_INSERT_LIBRARIES环境变量，在非越狱的机器上应该是空，越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printEnv&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;env &lt;span style="color:#f92672"&gt;=&lt;/span&gt; getenv(&lt;span style="color:#e6db74"&gt;&amp;#34;DYLD_INSERT_LIBRARIES&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; env;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;detectJailBreakByEnvironmentExisted&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (printEnv()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The device is NOT jail broken!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;储存交易订单&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上述第1、2点坑都是因为交易订单支付成功了，但是没有完成服务器验证收据，所以我们非常有必要持久化我们的订单信息，IAP 支付成功的交易（transaction）只要没有调用 &lt;code&gt;finishTransaction()&lt;/code&gt;，下次启动 App 重新监听支付队列的时候会重新调用 &lt;code&gt;func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])&lt;/code&gt; 这个时候就可以重新获取到未完成的该交易（transaction）&lt;/p&gt;
&lt;p&gt;支付成功后，我们持久化自己订单信息的目的就是和 IAP的交易（transaction）绑定起来，这样如果在App驱动服务器验证订单的时候出现了异常，App重新启动之后我们获取到未完成的 IAP的交易（transaction）之后依然可以和我们自己的订单联系起来，然后可以继续发送给后台服务器去去验证，直到验证成功完成 IAP 交易（transaction），购买结束&lt;/p&gt;
&lt;p&gt;这里我的做法是：用户支付成功之后用 &lt;code&gt;UserDefault&lt;/code&gt; 把该交易的交易标识（transactionIdentifier）和我们自己的交易订单作为字典的键值保存在沙盒内，然后把我们自己的订单号和支付收据发送给服务器去验证，服务器返回验证结果之后，删除 &lt;code&gt;UserDefault&lt;/code&gt; 中的订单信息，并且完成该笔IAP 交易（transaction），如果在服务器返回验证结果之前出现异常（用户杀掉App、手机关机了，App崩溃等）订单信息便不会从&lt;code&gt;UserDefault&lt;/code&gt; 中删除，该笔IAP 交易也不会被完成，App重新启动之后，重新监听支付队列的时候，可以重新获取到该笔交易（transaction），然后根据该笔交易（transaction）的交易标识（transactionIdentifier）找到 &lt;code&gt;UserDefault&lt;/code&gt; 中对应的我们自己的订单号，重新把订单号和交易收据发送给后台服务器验证&lt;/p&gt;
&lt;p&gt;我们自己的订单是后台生成并且和用户ID进行了绑定的，所以这里不担心用户支付成功之后，切换 App 账号会把内购商品发放给另一个用户&lt;/p&gt;
&lt;p&gt;我的做法比较简单，实际上用户如果删除 App，&lt;code&gt;UserDefault&lt;/code&gt; 的订单信息就会丢失，所以订单信息储存在钥匙串 &lt;code&gt;keychain&lt;/code&gt; 才是相对最稳妥的，特别是如果你的项目以内购为主并且支付非常频繁，这里可以参看贝聊的做法 &lt;a class="link" href="https://www.jianshu.com/p/8e5bf711f9f0" target="_blank" rel="noopener"
 &gt;贝聊 IAP 实战之见坑填坑&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;applicationUsername&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于 IAP 支付成功之后我们只能从 IAP 的代理方法里面获取到支付成功的交易（transaction），所以我们就必须把自己的订单号和对应的 IAP 交易（transaction）绑定在一起，IAP 创建 &lt;code&gt;SKPayment&lt;/code&gt; 对象，并把它压入到&lt;code&gt;SKPaymentQueue&lt;/code&gt; 支付队列的时候，我们可以使用可变的 &lt;code&gt;SKMutablePayment&lt;/code&gt;，它有一个属性叫做 &lt;code&gt;applicationUsername&lt;/code&gt;，这个属性就可以用来储存我们自己生成的订单号信息，用户支付成功之后可以成功的交易（transaction）的 &lt;code&gt;payment&lt;/code&gt; 中获取到绑定的订单号信息，这样就可以完美的把 IAP交易（transaction）和我们自己的订单号绑定在一起了&lt;/p&gt;
&lt;p&gt;但是，但是！苹果在这个属性上面有个巨坑，前面说到如果某个IAP交易（transaction）支付成功但是并没有调用 &lt;code&gt;finishTransaction()&lt;/code&gt;去完成这个交易的时候，下次启动 App 重新监听支付队列的时候会重新调用 &lt;code&gt;func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])&lt;/code&gt; 这个时候就可以重新获取到这个未完成的交易（transaction），苹果的坑就是这个时候获取 transaction 的 payment 的 applicationUsername 会出现 nil 的情况，所以实际开发中不能完全去相信这个 &lt;code&gt;applicationUsername&lt;/code&gt; 属性，这也是为什么上面我要把自己的订单号和 IAP 交易（transaction）的交易标识持久化下来的原因&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其他错漏问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第3点坑，用户支付成功之后从沙盒获取收据为空，IAP 提供了一个&lt;code&gt;SKReceiptRefreshRequest&lt;/code&gt;类，通过这个类可以在收据无效或者丢失的时候申请到新的收据，&lt;code&gt;SKReceiptRefreshRequest&lt;/code&gt;继承自 &lt;code&gt;SKRequest&lt;/code&gt; 和 &lt;code&gt;SKProductsRequest&lt;/code&gt; 都遵循 &lt;code&gt;SKRequestDelegate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第4点坑，如果我们的订单信息是持久化到钥匙串中，那么即使 App 被删除，下次重新安装的时候依然可以拿到持久化的订单信息&lt;/p&gt;
&lt;p&gt;实际上即使把上面的问题全部考虑到了依然还可能出问题，比如用户切换了 Apple ID 这个时候钥匙串里持久化的订单信息也会发生改变、或者验证成功之前用户换新的手机登录或者用户其他的不可预知的操作行为依然会导致错漏单的问题，但是我觉得内购大部分时候是用户一种强意识的行为，上面这些操作只能是认为用户在阻止自己购买成功，所以我们最终是无法百分之百避免错漏单的，手动去处理这些订单是非常有必要的&lt;/p&gt;
&lt;h3 id="iap-服务端的处理"&gt;&lt;strong&gt;IAP 服务端的处理&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;前面说到用户支付成功之后，我们拿到沙盒的收据信息去苹果的 IAP 服务器去验证，这里既可以直接在 App 端验证也可以让服务器去验证，实际上根据我的测试，App 端直接去IAP服务器验证比较快，毕竟中间少了很多步骤，但是考虑到越狱的 iOS 设备完全可以在系统层面跳过或者伪造收据，早期的 iOS 开发很多公司都是采用都是这种本地验证，但是现在基本都是通过后台验证的方式，具体的后台验证步骤如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App端拿到沙盒的收据（receipt-data）,进行一次base64编码，上传给服务器&lt;/li&gt;
&lt;li&gt;服务器拿到收据之后发到 IAP 服务器去验证，验证成功之后收据需要和自己的订单号进行映射并且记录在数据库，之后每次验证之前都需要先判断收据是否存在，防止 App 端重复上传相同的收据，重复发放内购商品&lt;/li&gt;
&lt;li&gt;服务器发放内购商品，推送通知给用户等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于 App 上线 App Store 之前我们是使用沙盒账号测试的，沙盒测试的收据验证也是要去沙盒收据的服务器验证&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沙盒环境验证服务器：&lt;a class="link" href="https://sandbox.itunes.apple.com/verifyReceipt" target="_blank" rel="noopener"
 &gt;https://sandbox.itunes.apple.com/verifyReceipt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;正式环境验证服务器：&lt;a class="link" href="https://buy.itunes.apple.com/verifyReceipt" target="_blank" rel="noopener"
 &gt;https://buy.itunes.apple.com/verifyReceipt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而且苹果在上线审核的时候也是使用沙盒账号测试的，那如何识别App端发过来的收据是沙盒测试还是正式环境用户的购买呢？这里服务端就要采用双重验证，即先把收据拿到正式环境的验证地址去验证，如果苹果的正式环境验证服务器返回的状态码 status 为 21007，则说明当前收据是沙盒环境产生，则再连接一次沙盒环境服务器进行验证，这样不管是我们自己采用沙盒账号测试还是苹果审核人员采用沙盒账号进行审核、或者用户购买都可以保证收据正常的验证成功&lt;/p&gt;
&lt;h3 id="沙盒测试遇到的其他问题"&gt;&lt;strong&gt;沙盒测试遇到的其他问题&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在进行沙盒测试的时候，遇到过 IAP 沙盒服务器出现异常，购买过程非常的慢，而且总是超时，返回购买失败，谷歌到有同行也出现过沙盒购买缓慢的问题（&lt;a class="link" href="https://forums.developer.apple.com/thread/96389" target="_blank" rel="noopener"
 &gt;iTunes Sandbox Extremely Slow&lt;/a&gt;），所以如果确定代码没有问题，多半就是 IAP 的沙盒服务器出现了问题，建议换个时间再测试，可以通过 &lt;a class="link" href="https://developer.apple.com/system-status/" target="_blank" rel="noopener"
 &gt;System Status - Apple Developer&lt;/a&gt; 查看苹果公司开发者相关的服务的服务状态&lt;/li&gt;
&lt;li&gt;如果内购的时候提示 &lt;strong&gt;&lt;code&gt;您已购买此 App 内购买项目。此项目将免费恢复。&lt;/code&gt;&lt;/strong&gt;，说明有一个购买了同一商品 IAP 交易（transaction）没有调用 &lt;code&gt;finishTransaction()&lt;/code&gt;去结束这个交易&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="promoting-in-app-purchases"&gt;&lt;strong&gt;Promoting In-App Purchases&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;前面提到iOS 11 之后，开发者可以在 App Store 自己App的下载页面推广自己的内购商品，用户可以直接在App下载页面购买内购商品，这就涉及到从App Store跳转到自己App，所以苹果在 &lt;code&gt;SKPaymentTransactionObserver&lt;/code&gt; 新增了一个代理方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;func &lt;span style="color:#a6e22e"&gt;paymentQueue&lt;/span&gt;(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; product: SKProduct) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Bool {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用户如果在 App下载页面点击购买你推广的内购商品，如果用户已经安装过你的 App 则会直接跳转你的App并调用上述代理方法；如果用户还没有安装你的 App 那么就会去下载你的 App，下载完成之后系统会推送一个通知，如果用户点击该通知就会跳转到你的App并且调用上面的代理方法&lt;/p&gt;
&lt;p&gt;上面的代理方法返回 &lt;code&gt;true&lt;/code&gt; 则表示跳转到你的 App，IAP 继续完成交易，如果返回 &lt;code&gt;false&lt;/code&gt; 则表示推迟或者取消购买，实际开发中因为可能还需要用户登录自己的账号、生成订单等，一般都是返回 &lt;code&gt;false&lt;/code&gt;，之后自己手动把代理方法里面返回的 &lt;code&gt;SKPayment&lt;/code&gt; 加入支付队列，然后在按照自己的支付、验证逻辑完成支付&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以上就是我做内购的时候从网上的资料以及官方文档总结的一些东西&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;参考和推荐阅读：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.jianshu.com/p/4f5f0b45b083" target="_blank" rel="noopener"
 &gt;iOS内购一条龙——账户信息填写&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.pmcaff.com/article/index/968640397863040?from=related&amp;amp;pmc_param%5Bentry_id%5D=975040810207296" target="_blank" rel="noopener"
 &gt;苹果应用内购买(IAP)—从入门到放弃&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.jianshu.com/p/07b5ec193353" target="_blank" rel="noopener"
 &gt;iOS 贝聊 IAP 实战之满地是坑&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://zhangtielei.com/posts/blog-iap.html" target="_blank" rel="noopener"
 &gt;苹果IAP开发中的那些坑和掉单问题&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573-CH105-SW1" target="_blank" rel="noopener"
 &gt;Receipt Validation Programming Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction.html#//apple_ref/doc/uid/TP40008267" target="_blank" rel="noopener"
 &gt;In-App Purchase Programming Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://developer.apple.com/cn/app-store/Receipt-Validation-Programming-Guide-CN.pdf" target="_blank" rel="noopener"
 &gt;收据验证编程指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://cwqqq.com/2017/12/05/ios_in-app_pay_server_side_code" target="_blank" rel="noopener"
 &gt;iOS内购充值 服务器端处理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/goodeveningbaby/article/details/53372934" target="_blank" rel="noopener"
 &gt;iOS 内购服务器验票（漏单处理）&lt;/a&gt;&lt;/p&gt;</description></item><item><title>webapp iOS拍照90度旋转问题</title><link>https://zhangdapeng.dev/p/webapp-ios-pai-zhao-90-du-xuan-zhuan-wen-ti/</link><pubDate>Fri, 11 Jul 2025 10:29:20 +0000</pubDate><guid>https://zhangdapeng.dev/p/webapp-ios-pai-zhao-90-du-xuan-zhuan-wen-ti/</guid><description>&lt;p&gt;通过下面这个库可以获取到在iOS下图片旋转的方向值 &lt;a class="link" href="http://code.ciaoca.com/javascript/exif-js/" target="_blank" rel="noopener"
 &gt;http://code.ciaoca.com/javascript/exif-js/&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getAllTags&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getTag&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Orientation&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;file值的获取方式如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;imgElement&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;orientation值的说明，可参考文章 &lt;a class="link" href="https://blog.csdn.net/happy08god/article/details/11528479" target="_blank" rel="noopener"
 &gt;https://blog.csdn.net/happy08god/article/details/11528479&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;部分实现代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleFiles&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getAllTags&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EXIF&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getTag&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Orientation&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reader&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FileReader&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reader&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readAsDataURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reader&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onload&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Image&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;src&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onload&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;createElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;canvas&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getContext&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2d&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getImage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//需要顺时针（向左）90度旋转
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;需要顺时针（向左）90度旋转&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotateImg&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toDataURL&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//需要逆时针（向右）90度旋转
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;需要逆时针（向右）90度旋转&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotateImg&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toDataURL&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//需要180度旋转
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;需要180度旋转&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotateImg&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//转两次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotateImg&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toDataURL&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;imgUrl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;paintImg&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;orientation&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rotateImg&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;direction&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//最小与最大旋转方向，图片旋转4次后回到原方向
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;min_step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max_step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//var img = document.getElementById(pid);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//img的高度和宽度不能在img元素隐藏后获取，否则会出错
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//var step = img.getAttribute(&amp;#39;step&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;min_step&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;direction&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//旋转到原位置，即超过最大值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max_step&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;min_step&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;min_step&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max_step&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#75715e"&gt;//旋转角度以弧度值为参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;degree&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;PI&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getContext&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;2d&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotate&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;degree&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotate&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;degree&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;canvas&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;height&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;rotate&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;degree&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;drawImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;img&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>移动端H5 iOS开发中 Fetch Api使用的注意事项</title><link>https://zhangdapeng.dev/p/yi-dong-duan-h5-ios-kai-fa-zhong-fetch-api-shi-yong-de-zhu-yi-shi-xiang/</link><pubDate>Thu, 10 Jul 2025 10:58:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/yi-dong-duan-h5-ios-kai-fa-zhong-fetch-api-shi-yong-de-zhu-yi-shi-xiang/</guid><description>&lt;p&gt;1、为什么在发送请求的时候会收不到cookie&lt;/p&gt;
&lt;p&gt;一般情况下我们会这样使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/mall/point/exchangecheck&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dataObj&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;toast&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;网络异常&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;针对这个情况我们要这样使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/mall/point/exchangecheck&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dataObj&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;credentials&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;same-origin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;toast&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;网络异常&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要加一下&amp;quot;credentials: &amp;ldquo;same-origin&amp;rdquo;&lt;/p&gt;
&lt;p&gt;官方说明&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;credentials (String) - Authentication credentials mode. Default: &amp;ldquo;omit&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;omit&amp;rdquo; - don&amp;rsquo;t include authentication credentials (e.g. cookies) in the request&lt;/p&gt;
&lt;p&gt;&amp;ldquo;same-origin&amp;rdquo; - include credentials in requests to the same site&lt;/p&gt;
&lt;p&gt;&amp;ldquo;include&amp;rdquo; - include credentials in requests to all sites&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;2、iPhone4、iPhone5机型支持async/await&lt;/p&gt;
&lt;p&gt;iPhone4、iPhone5机型支持async/await，即使我使用babel 7，我是在浏览器中直接引用，当然我也是使用了，自定义plugins的方式进行了调试，然后会出现另外其他的问题，针对具体如何使用的方式我会在另外一篇文章做分享。现针对这个问题说下我的解决方案。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;checkExchangeHandle&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/xxx/xxx/xxx&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;goods_id&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;headers&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;credentials&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;same-origin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;exchangeHandle&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;checkExchangeHandle&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;o&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;o&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;o&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;success&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Error(&lt;span style="color:#a6e22e"&gt;o&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;location&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/xxx/xxx/xxxsuccess&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;toast&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;toast&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;网络异常&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实调用方式类似于Promise的使用，这里使用的fetch方法是&lt;a class="link" href="https://github.com/github/fetch" target="_blank" rel="noopener"
 &gt;https://github.com/github/fetch&lt;/a&gt;提供的。兼容性还可以的。&lt;/p&gt;</description></item><item><title>iOS 牛刀小试 swift- 操练起来【CoreLocation】</title><link>https://zhangdapeng.dev/p/ios-niu-dao-xiao-shi-swift-cao-lian-qi-lai-corelocation/</link><pubDate>Mon, 30 Jun 2025 11:49:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-niu-dao-xiao-shi-swift-cao-lian-qi-lai-corelocation/</guid><description>&lt;p&gt;最近看了关于ios的另一门语言swift，找了个示例，操作了一下，遇到了点小问题，不过最终还是解决了。&lt;/p&gt;
&lt;p&gt;先看代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import UIKit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import CoreLocation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; ViewController: UIViewController,CLLocationManagerDelegate {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; let locationManager:CLLocationManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CLLocationManager()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; override func viewDidLoad() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.viewDidLoad()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationManager.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationManager.desiredAccuracy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kCLLocationAccuracyBest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(ios8()){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationManager.requestAlwaysAuthorization()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationManager.startUpdatingLocation()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; func ios8() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Bool{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIDevice.currentDevice().systemVersion &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;8.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; override func didReceiveMemoryWarning() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.didReceiveMemoryWarning()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; func locationManager(manager: CLLocationManager&lt;span style="color:#f92672"&gt;!&lt;/span&gt;, didUpdateLocations locations: [AnyObject]&lt;span style="color:#f92672"&gt;!&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; var location:CLLocation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; locations[locations.count &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] as CLLocation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(location.horizontalAccuracy &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(location.coordinate.latitude)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(location.coordinate.longitude)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationManager.stopUpdatingLocation()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; func locationManager(manager: CLLocationManager&lt;span style="color:#f92672"&gt;!&lt;/span&gt;, didFailWithError error: NSError&lt;span style="color:#f92672"&gt;!&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(error)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你把这段代码copy过去的话，运行发现没有出现预期的输出内容。&lt;/p&gt;
&lt;p&gt;可以试试下面这个绝招：&lt;/p&gt;
&lt;p&gt;在plist文件中增加如下两个参数&lt;/p&gt;
&lt;p&gt;1、NSLocationWhenInUseUsageDescription&lt;/p&gt;
&lt;p&gt;2、NSLocationAlwaysUsageDescription&lt;/p&gt;
&lt;p&gt;然后再编译一次，保证成功，如果不成功，哈哈，反正我成功啦！&lt;/p&gt;</description></item><item><title>iOS7 视频播放 MPMoviePlayerController</title><link>https://zhangdapeng.dev/p/ios7-shi-pin-bo-fang-mpmovieplayercontroller/</link><pubDate>Fri, 27 Jun 2025 10:26:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-shi-pin-bo-fang-mpmovieplayercontroller/</guid><description>&lt;p&gt;IOS7 视频播放 需要使用 MPMoviePlayerController&lt;/p&gt;
&lt;p&gt;首先是加在一下库文件MediaPlayer.framework&lt;/p&gt;
&lt;p&gt;然后实现如下的代码就好了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 视频播放
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showMovie:&lt;/span&gt;(UIGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tap
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;视频播放&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt; nanshanImage&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIImageView alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;699&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nanshanImage.image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;boy.jpg&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:nanshanImage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton&lt;span style="color:#f92672"&gt;*&lt;/span&gt; playButton&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIButton alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;145&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;250&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [playButton addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(PlayMovieAction:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; playButton.backgroundColor&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:playButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;PlayMovieAction:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//视频文件路径，此视频已经存入项目包中。属于本地播放
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;jinxiuMovie&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;mp4&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//视频URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL fileURLWithPath:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//视频播放对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MPMoviePlayerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;movie &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[MPMoviePlayerController alloc] initWithContentURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; movie.controlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MPMovieControlStyleFullscreen;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [movie.view setFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; movie.initialPlaybackTime &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:movie.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 注册一个播放结束的通知，当播放结束时，监听到并且做一些处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//播放器自带有播放结束的通知，在此仅仅只需要注册观察者监听通知即可。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(myMovieFinishedCallback:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:MPMoviePlayerPlaybackDidFinishNotification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:movie];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [movie play];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;myMovieFinishedCallback:&lt;/span&gt;(NSNotification&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)notify
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//视频播放对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MPMoviePlayerController&lt;span style="color:#f92672"&gt;*&lt;/span&gt; theMovie &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [notify object];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//销毁播放通知
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:MPMoviePlayerPlaybackDidFinishNotification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:theMovie];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [theMovie.view removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 释放视频对象，此对象由上面建立视频对象时候所alloc,在此做释放操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;视频播放完成&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面的播放文件是MP4格式的，格式支持：MOV、MP4、M4V、与3GP等格式，还支持多种音频格式。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;刚开始接触先记录一下&lt;/p&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.oschina.net/question/213217" target="_blank" rel="noopener"
 &gt;http://www.oschina.net/question/213217&lt;/a&gt;_40625&lt;/p&gt;</description></item><item><title>iOS之同步请求、异步请求、GET请求、POST请求</title><link>https://zhangdapeng.dev/p/ios-zhi-tong-bu-qing-qiu-yi-bu-qing-qiu-get-qing-qiu-post-qing-qiu/</link><pubDate>Fri, 27 Jun 2025 10:25:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhi-tong-bu-qing-qiu-yi-bu-qing-qiu-get-qing-qiu-post-qing-qiu/</guid><description>&lt;p&gt;都知道网站有GET请求和POST请求，但是在开发IOS的时候，会有哪些方法呢，网上有篇文章写的不错很有力度。入门者应该也可以看的明白，不明白者，可以看下方的QQ群，进行交流&lt;/p&gt;
&lt;p&gt;1、同步请求可以从因特网请求数据，一旦发送同步请求，程序将停止用户交互，直至服务器返回数据完成，才可以进行下一步操作，&lt;br&gt;
2、异步请求不会阻塞主线程，而会建立一个新的线程来操作，用户发出异步请求后，依然可以对UI进行操作，程序可以继续运行&lt;br&gt;
3、GET请求，将参数直接写在访问路径上。操作简单，不过容易被外界看到，安全性不高，地址最多255字节；&lt;br&gt;
4、POST请求，将参数放到body里面。POST请求操作相对复杂，需要将参数和地址分开，不过安全性高，参数放在body里面，不易被捕获。&lt;/p&gt;
&lt;h4 id="同步get请求"&gt;&lt;a class="link" href="#1" &gt;同步GET请求&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第一步，创建URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://api.hudong.com/iphonexml.do?type=focus-c&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第二步，通过URL创建网络请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//NSURLRequest初始化方法第一个参数：请求访问路径，第二个参数：缓存协议，第三个参数：网络请求超时时间（秒）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;其中缓存协议是个枚举类型包含：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestUseProtocolCachePolicy&lt;span style="color:#960050;background-color:#1e0010"&gt;（基础策略）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestReloadIgnoringLocalCacheData&lt;span style="color:#960050;background-color:#1e0010"&gt;（忽略本地缓存）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestReturnCacheDataElseLoad&lt;span style="color:#960050;background-color:#1e0010"&gt;（首先使用缓存，如果没有本地缓存，才从原地址下载）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestReturnCacheDataDontLoad&lt;span style="color:#960050;background-color:#1e0010"&gt;（使用本地缓存，从不下载，如果本地没有缓存，则请求失败，此策略多用于离线操作）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestReloadIgnoringLocalAndRemoteCacheData&lt;span style="color:#960050;background-color:#1e0010"&gt;（无视任何缓存策略，无论是本地的还是远程的，总是从原地址重新下载）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequestReloadRevalidatingCacheData&lt;span style="color:#960050;background-color:#1e0010"&gt;（如果本地缓存是有效的则不下载，其他任何情况都从原地址重新下载）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第三步，连接服务器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;received &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="同步post请求"&gt;&lt;a class="link" href="#2" &gt;同步POST请求&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第一步，创建URL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://api.hudong.com/iphonexml.do&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第二步，创建请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPMethod:&lt;span style="color:#e6db74"&gt;@&amp;#34;POST&amp;#34;&lt;/span&gt;];&lt;span style="color:#75715e"&gt;//设置请求方式为POST，默认为GET
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;type=focus-c&amp;#34;&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//设置参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [str dataUsingEncoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPBody:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第三步，连接服务器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;received &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,str1);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="异步get请求"&gt;&lt;a class="link" href="#3" &gt;异步GET请求&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第一步，创建url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://api.hudong.com/iphonexml.do?type=focus-c&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第二步，创建请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第三步，连接服务器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;connection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLConnection alloc]initWithRequest:request delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="异步post请求"&gt;&lt;a class="link" href="#4" &gt;异步POST请求&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第一步，创建url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://api.hudong.com/iphonexml.do&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第二步，创建请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPMethod:&lt;span style="color:#e6db74"&gt;@&amp;#34;POST&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;type=focus-c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [str dataUsingEncoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPBody:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//第三步，连接服务器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;connection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLConnection alloc]initWithRequest:request delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="异步请求的代理方法"&gt;&lt;a class="link" href="#5" &gt;异步请求的代理方法&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//接收到服务器回应的时候调用此方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveResponse:&lt;/span&gt;(NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSHTTPURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;res &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSHTTPURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[res allHeaderFields]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.receiveData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableData data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//接收到服务器传输数据的时候调用，此方法根据数据大小执行若干次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.receiveData appendData:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数据传完之后调用此方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;connectionDidFinishLoading:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receiveStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,receiveStr);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//网络请求过程中，出现任何错误（断网，连接超时等）会进入此方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;didFailWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[error localizedDescription]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NSString 中的 字符串拼接 和 多行书写字符串变量</title><link>https://zhangdapeng.dev/p/nsstring-zhong-de-zi-fu-chuan-pin-jie-he-duo-xing-shu-xie-zi-fu-chuan-bian-liang/</link><pubDate>Fri, 27 Jun 2025 10:25:46 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsstring-zhong-de-zi-fu-chuan-pin-jie-he-duo-xing-shu-xie-zi-fu-chuan-bian-liang/</guid><description>&lt;h4 id="字符串拼接"&gt;&lt;a class="link" href="#1" &gt;字符串拼接&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;我是durban&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;我是wenwen&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//方法1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [str1 stringByAppendingString:str2];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(result, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//方法2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@%@&amp;#34;&lt;/span&gt;, str1, str2];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(result, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//方法3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt; stringByAppendingFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@%@&amp;#34;&lt;/span&gt;, str1, str2];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(result, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//方法4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ms &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[ms appendString:str1];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[ms appendString:str2];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(ms, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[ms &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//结果都是：我是durban我是wenwen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一般推荐使用方法1，如果需要大量字符串连接推荐使用方法4，需要更少的内存开销。&lt;/p&gt;
&lt;h4 id="多行书写字符串变量"&gt;&lt;a class="link" href="#2" &gt;多行书写字符串变量&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;SELECT [CustomerID], [CustomerName] &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;FROM [Customer] &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;WHERE [CustomerName] LIKE &amp;#39;%durban%&amp;#39;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;SELECT [CustomerID], [CustomerName] \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FROM [Customer] \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WHERE [CustomerName] LIKE &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;durban&lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(str1, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(str2, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//结果都是：SELECT [CustomerID], [CustomerName] FROM [Customer] WHERE [CustomerName] LIKE &amp;#39;%durban%&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意字符串中每行结尾处的空格。这种字符串声明方式虽然看上去是多行，实际上字符串中并没有换行符，也就是说整个字符串实际上是一行。如果需要在字符串中换行，可以在字符串中加入换行符&amp;quot;\n&amp;quot;。这种声明方式一般用在需要在代码中多行显示字符串以便提高可读性，例如：SQL语句往往需要多行显示来提高可读性、较长的文本的段落之间需要分行显示以便更容易找到分段位置。&lt;/p&gt;</description></item><item><title>详解iPhone Tableview分批显示数据 实现点击加载更多</title><link>https://zhangdapeng.dev/p/xiang-jie-iphone-tableview-fen-pi-xian-shi-shu-ju-shi-xian-dian-ji-jia-zai-geng-duo/</link><pubDate>Fri, 27 Jun 2025 10:07:25 +0000</pubDate><guid>https://zhangdapeng.dev/p/xiang-jie-iphone-tableview-fen-pi-xian-shi-shu-ju-shi-xian-dian-ji-jia-zai-geng-duo/</guid><description>&lt;p&gt;其实这个实现起来，开始是啥思路也木有的，但是明白了之后，其实很简单的。&lt;/p&gt;
&lt;p&gt;iPhone屏幕尺寸是有限的，如果需要显示的数据很多，可以先数据放到一个table中，先显示10条，table底部有一察看更多选项，点击察看更多查看解析的剩余数据。基本上就是数据源里先只放10条, 点击最后一个cell时, 添加更多的数据到数据源中. 比如:&lt;/p&gt;
&lt;p&gt;数据源是个array:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NSMutableArray *items;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ViewController的这个方法返回数据条数: +1是为了显示&amp;quot;加载更多&amp;quot;的那个cell&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSInteger)&lt;span style="color:#a6e22e"&gt;tableViewUITableView&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView numberOfRowsInSectionNSInteger)section 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [items count]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; count &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个方法定制cell的显示, 尤其是&amp;quot;加载更多&amp;quot;的那个cell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableViewUITableView&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView cellForRowAtIndexPathNSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([indexPath row] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; ([items count])) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建loadMoreCell 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; loadMoreCell; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//create your data cell 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还要处理&amp;quot;加载更多&amp;quot;的那个cell的选择事件,触发一个方法来加载更多数据到列表&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableViewUITableView&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView didSelectRowAtIndexPathNSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (indexPath.row &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [items count]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [loadMoreCell setDisplayText:&lt;span style="color:#e6db74"&gt;@&amp;#34;loading more ...&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [loadMoreCell setAnimating:YES]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelectorInBackgroundselector(loadMore) withObject:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[loadMoreCell setHighlighted:NO]; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//其他cell的事件 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加载数据的方法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;loadMore&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;more; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//加载你的数据 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelectorOnMainThreadselector(appendTableWith withObject:more waitUntilDone:NO]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加数据到列表:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;appendTableWithNSMutableArray&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;[data count];i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[items addObject:[data objectAtIndex:i]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;insertIndexPaths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithCapacity:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; ind &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; ind &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [data count]; ind&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;newPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSIndexPath indexPathForRow:[items indexOfObject:[data objectAtIndex:ind]] inSection:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 [insertIndexPaths addObject:newPath]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NSURLCache 和 NSCachedURLResponse 的简单介绍记录</title><link>https://zhangdapeng.dev/p/nsurlcache-he-nscachedurlresponse-de-jian-dan-jie-shao-ji-lu/</link><pubDate>Fri, 27 Jun 2025 10:07:20 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsurlcache-he-nscachedurlresponse-de-jian-dan-jie-shao-ji-lu/</guid><description>&lt;p&gt;NSURLCache 和 NSCachedURLResponse 的简单介绍记录&lt;/p&gt;
&lt;h4 id="nsurlcache"&gt;&lt;a class="link" href="#1" &gt;NSURLCache&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;1、初始化相关的几个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sharedURLCache；&lt;/li&gt;
&lt;li&gt;setSharedURLCache；&lt;/li&gt;
&lt;li&gt;initWithMemoryCapacity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sharedURLCache方法返回一个NSURLCache实例。&lt;/p&gt;
&lt;p&gt;默认情况下，内存是4M，4 * 1024 * 1024；Disk为20M，20 * 1024 ＊ 1024；路径在(NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])&lt;/p&gt;
&lt;p&gt;setSharedURLCache可以通过这个方法来改变默认的NSURLCache。通过initWithMemoryCapacity来定制自己的NSURLCache。&lt;/p&gt;
&lt;p&gt;2、cache使用相关的几个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cachedResponseForRequest；&lt;/li&gt;
&lt;li&gt;storeCachedResponse；&lt;/li&gt;
&lt;li&gt;removeCachedResponseForRequest；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;removeAllCachedResponses&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果对应的NSURLRequest没有cached的response那么返回nil&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;为特定的NSURLRequest做cache&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)removeCachedResponseForRequest:(NSURLRequest *)request;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;移除特定NSURLRequest的cache&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)removeAllCachedResponses;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;移除所有的cache&lt;/p&gt;
&lt;p&gt;3、property方法&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (NSUInteger)memoryCapacity;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (NSUInteger)diskCapacity;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可能会导致内存中的内存被截断&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (void)setDiskCapacity:(NSUInteger)diskCapacity;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (NSUInteger)currentMemoryUsage;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (NSUInteger)currentDiskUsage;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;4、 Misc&lt;/p&gt;
&lt;p&gt;a. NSURLCache在每个UIWebView的的NSURLRequest请求中都会被调用。&lt;/p&gt;
&lt;p&gt;b. iOS设备上NSURLCache默认只能进行内存缓存。可以通过子类化NSURLCache来实现自定义的版本从而实现在DISK上缓存内容。&lt;/p&gt;
&lt;p&gt;c. 需要重写cachedResponseForRequest，这个会在请求发送前会被调用，从中我们可以判定是否针对此NSURLRequest返回本地数据。&lt;/p&gt;
&lt;p&gt;d. 如果本地没有缓存就调用下面这条语句：return [super cachedResponseForRequest:request];&lt;/p&gt;
&lt;h4 id="nscachedurlresponse"&gt;&lt;a class="link" href="#2" &gt;NSCachedURLResponse&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;包装了一下系统缓存机制的对象，保持了缓存对象的个性和特性。&lt;/p&gt;
&lt;p&gt;1、 NSURLCacheStoragePolicy 缓存策略有三种&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLCacheStorageAllowed,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLCacheStorageAllowedInMemoryOnly,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLCacheStorageNotAllowed,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认是第一种。不过在iOS的上官方文档上有这么一个解释：&lt;/p&gt;
&lt;p&gt;Important: iOS ignores this cache policy, and instead treats it asNSURLCacheStorageAllowedInMemoryOnly.&lt;/p&gt;
&lt;p&gt;也就是说iOS上只有内存缓存，没有磁盘缓存。&lt;/p&gt;
&lt;p&gt;2、构造方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data userInfo:(NSDictionary *)userInfo storagePolicy:(NSURLCacheStoragePolicy)storagePolicy;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3、Open API&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;- (NSURLResponse *)response;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;- (NSData *)data;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;- (NSDictionary *)userInfo;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;- (NSURLCacheStoragePolicy)storagePolicy;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还是蛮详细的。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://hi.baidu.com/marktian/item/e45af273bbc1eb14d0dcb3f4" target="_blank" rel="noopener"
 &gt;http://hi.baidu.com/marktian/item/e45af273bbc1eb14d0dcb3f4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://o0o0o0o.iteye.com/blog/1326713" target="_blank" rel="noopener"
 &gt;http://o0o0o0o.iteye.com/blog/1326713&lt;/a&gt;&lt;/p&gt;</description></item><item><title>UITabbar 中的 item的字体颜色 item点击后的tint颜色 和图片颜色的修改</title><link>https://zhangdapeng.dev/p/uitabbar-zhong-de-item-de-zi-ti-yan-se-item-dian-ji-hou-de-tint-yan-se-he-tu-pian-yan-se-de-xiu-gai/</link><pubDate>Fri, 27 Jun 2025 10:07:17 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitabbar-zhong-de-item-de-zi-ti-yan-se-item-dian-ji-hou-de-tint-yan-se-he-tu-pian-yan-se-de-xiu-gai/</guid><description>&lt;p&gt;这个问题解决了有些时候了，终于知道了办法，先看个代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UITabBar appearance] setTintColor:[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green:&lt;span style="color:#ae81ff"&gt;176.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blue:&lt;span style="color:#ae81ff"&gt;226.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIColor lightGrayColor], UITextAttributeTextColor, nil]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UITabbar有个setTintColor这个方法，可以理解为，高亮的时候，或者点击后的颜色设置。&lt;/p&gt;
&lt;p&gt;UITabBarItem有个setTitleTextAttributes的方法，是用来设置字体的颜色。&lt;/p&gt;
&lt;p&gt;我这里是在viewDidLoad添加的。&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置tabbar的背景图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITabBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.tabBarController.tabBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[tabBar setTintColor:[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green:&lt;span style="color:#ae81ff"&gt;176.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blue:&lt;span style="color:#ae81ff"&gt;226.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tabBar.selectedImageTintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tabBar.items objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;homePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;btn_home_highlight&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(item.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIColor lightGrayColor], UITextAttributeTextColor, nil]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; item.selectedImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:homePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UITextField 里面的字体内容如何缩进</title><link>https://zhangdapeng.dev/p/uitextfield-li-mian-de-zi-ti-nei-rong-ru-he-suo-jin/</link><pubDate>Fri, 27 Jun 2025 10:07:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitextfield-li-mian-de-zi-ti-nei-rong-ru-he-suo-jin/</guid><description>&lt;p&gt;实现的代码如下，记录下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchTextField &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITextField alloc] initWithFrame:CGRectMake(self.navigationController.navigationBar.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;235.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (self.navigationController.navigationBar.frame.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; ,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;235.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchTextField.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchTextField.placeholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;输入艺人名称&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;view &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];&lt;span style="color:#75715e"&gt;//左端缩进15像素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchTextField.leftView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; view;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchTextField.leftViewMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextFieldViewModeAlways;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS7 CGRectInset 该结构体的应用</title><link>https://zhangdapeng.dev/p/ios7-cgrectinset-gai-jie-gou-ti-de-ying-yong/</link><pubDate>Fri, 27 Jun 2025 10:07:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-cgrectinset-gai-jie-gou-ti-de-ying-yong/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect &lt;span style="color:#a6e22e"&gt;CGRectInset&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect rect,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat dx,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat dy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该结构体的应用是以原rect为中心，再参考dx，dy，进行缩放或者放大。&lt;/p&gt;
&lt;p&gt;我们做一个示例来看看是不是这样的：&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewDidAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidAppear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(self.view.bounds.size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect currentRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, currentRect);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFillStroke);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect original &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, original);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFillStroke);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect firstRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectInset(original, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, firstRect);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFillStroke);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect secondRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectInset(firstRect, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, secondRect);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFillStroke);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect thirdRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectInset(secondRect, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor yellowColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, thirdRect);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFillStroke);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect fourRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectInset(thirdRect, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddRect(context, fourRect);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;destImg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imgView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:destImg];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:imgView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从这个示例可以看出其使用方法是如何使用的。&lt;/p&gt;</description></item><item><title>UIViewController 中的 willMoveToParentViewController和didMoveToParentViewController的使用</title><link>https://zhangdapeng.dev/p/uiviewcontroller-zhong-de-willmovetoparentviewcontroller-he-didmovetoparentviewcontroller-de-shi-yong/</link><pubDate>Fri, 27 Jun 2025 10:07:05 +0000</pubDate><guid>https://zhangdapeng.dev/p/uiviewcontroller-zhong-de-willmovetoparentviewcontroller-he-didmovetoparentviewcontroller-de-shi-yong/</guid><description>&lt;p&gt;关于这两个方法，也是IOS5之后才加上去的。&lt;/p&gt;
&lt;p&gt;在iOS 5.0及以后，iOS为UIViewController类添加了新的属性和方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;readonly&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;childViewControllers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)addChildViewController:(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)childController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)removeFromParentViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)transitionFromViewController&lt;span style="color:#960050;background-color:#1e0010"&gt;：：：：：：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)willMoveToParentViewController:(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)parent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)didMoveToParentViewController:(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)parent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，就能够将一个页面中的UIViewController控制起来，而不是混乱的共用一个UIViewController，最重要的是，编程习惯的革命：降低了功能的耦合度！&lt;/p&gt;
&lt;p&gt;这里看看这几个方法的使用：&lt;/p&gt;
&lt;h4 id="heading"&gt;&lt;a class="link" href="#1" &gt;[父视图控制器 addChildViewController:子视图控制器];&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;在此，图控制器A添加了另一个图控制器B，那么A充当父视图控制器，B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。&lt;/p&gt;
&lt;p&gt;1、addChildViewController方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;addChildViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)childController
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;向视图控制器容器中添加子视图控制器&lt;/p&gt;
&lt;p&gt;childController：子视图控制器&lt;/p&gt;
&lt;p&gt;当要添加的子视图控制器已经包含在视图控制器容器中，那么，相当于先从父视图控制器中删除，然后重新添加到父视图控制器中。&lt;/p&gt;
&lt;p&gt;2、removeFromParentViewController 方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeFromParentViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从父视图控制器中删除。&lt;/p&gt;
&lt;p&gt;3、transitionFromViewController 方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;transitionFromViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fromViewController &lt;span style="color:#a6e22e"&gt;toViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)toViewController &lt;span style="color:#a6e22e"&gt;duration:&lt;/span&gt;(NSTimeInterval)duration &lt;span style="color:#a6e22e"&gt;options:&lt;/span&gt;(UIViewAnimationOptions)options &lt;span style="color:#a6e22e"&gt;animations:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; (&lt;span style="color:#f92672"&gt;^&lt;/span&gt;)(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;))animations &lt;span style="color:#a6e22e"&gt;completion:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; (&lt;span style="color:#f92672"&gt;^&lt;/span&gt;)(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; finished))completion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;交换两个子视图控制器的位置（由于添加的顺序不同，所以子试图控制器在父视图控制器中存在层次关系）&lt;/p&gt;
&lt;p&gt;fromViewController：当前显示的子试图控制器，将被替换为非显示状态&lt;/p&gt;
&lt;p&gt;toViewController：将要显示的子视图控制器&lt;/p&gt;
&lt;p&gt;duration：交换动画持续的时间，单位秒&lt;/p&gt;
&lt;p&gt;options：动画的方式&lt;/p&gt;
&lt;p&gt;animations：动画Block&lt;/p&gt;
&lt;p&gt;completion：完成后执行的Block&lt;/p&gt;
&lt;p&gt;4、willMoveToParentViewController 方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;willMoveToParentViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)parent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当一个视图控制器从视图控制器容器中被添加或者被删除之前，该方法被调用parent：父视图控制器，如果没有父视图控制器，将为nil&lt;/p&gt;
&lt;p&gt;注意点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;当我们向我们的视图控制器容器中调用removeFromParentViewController方法时，必须要先调用该方法，且parent参数为nil：&lt;/p&gt;
&lt;p&gt;[将要删除的视图控制器 willMoveToParentViewController:nil];&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当我们调用addChildViewController方法时，在添加子视图控制器之前将自动调用该方法。所以，就不需要我们显示调用了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5、didMoveToParentViewController 方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didMoveToParentViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)parent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当从一个视图控制容器中添加或者移除viewController后，该方法被调用。&lt;/p&gt;
&lt;p&gt;parent：父视图控制器，如果没有父视图控制器，将为nil&lt;/p&gt;
&lt;p&gt;当我们向我们的视图控制器容器（就是父视图控制器，它调用addChildViewController方法加入子视图控制器，它就成为了视图控制器的容器）中添加（或者删除）子视图控制器后，必须调用该方法，告诉iOS，已经完成添加（或删除）子控制器的操作。&lt;/p&gt;
&lt;p&gt;removeFromParentViewController 方法会自动调用了该方法，所以，删除子控制器后，不需要在显示的调用该方法了。&lt;/p&gt;
&lt;p&gt;其实，这几个方法中的API说明，看的还懂。&lt;/p&gt;
&lt;h4 id="关于willmovetoparentviewcontroller方法和didmovetoparentviewcontroller方法的使用"&gt;&lt;a class="link" href="#2" &gt;关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;1.这两个方法用在子试图控制器交换的时候调用！即调用transitionFromViewController 方法时，调用。&lt;/p&gt;
&lt;p&gt;2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时，要注意他们的参数使用：&lt;/p&gt;
&lt;p&gt;当某个子视图控制器将从父视图控制器中删除时，parent参数为nil。&lt;/p&gt;
&lt;p&gt;即：&lt;code&gt;[将被删除的子试图控制器 willMoveToParentViewController:nil];&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当某个子试图控制器将加入到父视图控制器时，parent参数为父视图控制器。&lt;/p&gt;
&lt;p&gt;即：&lt;code&gt;[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3.无需调用[子视图控制器 willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器 addChildViewController:子视图控制器]时，已经默认调用了。&lt;/p&gt;
&lt;p&gt;只需要在transitionFromViewController方法后，调用[子视图控制器didMoveToParentViewController:父视图控制器];&lt;/p&gt;
&lt;p&gt;4.无需调用[子视图控制器 didMoveToParentViewController:父视图控制器]方法。因为我们调用&lt;/p&gt;
&lt;p&gt;[子视图控制器 removeFromParentViewController]时，已经默认调用了。&lt;/p&gt;
&lt;p&gt;只需要在transitionFromViewController方法之前调用：[子视图控制器 willMoveToParentViewController:nil]。&lt;/p&gt;
&lt;p&gt;经过这几点说明，在一些视图切换的过程中，和视图的换位中，应该可以了解什么时候去调用对应的视图啦。&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>IOS7 中 UITableView 修改 header的样式和颜色</title><link>https://zhangdapeng.dev/p/ios7-zhong-uitableview-xiu-gai-header-de-yang-shi-he-yan-se/</link><pubDate>Fri, 27 Jun 2025 09:45:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-uitableview-xiu-gai-header-de-yang-shi-he-yan-se/</guid><description>&lt;p&gt;IOS7 中 UITableView 如何 修改 header的样式和颜色，只需要使用下面的方法就好了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;viewForHeaderInSection:&lt;/span&gt;(NSInteger)section
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sectionTitle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self.list objectAtIndex:section] valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create header view and add label as a subview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;view &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;320.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; view.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create label with section title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;12.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;284.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;24.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sectionTitle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [view addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; view;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS7 ASIHTTPRequest documentation 实现各种请求，包括图片上传，put,get.post</title><link>https://zhangdapeng.dev/p/ios7-asihttprequest-documentation-shi-xian-ge-zhong-qing-qiu-bao-kuo-tu-pian-shang-chuan-putgetpost/</link><pubDate>Fri, 27 Jun 2025 09:45:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-asihttprequest-documentation-shi-xian-ge-zhong-qing-qiu-bao-kuo-tu-pian-shang-chuan-putgetpost/</guid><description>&lt;p&gt;关于ASIHTTPRequest的具体使用，这里不做详细记载，因为官方也有其示例&lt;/p&gt;
&lt;p&gt;这里会列出几个简单的示例&lt;/p&gt;
&lt;h4 id="第一个创建一个异步请求"&gt;&lt;a class="link" href="#1" &gt;第一个：创建一个异步请求&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;Creating an asynchronous request（创建一个异步请求）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;grabURLInBackground:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://allseeing-i.com/&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ASIHTTPRequest requestWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [request setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [request startAsynchronous];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;requestFinished:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Use when fetching text data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;responseString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [request responseString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Use when fetching binary data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;responseData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [request responseData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;requestFailed:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [request error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="第二个使用asiformdatarequest发送一个post请求"&gt;&lt;a class="link" href="#2" &gt;第二个：使用ASIFormDataRequest发送一个POST请求&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;Sending a form POST with ASIFormDataRequest（使用ASIFormDataRequest发送一个POST请求）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ASIFormDataRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ASIFormDataRequest requestWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setPostValue:&lt;span style="color:#e6db74"&gt;@&amp;#34;Ben&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;first_name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setPostValue:&lt;span style="color:#e6db74"&gt;@&amp;#34;Copsey&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;last_name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;/Users/ben/Desktop/ben.jpg&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;photo&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="第三个直接下载文件"&gt;&lt;a class="link" href="#3" &gt;第三个：直接下载文件&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;Downloading the response directly to a file（直接下载文件）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ASIHTTPRequest requestWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setDownloadDestinationPath:&lt;span style="color:#e6db74"&gt;@&amp;#34;/Users/ben/Desktop/my_file.txt&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;这里给出一个中文的文档地址和一个英文的文档地址，适用于初级入门者&lt;/p&gt;
&lt;p&gt;官方文档网址：http://allseeing-i.com/ASIHTTPRequest/How-to-use&lt;/p&gt;
&lt;p&gt;中文的文档网址：http://blog.csdn.net/zkdemon/article/details/7066807&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>iOS7 第一次接触ALAssetsLibrary，简单介绍一下ALAssetsLibrary的作用</title><link>https://zhangdapeng.dev/p/ios7-di-yi-ci-jie-chu-alassetslibrary-jian-dan-jie-shao-yi-xia-alassetslibrary-de-zuo-yong/</link><pubDate>Fri, 27 Jun 2025 09:45:41 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-di-yi-ci-jie-chu-alassetslibrary-jian-dan-jie-shao-yi-xia-alassetslibrary-de-zuo-yong/</guid><description>&lt;p&gt;IOS7 第一次接触&lt;code&gt;ALAssetsLibrary&lt;/code&gt;，简单介绍一下&lt;code&gt;ALAssetsLibrary&lt;/code&gt;的作用&lt;/p&gt;
&lt;p&gt;ALAssetsLibrary介绍&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ALAssetsLibrary提供了访问iOS设备下”照片”应用下所有照片和视频的接口；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从ALAssetsLibrary中可读取所有的相册数据,即ALAssetsGroup对象列表；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从每个ALAssetsGroup中可获取到其中包含的照片或视频列表,即ALAsset对象列表；
每个ALAsset可能有多个representations表示,即ALAssetRepresentation对象，使用其defaultRepresentation方法可获得其默认representations，使用&lt;code&gt;[assetvalueForProperty:ALAssetPropertyRepresentations]&lt;/code&gt;可获取其所有representations的UTI数组。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从ALAsset对象可获取缩略图thumbnail或aspectRatioThumbnail；
从ALAssetRepresentation对象可获取全尺寸图片（fullResolutionImage），全屏图片（fullScreenImage）及图片的各种属性:orientation，dimensions，scale，url，metadata等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其层次关系为ALAssetsLibrary -&amp;gt; ALAssetsGroup -&amp;gt; ALAsset -&amp;gt; ALAssetRepresentation。&lt;/p&gt;
&lt;p&gt;具体的使用详情可以去这边看下的&lt;a class="link" href="http://www.winddisk.com/2013/06/30/%E4%BD%BF%E7%94%A8alassetslibrary%E8%AF%BB%E5%8F%96%E6%89%80%E6%9C%89%E7%85%A7%E7%89%87/" target="_blank" rel="noopener"
 &gt;使用ALAssetsLibrary读取所有照片&lt;/a&gt;，有中文的翻译的，记录吧&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://t.cn/zRVM33Q" target="_blank" rel="noopener"
 &gt;http://t.cn/zRVM33Q&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 中 通过UIImagePickerController选择图片后 UIImagePickerControllerDelegate方法的调用</title><link>https://zhangdapeng.dev/p/ios7-zhong-tong-guo-uiimagepickercontroller-xuan-ze-tu-pian-hou-uiimagepickercontrollerdelegate-fang-fa-de-diao-yong/</link><pubDate>Fri, 27 Jun 2025 09:45:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-tong-guo-uiimagepickercontroller-xuan-ze-tu-pian-hou-uiimagepickercontrollerdelegate-fang-fa-de-diao-yong/</guid><description>&lt;p&gt;图片选择完后的两个重要的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;imagePickerController:&lt;/span&gt;(UIImagePickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)picker &lt;span style="color:#a6e22e"&gt;didFinishPickingMediaWithInfo:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)info{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker dismissViewControllerAnimated:YES completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;{}];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [info objectForKey:UIImagePickerControllerEditedImage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 此处info 有六个值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerMediaType; // an NSString UTTypeImage)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerOriginalImage; // a UIImage 原始图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerEditedImage; // a UIImage 裁剪后图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerCropRect; // an NSValue (CGRect)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerMediaURL; // an NSURL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerReferenceURL // an NSURL that references an asset in the AssetsLibrary framework
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * UIImagePickerControllerMediaMetadata // an NSDictionary containing metadata from a captured photo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取图片后的操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;imagePickerControllerDidCancel:&lt;/span&gt;(UIImagePickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)picker{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker dismissViewControllerAnimated:YES completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;{}];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;记录下，这个方法很重要，要不然找不到选择的图片就完蛋了&lt;/p&gt;</description></item><item><title>iOS7 UIActionSheet中的UIActionSheetDelegate与UIImagePickerController的协作</title><link>https://zhangdapeng.dev/p/ios7-uiactionsheet-zhong-de-uiactionsheetdelegate-yu-uiimagepickercontroller-de-xie-zuo/</link><pubDate>Fri, 27 Jun 2025 09:45:23 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uiactionsheet-zhong-de-uiactionsheetdelegate-yu-uiimagepickercontroller-de-xie-zuo/</guid><description>&lt;p&gt;UIActionSheet中的UIActionSheetDelegate与UIImagePickerController的协作，实现图片来源的选择，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;actionSheet:&lt;/span&gt;(UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)actionSheet &lt;span style="color:#a6e22e"&gt;clickedButtonAtIndex:&lt;/span&gt;(NSInteger)buttonIndex{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImagePickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;picker&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIImagePickerController alloc]init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.delegate&lt;span style="color:#f92672"&gt;=&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.allowsEditing&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (buttonIndex){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//拍照
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.sourceType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIImagePickerControllerSourceTypeCamera;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//相册
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.sourceType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIImagePickerControllerSourceTypePhotoLibrary;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//图片库
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.sourceType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIImagePickerControllerSourceTypeSavedPhotosAlbum;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[UIDevice currentDevice] userInterfaceIdiom] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIUserInterfaceIdiomPhone){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:picker animated:YES completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIPopoverController &lt;span style="color:#f92672"&gt;*&lt;/span&gt; popOver &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIPopoverController alloc] initWithContentViewController: picker];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; popOver.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _popOverController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; popOver;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_popOverController presentPopoverFromRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inView:self.view
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; permittedArrowDirections:UIPopoverArrowDirectionUp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里加了一个UIPopoverController，但是UIPopoverController只能在ipad设备上面使用。&lt;/p&gt;</description></item><item><title>iOS7 中 UIActionSheet的简单应用</title><link>https://zhangdapeng.dev/p/ios7-zhong-uiactionsheet-de-jian-dan-ying-yong/</link><pubDate>Fri, 27 Jun 2025 09:45:21 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-uiactionsheet-de-jian-dan-ying-yong/</guid><description>&lt;p&gt;UIActionSheet简单的应用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;actionSheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;请选择背景图片的来源&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;取消&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destructiveButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:&lt;span style="color:#e6db74"&gt;@&amp;#34;拍照&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;相册&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;图片库&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionSheet.actionSheetStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIActionSheetStyleDefault;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[actionSheet showInView: self.view];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>修改navigationItem上的title 颜色和样式</title><link>https://zhangdapeng.dev/p/xiu-gai-navigationitem-shang-de-title-yan-se-he-yang-shi/</link><pubDate>Thu, 26 Jun 2025 14:55:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/xiu-gai-navigationitem-shang-de-title-yan-se-he-yang-shi/</guid><description>&lt;p&gt;今天正好做到这里，以为之前的设计是通过view的跳转，然后直接传递title过来，然后在viewDidLoad里面直接赋值，但是有遇到了一个比较傻眼的情况，接口只给我id，木有title，于是我就只有获取完title在赋值啦，于是找到了一个策略，就是在获取完数据后，直接使用下面的代码就好了，既可以修改样式还可以修改标题&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectZero];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont boldSystemFontOfSize:&lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.titleView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _personName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[label sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;文章参考：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/tongzhitao/article/details/9852633" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/tongzhitao/article/details/9852633&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 UIViewController中使用UIRefreshControl 实现 UITableView下拉刷新</title><link>https://zhangdapeng.dev/p/ios7-uiviewcontroller-zhong-shi-yong-uirefreshcontrol-shi-xian-uitableview-xia-la-shua-xin/</link><pubDate>Thu, 26 Jun 2025 14:55:28 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uiviewcontroller-zhong-shi-yong-uirefreshcontrol-shi-xian-uitableview-xia-la-shua-xin/</guid><description>&lt;p&gt;之前做了一个使用UITableViewController中实现刷新的方法，这里实现一个使用UIViewController实现下拉刷新，当果然要使用到UIRefreshControl。&lt;/p&gt;
&lt;p&gt;创建啥的我就不记录了，文件列一下&lt;/p&gt;
&lt;p&gt;MeCelebrityViewController.m&lt;/p&gt;
&lt;p&gt;MeCelebrityViewController.h&lt;/p&gt;
&lt;p&gt;MeCelebrityViewController.xib&lt;/p&gt;
&lt;p&gt;下面列出主要的实现过程&lt;/p&gt;
&lt;p&gt;第一步：组件的添加&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) UIRefreshControl&lt;span style="color:#f92672"&gt;*&lt;/span&gt; refreshControl;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;viewDidLoad的初始化&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//添加刷新
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_refreshControl &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIRefreshControl alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_refreshControl addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(refreshView:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_refreshControl setAttributedTitle:[[NSAttributedString alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;松手更新数据&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_dataTableView addSubview:_refreshControl];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的&lt;code&gt;_dataTableView&lt;/code&gt;是要自己添加的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat tableViewX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat tableViewY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat tableWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.navigationController.navigationBar.frame.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat tableHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds].size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_dataTableView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableView alloc] initWithFrame:CGRectMake(tableViewX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tableViewY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tableWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tableHeight)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UITableViewStylePlain];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_cellHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_dataTableView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_dataTableView.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:_dataTableView];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：实现下拉刷新的动作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;refreshView:&lt;/span&gt;(UIRefreshControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)refresh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; refresh.attributedTitle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSAttributedString alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;更新数据中...&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;formatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [formatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;MMM d, h:mm a&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lastUpdated &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;上次更新日期 %@&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [formatter stringFromDate:[NSDate date]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; refresh.attributedTitle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSAttributedString alloc] initWithString:lastUpdated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self initData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_dataTableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refresh endRefreshing];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果不是很完美，因为有遮挡的现象，不过流程走通了，下面开始自己的制作吧，如果有需要的帮助的话，请看下面的QQ群，加群交流&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.yourdeveloper.net/item/program-a-uitableview-with-pulldown-to-refresh/" target="_blank" rel="noopener"
 &gt;http://www.yourdeveloper.net/item/program-a-uitableview-with-pulldown-to-refresh/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.techrepublic.com/blog/software-engineer/ios-6-best-practices-introducing-the-uirefreshcontrol/" target="_blank" rel="noopener"
 &gt;http://www.techrepublic.com/blog/software-engineer/ios-6-best-practices-introducing-the-uirefreshcontrol/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 如何解决iOS瀑布流(UIScrollView或UITableView)运行不流畅</title><link>https://zhangdapeng.dev/p/ios7-ru-he-jie-jue-ios-pu-bu-liu-uiscrollview-huo-uitableview-yun-xing-bu-liu-chang/</link><pubDate>Thu, 26 Jun 2025 14:55:24 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-ru-he-jie-jue-ios-pu-bu-liu-uiscrollview-huo-uitableview-yun-xing-bu-liu-chang/</guid><description>&lt;p&gt;如果UITableView滑动太快，可能同时就发出了比如10个图片请求。这些请求虽然都在后台运行，但是它们可能在同一个时间点返回UI线程。这个时候如果加载图片到UIImageView太频繁，就会造成UI卡得严重。（虽然在new iPad和iPhone4s上看不出来）&lt;/p&gt;
&lt;p&gt;在找到这个问题的同时，也发现performSelectorAfterDelay这个方法，会堆积到UI线程空闲的时候执行。而dispatch_after或者dispatch_async都会直接插入UI线程当场执行。所以这个问题其实可以用performSelectorAfterDelay来解决，测试也是非常流畅，感觉不出一点点的卡。但会出现新的问题，那就是在滑动过程中，不会加载任何图片。知道scrollView停止的时候，图片才会出来。当然这不是理想的解决方法了。这个方法也没有解决异步过程集中到达UI线程的问题。然后采用了NSOperationQueue来解决这个问题。&lt;/p&gt;
&lt;p&gt;问题本身和UITableView加载不流畅是一样的。&lt;/p&gt;
&lt;h4 id="解决办法"&gt;&lt;a class="link" href="#1" &gt;解决办法&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;主要要做到一下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;除了UI部分，所有的加载操作都在后台完成。&lt;br&gt;
这一点可以通过dispatch或者performSelectorInBackground或者NSOperationQueue来实现。见：&lt;br&gt;
在iOS开发中利用GCD进行多线程编程&lt;br&gt;
iOS开发中使用NSOperationQueue进行多线程操作&lt;/li&gt;
&lt;li&gt;避免后台加载完成多个资源之后集中到达占用UI线程的处理时间太长。&lt;br&gt;
这一点可以通过NSOperationQueue来实现，将资源到UI的展现过程放在队列中逐个执行，且在每个操作完成之后进行强制等待，可以用usleep(int microSeconds)来解决。&lt;/li&gt;
&lt;li&gt;重用cell。&lt;br&gt;
创建cell一般是很慢的，一定要重用，甚至为了performance，可以在view创建之初就创建足够多的cell在重用队列中。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;参考文章&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.unieagle.net/2012/08/31/" target="_blank" rel="noopener"
 &gt;http://blog.unieagle.net/2012/08/31/&lt;/a&gt;如何解决ios瀑布流uiscrollview或uitableview运行不流畅/&lt;/p&gt;</description></item><item><title>iOS7 在Appdelegate.m中处理多个handleopenURL</title><link>https://zhangdapeng.dev/p/ios7-zai-appdelegatem-zhong-chu-li-duo-ge-handleopenurl/</link><pubDate>Thu, 26 Jun 2025 14:55:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zai-appdelegatem-zhong-chu-li-duo-ge-handleopenurl/</guid><description>&lt;p&gt;类似的情况如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [WeiboSDK handleOpenURL:url delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [FBAppCall handleOpenURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sourceApplication:sourceApplication
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fallbackHandler:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(FBAppCall &lt;span style="color:#f92672"&gt;*&lt;/span&gt;call) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;In fallback handler&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;facebook要调用我的handleOpenUrl，但是Sina Weibo也要调用,导致的结果是如何进行区分，然后进行不同的url调用。&lt;/p&gt;
&lt;p&gt;其实很简单，对于这样的接口其实在ios中有过scheme的设置，完全可以判断url的前缀是否含有你自己设置的前缀，可以如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[url absoluteString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([string hasPrefix:&lt;span style="color:#e6db74"&gt;@&amp;#34;微博url的前缀&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [WeiboSDK handleOpenURL:url delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([string hasPrefix:&lt;span style="color:#e6db74"&gt;@&amp;#34;Facebook的url的前缀&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [WXApi handleOpenURL:url delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;嗯，记录下&lt;/p&gt;</description></item><item><title>iOS7 - 如何在Objective C中创建一个空白的透明PNG</title><link>https://zhangdapeng.dev/p/ios7-ru-he-zai-objective-c-zhong-chuang-jian-yi-ge-kong-bai-de-tou-ming-png/</link><pubDate>Thu, 26 Jun 2025 14:55:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-ru-he-zai-objective-c-zhong-chuang-jian-yi-ge-kong-bai-de-tou-ming-png/</guid><description>&lt;p&gt;google后的结果很神奇，这里就是一小段的代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGraphicsBeginImageContextWithOptions(CGSizeMake(&lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;), NO, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;blank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.16kan.com/question/detail/109385.html" target="_blank" rel="noopener"
 &gt;http://www.16kan.com/question/detail/109385.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>IOS7 UIScrollView滚动视图和UIPageControl分页控件的简单应用</title><link>https://zhangdapeng.dev/p/ios7-uiscrollview-gun-dong-shi-tu-he-uipagecontrol-fen-ye-kong-jian-de-jian-dan-ying-yong/</link><pubDate>Thu, 26 Jun 2025 14:55:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uiscrollview-gun-dong-shi-tu-he-uipagecontrol-fen-ye-kong-jian-de-jian-dan-ying-yong/</guid><description>&lt;p&gt;我这里是使用故事版（storyboard）实现的。&lt;/p&gt;
&lt;p&gt;创建一个简单的storyboard，在里面添加一个UIViewContoller，在view里面添加一个PageControl和一个ScrollView，并做链接。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pageScroll;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIPageControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pageControl;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在监听一个pageControl的value change事件，这里不知道怎么添加的话，请关注这里341268380，我们的技术交流群。&lt;/p&gt;
&lt;p&gt;同时添加一个存储要展示图片的数组变量&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;photoList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;changePage:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时要加入&lt;/p&gt;
&lt;p&gt;UIScrollViewDelegate&lt;/p&gt;
&lt;p&gt;代理&lt;/p&gt;
&lt;p&gt;基础工作做完之后，开始我们的过程实现&lt;/p&gt;
&lt;p&gt;初始化的工作如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;bg_welcome1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;bg_welcome2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;bg_welcome3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _photoList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIImage imageWithContentsOfFile:img1],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIImage imageWithContentsOfFile:img2],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIImage imageWithContentsOfFile:img3],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self getEmptyUIImage],nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger pageCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [_photoList count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageControl.currentPage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageControl.numberOfPages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pageCount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;320.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;568.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSInteger i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;pageCount;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; i;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// frame = CGRectInset(frame, 10.0, 10.0);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:[_photoList objectAtIndex:i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pageView.contentMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIViewContentModeScaleAspectFill;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pageView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_pageScroll addSubview:pageView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize pageScrollViewSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.contentSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(pageScrollViewSize.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; _photoList.count, pageScrollViewSize.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;监控PageControl的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;changePage:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 更新Scroll View到正确的页面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; _pageControl.currentPage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_pageScroll scrollRectToVisible:frame animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;视图滚动的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;scrollViewDidScroll:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat pageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _pageScroll.frame.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 在滚动超过页面宽度的50%的时候，切换到新的页面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; page &lt;span style="color:#f92672"&gt;=&lt;/span&gt; floor((_pageScroll.contentOffset.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pageWidth&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;pageWidth) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageControl.currentPage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; page;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (page &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//点击登陆按钮后切换到storyboard界面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIStoryboard &lt;span style="color:#f92672"&gt;*&lt;/span&gt;storyboard &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIStoryboard storyboardWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;MainStoryboardIOS7Iphone5&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:[storyboard instantiateInitialViewController]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animated:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从上面可以看出，其实我是加了一个空白的图片&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;getEmptyUIImage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContextWithOptions(CGSizeMake(_pageScroll.frame.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.frame.size.height), NO, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;blank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; blank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorSpaceRef colorSpace&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CGColorSpaceCreateDeviceRGB();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CGBitmapContextCreate(NULL,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.frame.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.frame.size.height,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _pageScroll.frame.size.width&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(uint32_t), colorSpace, kCGBitmapByteOrder32Little&lt;span style="color:#f92672"&gt;|&lt;/span&gt;kCGImageAlphaNoneSkipLast);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIColor clearColor] setFill];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGImageRef image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CGBitmapContextCreateImage(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRelease(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorSpaceRelease(colorSpace);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;emptyUIImage&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIImage imageWithCGImage:image];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGImageRelease(image);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; emptyUIImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本上就可以了。github代码地址：https://github.com/zhangda89/UserGuid.git&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.entlib.net/?p=2627" target="_blank" rel="noopener"
 &gt;http://www.entlib.net/?p=2627&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS中多个UITextField的键盘处理-视图位移</title><link>https://zhangdapeng.dev/p/ios-zhong-duo-ge-uitextfield-de-jian-pan-chu-li-shi-tu-wei-yi/</link><pubDate>Thu, 26 Jun 2025 14:55:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-duo-ge-uitextfield-de-jian-pan-chu-li-shi-tu-wei-yi/</guid><description>&lt;p&gt;当有多个UITextField的时候，一个比较好的处理方式就是实现视图移位，实现的方法也很简单。&lt;/p&gt;
&lt;p&gt;首先是加入UITextField的代理UITextFieldDelegate。&lt;/p&gt;
&lt;p&gt;其次，在代理的&lt;code&gt;-(void) textFieldDidBeginEditing:(UITextField *)textField&lt;/code&gt;方法中实现&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat keyboardHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;216.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((textField.frame.origin.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; keyboardHeight &lt;span style="color:#f92672"&gt;+&lt;/span&gt; textField.frame.size.height) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; ([[UIScreen mainScreen] bounds].size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//此时，编辑框被键盘盖住，则对视图做对应的位移
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, [[UIScreen mainScreen] bounds].size.height &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;120.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; textField.frame.origin.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; keyboardHeight &lt;span style="color:#f92672"&gt;+&lt;/span&gt; textField.frame.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; [[UIScreen mainScreen] bounds].size.height &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;120.0&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//偏移量=编辑框原点Y值+键盘高度+编辑框高度-屏幕高度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _scrollView.frame&lt;span style="color:#f92672"&gt;=&lt;/span&gt;frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里面的具体位置可以自己调整，算法也是不唯一的&lt;/p&gt;
&lt;p&gt;当到达最后一个UITextField的时候，要隐藏键盘，这里如何做呢，如下所示：&lt;/p&gt;
&lt;p&gt;在代理&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (BOOL)textFieldShouldReturn:(UITextField *)textField&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;方法中&lt;/p&gt;
&lt;p&gt;最后一个失去焦点的时候&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_bloodTextField resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _scrollView.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;frame.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds].size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_scrollView.frame&lt;span style="color:#f92672"&gt;=&lt;/span&gt;frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;判断的话我使用这样子实现的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([_bloodTextField isFirstResponder])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是不是很简单&lt;/p&gt;</description></item><item><title>点击UITextField 跳出UIDatePicker以选取日期(生日,NSDate)</title><link>https://zhangdapeng.dev/p/dian-ji-uitextfield-tiao-chu-uidatepicker-yi-xuan-qu-ri-qi-sheng-ri-nsdate/</link><pubDate>Thu, 26 Jun 2025 14:55:02 +0000</pubDate><guid>https://zhangdapeng.dev/p/dian-ji-uitextfield-tiao-chu-uidatepicker-yi-xuan-qu-ri-qi-sheng-ri-nsdate/</guid><description>&lt;p&gt;首先添加一个UITextField。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITextField alloc] initWithFrame:CGRectMake(birthdayLabelX &lt;span style="color:#f92672"&gt;+&lt;/span&gt; birthdayLabelWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; birthdayLabelY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textFieldWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textFieldHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[_userinfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;birthday&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; textFieldDebugColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10008&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_brithdayTextField.returnKeyType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIReturnKeyNext;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_scrollView addSubview:_brithdayTextField];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其次，实现UITextFieldDelegate的代理方法，在&lt;code&gt;-(void) textFieldDidBeginEditing:(UITextField *)textField&lt;/code&gt;方法中实现&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([_brithdayTextField isFirstResponder])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 建立 UIDatePicker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _datePicker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDatePicker alloc]init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _datelocale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSLocale alloc] initWithLocaleIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_CN&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _datePicker.locale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _datelocale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _datePicker.timeZone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSTimeZone timeZoneWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;GMT&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _datePicker.datePickerMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDatePickerModeDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _brithdayTextField.inputView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _datePicker;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 建立 UIToolbar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIToolbar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;toolBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIToolbar alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(cancelPicker)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;space &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolBar.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:space,right,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _brithdayTextField.inputAccessoryView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后在完成选取的时候，进行下面的操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;cancelPicker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;formatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [formatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _brithdayTextField.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[formatter stringFromDate:_datePicker.date]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _scrollView.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds].size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _scrollView.frame&lt;span style="color:#f92672"&gt;=&lt;/span&gt;frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_brithdayTextField resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.hsin.tw/2013/ios-dev-tap-uitextfield-popup-uidatepicker-to-pick-date/" target="_blank" rel="noopener"
 &gt;http://blog.hsin.tw/2013/ios-dev-tap-uitextfield-popup-uidatepicker-to-pick-date/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 使用KVO实现大文件copy（复制）</title><link>https://zhangdapeng.dev/p/ios7-shi-yong-kvo-shi-xian-da-wen-jian-copy-fu-zhi/</link><pubDate>Thu, 26 Jun 2025 11:45:09 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-shi-yong-kvo-shi-xian-da-wen-jian-copy-fu-zhi/</guid><description>&lt;p&gt;之前的一篇文章里面有说关于大文件的copy，这里介绍一下使用kvo的方式，进行文件copy（复制），其实就是检测文件copy的进度。&lt;/p&gt;
&lt;p&gt;代码如下:建立两个类FileHandle和Computer&lt;/p&gt;
&lt;p&gt;Computer.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Computer.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileCopyKVODemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Durban on 13-12-20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;Computer.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;FileHandle.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Computer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; filehandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _filehandle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;homePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSHomeDirectory();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;srcPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [homePath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;android系统框架的介绍.avi&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;targetPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [homePath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;android系统框架的介绍1.avi&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _filehandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[FileHandle alloc] initWithSrcPath:srcPath withTargetPath:targetPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_filehandle addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forKeyPath:&lt;span style="color:#e6db74"&gt;@&amp;#34;readSize&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSKeyValueObservingOptionNew
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;copyAction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_filehandle runCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;observeValueForKeyPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)keyPath &lt;span style="color:#a6e22e"&gt;ofObject:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)object &lt;span style="color:#a6e22e"&gt;change:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)change &lt;span style="color:#a6e22e"&gt;context:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)context
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([keyPath isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;readSize&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([object isKindOfClass:[FileHandle &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;readSieNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [change objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;new&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; readSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [readSieNum floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (FileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)object;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; fileSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; file.fileSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; ret &lt;span style="color:#f92672"&gt;=&lt;/span&gt; readSize &lt;span style="color:#f92672"&gt;/&lt;/span&gt; fileSize &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%0.1f%%&amp;#34;&lt;/span&gt;,ret);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Computer.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Computer.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileCopyKVODemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Durban on 13-12-20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FileHandle&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Computer&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt; , &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) FileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filehandle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;copyAction&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FileHandle.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileHandle.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileCopyKVODemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Durban on 13-12-20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;FileHandle.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FileHandle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; srcPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _srcPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; targetPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _targetPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;initWithSrcPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)srcPath &lt;span style="color:#a6e22e"&gt;withTargetPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)targetPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _srcPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [srcPath &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _targetPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [targetPath &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) runCopy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//读取大文件，并写入大文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *homePath = NSHomeDirectory();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *srcPath = [homePath stringByAppendingPathComponent:@&amp;#34;android学习路线图介绍.avi&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *targetPath = [homePath stringByAppendingPathComponent:@&amp;#34;android学习路线图介绍1.avi&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; success &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager createFileAtPath:_targetPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contents:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attributes:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(success)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;成功创建文件 ：%@&amp;#34;&lt;/span&gt;,_targetPath);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;infile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileHandle fileHandleForWritingAtPath:_targetPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;outfile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileHandle fileHandleForReadingAtPath:_srcPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取文件的尺寸
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileAttr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager attributesOfItemAtPath:_srcPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileSizeNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileAttr objectForKey:NSFileSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isEnd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.fileSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileSizeNum longLongValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;isEnd) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger subleng &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.fileSize &lt;span style="color:#f92672"&gt;-&lt;/span&gt; _readSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(subleng &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isEnd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [outfile readDataToEndOfFile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [outfile readDataOfLength:&lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.readSize &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [outfile seekToFileOffset:_readSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [infile writeData:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [infile closeFile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [outfile closeFile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FileHandle.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileHandle.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileCopyKVODemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Durban on 13-12-20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FileHandle&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;srcPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;targetPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt; ,&lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; fileSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; readSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;initWithSrcPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)srcPath &lt;span style="color:#a6e22e"&gt;withTargetPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)targetPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;runCopy&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例调用的代码-实现过程是这样子的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FileCopyKVODemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Durban on 13-12-20.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;Computer.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Computer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;computer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[Computer alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [computer copyAction];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// insert code here...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gowhich得到的结果是，文件进行了完整的copy，并且能进行正常使用，没有出现文件损坏。看看结果吧。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.356 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 成功创建文件 ：/Users/davidzhang/android系统框架的介绍1.avi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.789 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.883 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.884 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.884 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.885 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.885 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.886 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.886 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:43.887 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.139 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.140 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.141 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.141 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.142 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.142 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.143 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.143 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.144 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.145 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:44.145 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.041 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.041 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.042 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.043 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.043 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.054 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.055 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.056 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.056 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.057 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.057 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.058 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.058 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.633 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.634 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.635 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.635 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.636 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.636 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.637 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.637 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.638 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.639 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.639 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.640 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.640 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.640 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.641 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.641 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.642 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.642 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-12-20 10:13:46.643 FileCopyKVODemo&lt;span style="color:#f92672"&gt;[&lt;/span&gt;8446:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 0.0%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;。。。。。。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里自己可以进行调整的，比如百分比的小数位可以调整大点，都是可以的。&lt;/p&gt;</description></item><item><title>iOS7 UITextView 退出键盘的方式</title><link>https://zhangdapeng.dev/p/ios7-uitextview-tui-chu-jian-pan-de-fang-shi/</link><pubDate>Thu, 26 Jun 2025 11:45:03 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uitextview-tui-chu-jian-pan-de-fang-shi/</guid><description>&lt;p&gt;关于UITextView 退出键盘的方式，google后找到了几个比较好的方法。&lt;/p&gt;
&lt;p&gt;第一种方法：程序是有导航条的，可以在导航条上面加多一个Done的按钮，用来退出键盘，当然要先实UITextViewDelegate。代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textViewDidBeginEditing:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;done &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(leaveEditMode)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; done; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textViewDidEndEditing:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;leaveEditMode&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.textView resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二种方法：如果UITextview里不用回车键，可以把回车键当做退出键盘的响应键。代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - UITextView Delegate Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textView:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView &lt;span style="color:#a6e22e"&gt;shouldChangeTextInRange:&lt;/span&gt;(NSRange)range &lt;span style="color:#a6e22e"&gt;replacementText:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)text
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([text isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [textView resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三种方法：在弹出的键盘上面加一个view来放置退出键盘的Done按钮。代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat profileX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; hInterval;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat profileY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; areaLabel.frame.size.height &lt;span style="color:#f92672"&gt;+&lt;/span&gt; areaLabel.frame.origin.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat profileWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; hInterval;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat profileHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;profile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITextView alloc] initWithFrame:CGRectMake(profileX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; profileY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; profileWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; profileHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;profile.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;请输入简介信息&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile.layer setBorderColor:[[UIColor lightGrayColor] CGColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile.layer setBorderWidth:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile.layer setCornerRadius:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;profile.editable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;profile.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_scrollView addSubview:profile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIToolbar &lt;span style="color:#f92672"&gt;*&lt;/span&gt; topView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIToolbar alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[topView setBarStyle:UIBarStyleDefault];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnSpace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt; completeButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;完成&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UIBarButtonItemStyleDone
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(dismissKeyBoard)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt; buttonsArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:btnSpace,completeButton,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[topView setItems:buttonsArray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[profile setInputAccessoryView:topView];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;隐藏键盘的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dismissKeyBoard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIApplication sharedApplication] sendAction:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(resignFirstResponder)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; to:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; from:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forEvent:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以试试吧。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/kylinbl/article/details/6694897" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/kylinbl/article/details/6694897&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 UITextField 隐藏自身软键盘、点击Return自动转到下个文本框、轻触背景隐藏软键盘</title><link>https://zhangdapeng.dev/p/ios7-uitextfield-yin-cang-zi-shen-ruan-jian-pan-dian-ji-return-zi-dong-zhuan-dao-xia-ge-wen-ben-kuang-qing-chu-bei-jing-yin-cang-ruan-jian-pan/</link><pubDate>Thu, 26 Jun 2025 11:37:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uitextfield-yin-cang-zi-shen-ruan-jian-pan-dian-ji-return-zi-dong-zhuan-dao-xia-ge-wen-ben-kuang-qing-chu-bei-jing-yin-cang-ruan-jian-pan/</guid><description>&lt;p&gt;关于UITextField的几种常用的方法，隐藏自身软键盘、点击Return自动转到下个文本框、轻触背景隐藏软键盘，经过google的查找，现在总结如下：&lt;/p&gt;
&lt;h4 id="一隐藏自身软键盘"&gt;&lt;a class="link" href="#1" &gt;一、隐藏自身软键盘&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;　　当对于有多个UITextField控件都想通过点击“Return”来隐藏自身软键盘的情况，这时的最好办法是使用Did End on Exit事件。在点击软键盘右下角的“Return”按钮后，会触发该事件。&lt;/p&gt;
&lt;p&gt;　　该事件有一个sender参数表示当前文本框，这样便可以编写一个通用的事件处理方法（.m文件）——&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;TextField_DidEndOnExit:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 隐藏键盘.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sender resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　然后在.h文件中填写该方法的声明——&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;TextField_DidEndOnExit:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　回到storyboard，并按command+option+enter打开辅助窗口，使辅助窗口显示.h文件。&lt;/p&gt;
&lt;p&gt;　　选中一个UITextField控件，点击鼠标右键弹出面板，鼠标左键按住Did End on Exit事件旁边的圆圈，然后拖曳到右侧.h文件的TextField_DidEndOnExit方法上，便会建立好事件连接。&lt;/p&gt;
&lt;p&gt;　　随后按照同样的做法，将其他UITextField控件的Did End on Exit事件也连接到TextField_DidEndOnExit方法。&lt;/p&gt;
&lt;p&gt;　　运行一下，可发现每个文本框的软键盘都可以通过点击“Return”来隐藏了。&lt;/p&gt;
&lt;h4 id="二点击return自动转到下个文本框"&gt;&lt;a class="link" href="#2" &gt;二、点击Return自动转到下个文本框&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;　　当页面中有很多个文本框时，如果每次都需要点文本框激活软键盘、输入后点击Return隐藏软键盘、再点击下一个文本框……这样操作起来太繁琐了。&lt;/p&gt;
&lt;p&gt;　　于是我们希望能够实现点击Return时能够自动转到下一个文本框。尤其是对于最后一个文本框，希望能够在点击Return时执行下一步操作。&lt;/p&gt;
&lt;p&gt;　　例如对于登录页面。它上面有 账号文本框（nameTextField）、密码文本框（passTextField）、登录按钮（loginButton）。&lt;/p&gt;
&lt;p&gt;　　我们希望——点击账号文本框软键盘的Return时跳转到密码文本框，点击密码文本框软键盘的Return时执行登录。&lt;/p&gt;
&lt;p&gt;　　因为这两个文本框的功能不同，不能像上一节那样写一个TextField_DidEndOnExit做统一处理，而应该分别建立各自的事件处理方法。&lt;/p&gt;
&lt;p&gt;　　回到storyboard，右击账号文本框（nameTextField）弹出面板，按住Did End on Exit事件旁边的圆圈，然后拖曳到右侧.h文件的空白地方，此时会弹出一个对话框给方法命名。输入名称（nameTextField_DidEndOnExit）后回车确定，便自动生成了该事件方法。&lt;/p&gt;
&lt;p&gt;　　随后按照同样的做法，为密码文本框（passTextField）的Did End on Exit事件连接方法（passTextField_DidEndOnExit）。&lt;/p&gt;
&lt;p&gt;　　来到.m文件，填写具体代码——&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;nameTextField_DidEndOnExit:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 将焦点移至下一个文本框.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_passTextField becomeFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　对于账号文本框转密码文本框，不需要隐藏软键盘，只需要调用becomeFirstResponder激活新的文本框就行了。&lt;/p&gt;
&lt;p&gt;　　对于密码文本框Return后执行登录。因为不再需要显示软键盘，所以还是得调用resignFirstResponder隐藏软键盘，然后触发登录按钮（loginButton）的UIControlEventTouchUpInside事件进行登录。&lt;/p&gt;
&lt;p&gt;　　运行一下，可发现已经达到我们希望的效果了。点击账号文本框软键盘的Return时跳转到密码文本框，点击密码文本框软键盘的Return时执行登录。&lt;/p&gt;
&lt;p&gt;　　怎么都是“Return”，转换文本框与执行登录明明是不同的功能？&lt;/p&gt;
&lt;p&gt;　　于是将账号文本框的Return Key属性设为“Next”，将密码文本框的Return Key属性设为“Done”，使界面与功能一致。&lt;/p&gt;
&lt;h4 id="三轻触背景隐藏软键盘"&gt;&lt;a class="link" href="#3" &gt;三、轻触背景隐藏软键盘&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;　　只能通过Return关闭软键盘太不灵活了，应该提供轻触背景隐藏软键盘的功能。&lt;/p&gt;
&lt;p&gt;　　在storyboard，点击背景View，将它的Custom Class设置为UIControl，这样才会出现Touch Down事件。&lt;/p&gt;
&lt;p&gt;　　右击背景View弹出面板，按住Touch Down事件旁边的圆圈，然后拖曳到右侧.h文件的空白地方建立该事件的处理方法。&lt;/p&gt;
&lt;p&gt;　　来到.m文件，填写具体代码——&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;View_TouchDown:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 发送resignFirstResponder.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIApplication sharedApplication] sendAction:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(resignFirstResponder) to:nil from:nil forEvent:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.cnblogs.com/zyl910/archive/2013/03/29/ios_textfield_keyboard.html" target="_blank" rel="noopener"
 &gt;http://www.cnblogs.com/zyl910/archive/2013/03/29/ios_textfield_keyboard.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 中NSPredicate的用法</title><link>https://zhangdapeng.dev/p/ios7-zhong-nspredicate-de-yong-fa/</link><pubDate>Thu, 26 Jun 2025 11:37:41 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-nspredicate-de-yong-fa/</guid><description>&lt;p&gt;在其他的语言项目开发中，都会经常使用到正则，在ios中关于正则的话，就要考虑一下NSPredicate，关于NSPredicate的使用方法，一般来说这种情况还是蛮多的，比如你从文件中读入了一个array1，然后想把程序中的一个array2中符合array1中内容的元素过滤出来。&lt;/p&gt;
&lt;p&gt;正常傻瓜一点就是两个for循环，一个一个进行比较，这样效率不高，而且代码也不好看。&lt;/p&gt;
&lt;p&gt;其实一个循环或者无需循环就可以搞定了，那就需要用搞 NSPredicate这个类了&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;1）例子一，一个循环&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayFilter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;pict&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;blackrain&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;ip&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;I am a picture.&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;I am a guy&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;I am gagaga&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;ipad&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;iphone&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我想过滤arrayContents的话只要循环 arrayFilter就好了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [arrayFilter count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; count; i &lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[arrayFilter objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filterPredicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF CONTAINS %@&amp;#34;&lt;/span&gt;, arrayItem];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Filtered array with filter %@, %@&amp;#34;&lt;/span&gt;, arrayItem, [arrayContents filteredArrayUsingPredicate:filterPredicate]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然以上代码中arrayContent最好用mutable 的，这样就可以直接filter了，NSArray是不可修改的。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;2）例子二，无需循环&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayFilter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;abc1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc2&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayContent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;a1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc4&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc2&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;thePredicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;NOT (SELF in %@)&amp;#34;&lt;/span&gt;, arrayFilter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[arrayContent filterUsingPredicate:thePredicate];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样arrayContent过滤出来的就是不包含 arrayFilter中的所有item了。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;3）生成文件路径下文件集合列表&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;4）match的用法&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;简单比较&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz-999.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF == %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;match里like的用法（类似Sql中的用法）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz*.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF like %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;大小写比较&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[c]表示忽略大小写，[d]表示忽略重音，可以在一起使用，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz*.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF like[cd] %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.使用正则&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;d{3}&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.png&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//imagexyz－123.png
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF matches %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;em&gt;总结：&lt;/em&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;1） 当使用聚合类的操作符时是可以不需要循环的&lt;/p&gt;
&lt;p&gt;2）当使用单个比较类的操作符时可以一个循环来搞定&lt;/p&gt;
&lt;p&gt;PS，例子 一中尝试使用[@&amp;ldquo;SELF CONTAINS %@&amp;rdquo;, arrayFilter] 来过滤会挂调，因为CONTAINS时字符串比较操作符，不是集合操作。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>iOS7 验证邮箱的合法性</title><link>https://zhangdapeng.dev/p/ios7-yan-zheng-you-xiang-de-he-fa-xing/</link><pubDate>Thu, 26 Jun 2025 11:37:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-yan-zheng-you-xiang-de-he-fa-xing/</guid><description>&lt;p&gt;关于用于输入的邮箱地址的内容的合法性，在IOS7中的做法与之前的是一样的。&lt;/p&gt;
&lt;p&gt;第一种方法：最简单的就是利用系统的NSPredicate&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//利用正则表达式验证
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isValidateEmail:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)email {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;emailRegex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.[A-Za-z]{2,4}&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;emailTest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF MATCHES %@&amp;#34;&lt;/span&gt;, emailRegex]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [emailTest evaluateWithObject:email];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二种方法：通过区分字符串&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;validateEmail:&lt;/span&gt;(NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; [email rangeOfString:&lt;span style="color:#e6db74"&gt;@&amp;#34;@&amp;#34;&lt;/span&gt;].length) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; [email rangeOfString:&lt;span style="color:#e6db74"&gt;@&amp;#34;.&amp;#34;&lt;/span&gt;].length))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSCharacterSet&lt;span style="color:#f92672"&gt;*&lt;/span&gt; tmpInvalidCharSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSCharacterSet alphanumericCharacterSet] invertedSet];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableCharacterSet&lt;span style="color:#f92672"&gt;*&lt;/span&gt; tmpInvalidMutableCharSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[tmpInvalidCharSet mutableCopy] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tmpInvalidMutableCharSet removeCharactersInString:&lt;span style="color:#e6db74"&gt;@&amp;#34;_-&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *使用compare option 来设定比较规则，如
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *NSCaseInsensitiveSearch是不区分大小写
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *NSLiteralSearch 进行完全比较,区分大小写
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *NSNumericSearch 只比较定符串的个数，而不比较字符串的字面值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRange range1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [email rangeOfString:&lt;span style="color:#e6db74"&gt;@&amp;#34;@&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSCaseInsensitiveSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取得用户名部分
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; userNameString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [email substringToIndex:range1.location];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray&lt;span style="color:#f92672"&gt;*&lt;/span&gt; userNameArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [userNameString componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;.&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; string &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; userNameArray)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRange rangeOfInavlidChars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [string rangeOfCharacterFromSet: tmpInvalidMutableCharSet];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(rangeOfInavlidChars.length &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; [string isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取得域名部分
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;domainString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [email substringFromIndex:range1.location&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;domainArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [domainString componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;.&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; domainArray)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRange rangeOfInavlidChars&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[string rangeOfCharacterFromSet:tmpInvalidMutableCharSet];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(rangeOfInavlidChars.length &lt;span style="color:#f92672"&gt;!=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; [string isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;经过测试第一种方法好用。第二种方法尚未测试。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/justinjing0612/article/details/7310237" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/justinjing0612/article/details/7310237&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 UITextView 和 UITextField中键盘输入的内容的获取</title><link>https://zhangdapeng.dev/p/ios7-uitextview-he-uitextfield-zhong-jian-pan-shu-ru-de-nei-rong-de-huo-qu/</link><pubDate>Thu, 26 Jun 2025 11:37:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uitextview-he-uitextfield-zhong-jian-pan-shu-ru-de-nei-rong-de-huo-qu/</guid><description>&lt;p&gt;UITextField中的内容的获取方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;textFieldDidEndEditing:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取输入的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [textField text];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UITextView中的内容的获取方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textView:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView &lt;span style="color:#a6e22e"&gt;shouldChangeTextInRange:&lt;/span&gt;(NSRange)range &lt;span style="color:#a6e22e"&gt;replacementText:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)text 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([text isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;]) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [textView resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(range.location &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;)&lt;span style="color:#75715e"&gt;//如果输入超过规定的字数20，就不再让输入 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS7 怎样判断ios app 第一次启动</title><link>https://zhangdapeng.dev/p/ios7-zen-yang-pan-duan-ios-app-di-yi-ci-qi-dong/</link><pubDate>Thu, 26 Jun 2025 11:15:56 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zen-yang-pan-duan-ios-app-di-yi-ci-qi-dong/</guid><description>&lt;p&gt;关于第一次启动iOS APP的宣传画面的制作中的判断，判断第一次启动，判断是否是第一次启动。关于这个我查找了相关资料，进行了google资料搜索。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;一个有用的例子是发送一个分析实例。这可能是一个很好的方法来确定有多少人下载实用应用程序。有人会说：“但是，嘿，苹果AppStore已经告诉我，应用程序的下载量了”。&lt;/p&gt;
&lt;p&gt;流行的解决方案是在大多数地方是用[NSUserDefaults standardUserDefaults的一个关键，如果它不存在，这意味着这是应用程序启动，否则，它不是第一次。&lt;/p&gt;
&lt;p&gt;你可以搜索的关键，如果它未设置运行 first-time-code，并设置它，但在app的其余部分你将无法知道它是不是第一次运行（除非你使用一个全局变量）&lt;/p&gt;
&lt;p&gt;因此，我建议我的解决方案：&lt;/p&gt;
&lt;p&gt;在appdelegate.m中找到 “&lt;code&gt;application:didFinishLaunchingWithOptions:&lt;/code&gt;”方法, 添加以下代码:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[[NSUserDefaults standardUserDefaults] boolForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;everLaunched&amp;#34;&lt;/span&gt;]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;everLaunched&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;firstLaunch&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;firstLaunch&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;总的解决办法是 2 个key: @”everLaunched”判断用户以前是否登录,&lt;/p&gt;
&lt;p&gt;@”firstLaunch” 用来开发者在程序的其他部分判断.&lt;/p&gt;
&lt;p&gt;在第一次启动的时候 key @”everLaunched” 不会被赋址的, 并且设置为YES. @”firstLaunch”被设置为 YES.&lt;/p&gt;
&lt;p&gt;在程序的其他部分用以下代码判断:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[NSUserDefaults standardUserDefaults] boolForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;firstLaunch&amp;#34;&lt;/span&gt;]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 这里判断是否第一次 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alert&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;第一次&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message:&lt;span style="color:#e6db74"&gt;@&amp;#34;进入App&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;我知道了&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert show]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/kylinbl/article/details/8638988" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/kylinbl/article/details/8638988&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 NSNotificationCenter的作用</title><link>https://zhangdapeng.dev/p/ios7-nsnotificationcenter-de-zuo-yong/</link><pubDate>Thu, 26 Jun 2025 11:15:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-nsnotificationcenter-de-zuo-yong/</guid><description>&lt;p&gt;关于NSNotificationCenter的使用，之前一直想使用一下，结果今天就真的使用上了。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;NSNotificationCenter有什么作用，简单说之，就是两个不相干的对象之间可以通过他来传递消息，只要你把相关发送的消息和处理的事件在他那里注册就行了。&lt;/p&gt;
&lt;p&gt;我们可以这样理解：NSNotificationCenter就是一个信息中心，有很多用户已经声明他们需要这些信息。当有信息更新的时候，通过这个NSNotificationCenter就可以以广播的形式，将信息更新的消息在整个应用程序中间广播，对于那些注册消息侦听的用户就可以受到该消息，没有注册的用户就无法接收该消息。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;使用方法如下：&lt;/p&gt;
&lt;p&gt;第一步：定义一个方法，当注册信息侦听的对象，接受到消息后就调用该函数作为消息相应的函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;update:&lt;/span&gt;(NSNotificationCenter&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)notification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addHeadImage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateMe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：对象注册，并关连消息。实质上也就是注册事件的侦听，可以单独调用，也可以放在自己的函数内部进行调用。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(update:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateMe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在函数中进行调用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sinaLogin:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(update:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateMe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WBAuthorizeRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [WBAuthorizeRequest request];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; request.redirectURI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kRedirectURI;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; request.scope &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;all&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [WeiboSDK sendRequest:request];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步：在要发出通知消息的地方调用。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSNotificationCenter defaultCenter] postNotificationName:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateMe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第四步：使用完后，别忘了注销掉该消息的侦听函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSNotificationCenter defaultCenter] removeObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateMe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实这里我是放在了我的调用函数里面，如果你觉的你的函数在调用完之后不去注销，也可以去掉的，然后在其他的地方进行注销。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/sjzsp/article/details/6777700" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/sjzsp/article/details/6777700&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 中 给UIScrollView 添加自适应的背景图片</title><link>https://zhangdapeng.dev/p/ios7-zhong-gei-uiscrollview-tian-jia-zi-shi-ying-de-bei-jing-tu-pian/</link><pubDate>Thu, 26 Jun 2025 11:15:38 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-gei-uiscrollview-tian-jia-zi-shi-ying-de-bei-jing-tu-pian/</guid><description>&lt;p&gt;要做一个长的能滚动的页面，在IOS7中这个能滚动的话，可以使用UIScrollView，然后使用背景图片来解决我们大部分的ui问题，可以节省我们写ui的时间。&lt;/p&gt;
&lt;p&gt;下面来看看代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scrollView&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIScrollView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scrollView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithPatternImage:[UIImageimageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;detail.png&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[scrollView setContentSize:CGSizeMake(&lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;960&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:scrollView];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实现很简单，下面你就可以自己去添加一些其他的view到上面去了，嘿嘿&lt;/p&gt;</description></item><item><title>iOS7 中 UIImageview图片变成圆角</title><link>https://zhangdapeng.dev/p/ios7-zhong-uiimageview-tu-pian-bian-cheng-yuan-jiao/</link><pubDate>Thu, 26 Jun 2025 11:15:35 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-zhong-uiimageview-tu-pian-bian-cheng-yuan-jiao/</guid><description>&lt;p&gt;之前做图片的圆角是使用了一个别人写的类库叫做GBPathImageView，实现起来是相当的复杂啊，重写了UIImageview这个类，不过呢用起来也是很不错的，但是遇到的问题是，在进行图片异步加载的时候，要怎么处理呢，首先是要拿到这个图片，但是图片异步的话，图片首先是不在本地的，那么你重新绘制的话就是一张默认的空图片，最后你要获取新图片再进行绘制，导致的结果就是重复做了两次操作，但是在cell这样的操作，感觉起来是相当的复杂，在你进行这个操作的时候，滑动的cell要做什么呢？&lt;/p&gt;
&lt;p&gt;好了，不多说说了，解决方法其实很简答，只怪自己对原生的类库不了解，也不怪别人的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultImageString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;person_default&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithFrame:CGRectMake(imageViewX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageView setImageWithURL:[NSURL URLWithString:[storage fetchCelebrityPicWithId:_personId]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; placeholderImage:[UIImage imageWithContentsOfFile:defaultImageString]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; usingActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CALayer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lay &lt;span style="color:#f92672"&gt;=&lt;/span&gt; imageView.layer;&lt;span style="color:#75715e"&gt;//获取ImageView的层
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [lay setMasksToBounds:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [lay setCornerRadius:&lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;圆角的尺寸大家自己定义就好了。&lt;/p&gt;
&lt;p&gt;效果很明显。大家可以尝试一下。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考的文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://my.oschina.net/mejinke/blog/70634" target="_blank" rel="noopener"
 &gt;http://my.oschina.net/mejinke/blog/70634&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 解决刷新重用cell时字体重复问题</title><link>https://zhangdapeng.dev/p/ios7-jie-jue-shua-xin-zhong-yong-cell-shi-zi-ti-chong-fu-wen-ti/</link><pubDate>Thu, 26 Jun 2025 10:32:40 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-jie-jue-shua-xin-zhong-yong-cell-shi-zi-ti-chong-fu-wen-ti/</guid><description>&lt;p&gt;不知道为啥刷新Cell的时候出现字体的重复，字体的覆盖现象。&lt;/p&gt;
&lt;p&gt;google了下，发现解决的方法很简单的。如下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;CelebrityCheckTableCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注册要使用的cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView registerClass:[UITableViewCell &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forCellReuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//解决刷新重用cell事字体重复问题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;subviews &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithArray:cell.contentView.subviews];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;subview &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; subviews) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [subview removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取行的个数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [_dataDic objectAtIndex:row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;dict = %@&amp;#34;,dict);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//cell高度参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat cellHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cell.frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rankBgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor alloc] initWithRed:&lt;span style="color:#ae81ff"&gt;178.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;178.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;178.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(row &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rankBgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor alloc] initWithRed:&lt;span style="color:#ae81ff"&gt;218.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;118.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;159.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//排名 计算x,y
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (cellHeight &lt;span style="color:#f92672"&gt;-&lt;/span&gt; rankHeight) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rank.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rankBgColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rank.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rank.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont boldSystemFontOfSize:&lt;span style="color:#ae81ff"&gt;17.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rank.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [rank.layer setCornerRadius:&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,row&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.contentView addSubview:rank];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//名称 计算x,y
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;150.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rankX &lt;span style="color:#f92672"&gt;+&lt;/span&gt; rankWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (cellHeight &lt;span style="color:#f92672"&gt;-&lt;/span&gt; nameHeight) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont boldSystemFontOfSize:&lt;span style="color:#ae81ff"&gt;17.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [name.layer setCornerRadius:&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[dict valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.contentView addSubview:name];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//分数 计算x,y
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat scoreWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat scoreHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat scoreX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nameX &lt;span style="color:#f92672"&gt;+&lt;/span&gt; nameWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat scoreY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (cellHeight &lt;span style="color:#f92672"&gt;-&lt;/span&gt; scoreHeight) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [score setFrame:CGRectMake(scoreX, scoreY, scoreWidth, scoreHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont boldSystemFontOfSize:&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentRight;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [score.layer setCornerRadius:&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[dict valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;check_sum&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.contentView addSubview:score];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.selectionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellSelectionStyleNone;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;得到的结果是，效果很好，解决了我的问题。&lt;/p&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/developer_zhang/article/details/15026097" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/developer_zhang/article/details/15026097&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://justcoding.iteye.com/blog/1476197" target="_blank" rel="noopener"
 &gt;http://justcoding.iteye.com/blog/1476197&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://ddkangfu.blog.51cto.com/311989/465557/" target="_blank" rel="noopener"
 &gt;http://ddkangfu.blog.51cto.com/311989/465557/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7开发 实现打电话 发短信 发送邮件的功能</title><link>https://zhangdapeng.dev/p/ios7-kai-fa-shi-xian-da-dian-hua-fa-duan-xin-fa-song-you-jian-de-gong-neng/</link><pubDate>Thu, 26 Jun 2025 10:32:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-kai-fa-shi-xian-da-dian-hua-fa-duan-xin-fa-song-you-jian-de-gong-neng/</guid><description>&lt;p&gt;最近搞ios开发遇到一个很小的问题，就是在你的应用里面给你一个号码，如何用这个号码进行拨打电话，想了半天，还是google给力。找到了一篇帖子，so，总结如下&lt;/p&gt;
&lt;p&gt;1、调用 自带mail&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;mailto://xx@xx&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、调用 电话phone&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;tel://8008808888&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、调用 SMS&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;sms://800888&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4、调用自带 浏览器 safari&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://www.hzlzh.com&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="发送短信"&gt;&lt;a class="link" href="#1" &gt;发送短信&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;调用phone可以传递号码，调用SMS 只能设定号码，不能初始化SMS内容。&lt;/p&gt;
&lt;p&gt;若需要传递内容可以做如下操作：&lt;/p&gt;
&lt;p&gt;加入：MessageUI.framework&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#import &amp;lt;MessageUI/MFMessageComposeViewController.h&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;实现代理：MFMessageComposeViewControllerDelegate&lt;/p&gt;
&lt;p&gt;调用sendSMS函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//内容，收件人列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sendSMS:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)bodyOfMessage &lt;span style="color:#a6e22e"&gt;recipientList:&lt;/span&gt;(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)recipients
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MFMessageComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;controller &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[MFMessageComposeViewController alloc] init] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([MFMessageComposeViewController canSendText])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; controller.body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bodyOfMessage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; controller.recipients &lt;span style="color:#f92672"&gt;=&lt;/span&gt; recipients;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; controller.messageComposeDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentModalViewController:controller animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 处理发送完的响应结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;messageComposeViewController:&lt;/span&gt;(MFMessageComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#a6e22e"&gt;didFinishWithResult:&lt;/span&gt;(MessageComposeResult)result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissModalViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (result &lt;span style="color:#f92672"&gt;==&lt;/span&gt; MessageComposeResultCancelled)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message cancelled&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(result &lt;span style="color:#f92672"&gt;==&lt;/span&gt; MessageComposeResultSent)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message sent&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message failed&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="发送邮件"&gt;&lt;a class="link" href="#2" &gt;发送邮件&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;导入&lt;code&gt;#import &amp;lt;MessageUI/MFMailComposeViewController.h&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;实现代理：MFMailComposeViewControllerDelegate&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//发送邮件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sendMail:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)subject &lt;span style="color:#a6e22e"&gt;content:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)content{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MFMailComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;controller &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[MFMailComposeViewController alloc] init] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([MFMailComposeViewController canSendMail])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [controller setSubject:subject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [controller setMessageBody:content isHTML:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; controller.mailComposeDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentModalViewController:controller animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//邮件完成处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;mailComposeController:&lt;/span&gt;(MFMailComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#a6e22e"&gt;didFinishWithResult:&lt;/span&gt;(MFMailComposeResult)result &lt;span style="color:#a6e22e"&gt;error:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissModalViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (result &lt;span style="color:#f92672"&gt;==&lt;/span&gt; MessageComposeResultCancelled)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message cancelled&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(result &lt;span style="color:#f92672"&gt;==&lt;/span&gt; MessageComposeResultSent)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message sent&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message failed&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认发送短信的界面为英文的，解决办法为：&lt;/p&gt;
&lt;p&gt;在.xib 中的Localization添加一組chinese就ok了&lt;/p&gt;</description></item><item><title>iOS7 如何使用iOS手势UIGestureRecognizer</title><link>https://zhangdapeng.dev/p/ios7-ru-he-shi-yong-ios-shou-shi-uigesturerecognizer/</link><pubDate>Wed, 25 Jun 2025 11:35:12 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-ru-he-shi-yong-ios-shou-shi-uigesturerecognizer/</guid><description>&lt;p&gt;今天终于有时间接触了UIGestureRecognizer，果然很好玩，下面关于他的一些使用，以下内容完全来自于网上，尚未做过测试。&lt;/p&gt;
&lt;p&gt;UIKit中包含了UIGestureRecognizer类，用于检测发生在设备中的手势。UIGestureRecognizer是一个抽象类，定义了所有手势的基本行为，它有下面一些子类用于处理具体的手势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拍击UITapGestureRecognizer (任意次数的拍击)&lt;/li&gt;
&lt;li&gt;向里或向外捏UIPinchGestureRecognizer (用于缩放)&lt;/li&gt;
&lt;li&gt;摇动或者拖拽UIPanGestureRecognizer&lt;/li&gt;
&lt;li&gt;滑动UISwipeGestureRecognizer (以任意方向)&lt;/li&gt;
&lt;li&gt;旋转UIRotationGestureRecognizer (手指朝相反方向移动)&lt;/li&gt;
&lt;li&gt;长按UILongPressGestureRecognizer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于不同类型的手势识别器，具有不同的配置属性。比如UITapGestureRecognizer，可以配置拍击次数。界面接收到手势之后，可以发送一 个消息，用于处理响应手势动作后的任务。当然，不同的手势识别器，发送的消息方法也会有所不同。下面列举几个具体示例代码：&lt;/p&gt;
&lt;p&gt;一个手指，拍击两次手势&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 创建一个手势识别器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;oneFingerTwoTaps &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UITapGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(oneFingerTwoTaps)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Set required taps and number of touches
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[oneFingerTwoTaps setNumberOfTapsRequired:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[oneFingerTwoTaps setNumberOfTouchesRequired:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Add the gesture to the view
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:oneFingerTwoTaps];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;消息方法&lt;/span&gt;oneFingerTwoTaps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)oneFingerTwoTaps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Action: One finger, two taps&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个手指，拍击两次手势&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;twoFingersTwoTaps &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UITapGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(twoFingersTwoTaps)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[twoFingersTwoTaps setNumberOfTapsRequired:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[twoFingersTwoTaps setNumberOfTouchesRequired:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:twoFingersTwoTaps];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;消息方法&lt;/span&gt;twoFingersTwoTaps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)twoFingersTwoTaps {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Action: Two fingers, two taps&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个手指向上、向下滑动手势&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 向上滑动
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISwipeGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;oneFingerSwipeUp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UISwipeGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(oneFingerSwipeUp:)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[oneFingerSwipeUp setDirection:UISwipeGestureRecognizerDirectionUp];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:oneFingerSwipeUp];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;oneFingerSwipeUp:&lt;/span&gt;(UISwipeGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)recognizer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint point &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [recognizer locationInView:[self view]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Swipe up - start location: %f,%f&amp;#34;&lt;/span&gt;, point.x, point.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 向下滑动
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISwipeGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;oneFingerSwipeDown &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UISwipeGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(oneFingerSwipeDown:)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[oneFingerSwipeDown setDirection:UISwipeGestureRecognizerDirectionDown];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:oneFingerSwipeDown];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;oneFingerSwipeDown:&lt;/span&gt;(UISwipeGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)recognizer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint point &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [recognizer locationInView:[self view]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Swipe down - start location: %f,%f&amp;#34;&lt;/span&gt;, point.x, point.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;旋转手势&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIRotationGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;twoFingersRotate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UIRotationGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(twoFingersRotate:)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:twoFingersRotate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;twoFingersRotate:&lt;/span&gt;(UIRotationGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)recognizer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Convert the radian value to show the degree of rotation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Rotation in degrees since last change: %f&amp;#34;&lt;/span&gt;, [recognizer rotation] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; M_PI));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;向里或向外捏的手势&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIPinchGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;twoFingerPinch &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UIPinchGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(twoFingerPinch:)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:twoFingerPinch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;twoFingerPinch:&lt;/span&gt;(UIPinchGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)recognizer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Pinch scale: %f&amp;#34;&lt;/span&gt;, recognizer.scale);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;twoFingersTwoTaps &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[[UITapGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(twoFingersTwoTaps)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[twoFingersTwoTaps setNumberOfTapsRequired:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[twoFingersTwoTaps setNumberOfTouchesRequired:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[self view] addGestureRecognizer:twoFingersTwoTaps];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 消息方法twoFingersTwoTaps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;twoFingersTwoTaps&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Action: Two fingers, two taps&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.cnblogs.com/y041039/archive/2012/07/11/2586629.html" target="_blank" rel="noopener"
 &gt;http://www.cnblogs.com/y041039/archive/2012/07/11/2586629.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.cocoachina.com/newbie/basic/2012/0604/4322.html" target="_blank" rel="noopener"
 &gt;http://www.cocoachina.com/newbie/basic/2012/0604/4322.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iOS7 下使用UITapGestureRecognizer 实现图片放大缩小的原理（自创）</title><link>https://zhangdapeng.dev/p/ios7-xia-shi-yong-uitapgesturerecognizer-shi-xian-tu-pian-fang-da-suo-xiao-de-yuan-li-zi-chuang/</link><pubDate>Wed, 25 Jun 2025 11:35:08 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-xia-shi-yong-uitapgesturerecognizer-shi-xian-tu-pian-fang-da-suo-xiao-de-yuan-li-zi-chuang/</guid><description>&lt;p&gt;关于在IOS7下实现点击UIImageView是实现放大图片的原理（完全是自己参考其他的文脏，自己总结出来的，如有雷同，那咱就是心有灵犀啦）&lt;/p&gt;
&lt;p&gt;我这里的情况是，在UITableView中的UITableviewCell中使用UIImageView，UIImageView是放在cell中的。这里的实现代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imagepath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;girl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;jpg&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:imagepath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GBPathImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;headImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[GBPathImageView alloc] initWithFrame:CGRectMake(imageX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageHeight)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; image:image
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pathType:GBPathImageViewTypeCircle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pathColor:[UIColor whiteColor]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; borderColor:[UIColor whiteColor]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pathWidth:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;headImageView.userInteractionEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;headImageView.multipleTouchEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;headImageView.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; row;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITapGestureRecognizer alloc] initWithTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(showBigImage:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tap.view.tag&lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)headImageView.image;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tap.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[headImageView addGestureRecognizer:tap];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[cell.contentView addSubview:headImageView];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里就是使用了UITapGestureRecognizer，添加了排击的事件。&lt;/p&gt;
&lt;p&gt;注意点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一点：UIImageview的userInteractionEnabled和multipleTouchEnabled的设置，不然不起作用&lt;/li&gt;
&lt;li&gt;第二点：代理UIGestureRecognizerDelegate的引入&lt;/li&gt;
&lt;li&gt;第三点：tag的使用，这个是为了后面的操作，主要是因为加了tag我们就会知道是哪个UIImageView被点击了，从而做一些其他的处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么关于方法图片和缩小图片的方法如下：&lt;/p&gt;
&lt;p&gt;放大图片的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showBigImage:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UITapGestureRecognizer&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tag = %d&amp;#34;&lt;/span&gt;,tap.view.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageViewer&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIImageView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;closeTap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITapGestureRecognizer alloc] initWithTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(hideBigImage:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; closeTap.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewer.multipleTouchEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewer.userInteractionEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageViewer addGestureRecognizer:closeTap];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewer.animationDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewer.animationRepeatCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageViewer setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tableview.frame.origin.y,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tableview.frame.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tableview.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageViewer startAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imagepath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;girl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;jpg&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:imagepath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageViewer setImage:image];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIWindow &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mainWindow&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIApplication sharedApplication].delegate.window;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mainWindow.rootViewController.view addSubview:imageViewer];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;缩小图片的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;hideBigImage:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITapGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UITapGestureRecognizer&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tap.view removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;大概的原理全在代码中了，如何放大图片，如何做出图片更加好的效果，这个是后面优化要做的。&lt;/p&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://hi.baidu.com/jt_one/item/95babe35583f3598b80c0316" target="_blank" rel="noopener"
 &gt;http://hi.baidu.com/jt_one/item/95babe35583f3598b80c0316&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.cocoachina.com/bbs/simple/?t70503.html" target="_blank" rel="noopener"
 &gt;http://www.cocoachina.com/bbs/simple/?t70503.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://stackoverflow.com/questions/11552184/uitapgesturerecognizer-not-working-in-uiimageview" target="_blank" rel="noopener"
 &gt;http://stackoverflow.com/questions/11552184/uitapgesturerecognizer-not-working-in-uiimageview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://blog.csdn.net/zjwen1006/article/details/6916591" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/zjwen1006/article/details/6916591&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://hi.baidu.com/moon_2009/item/b3eca83262582d86c2cf291f" target="_blank" rel="noopener"
 &gt;http://hi.baidu.com/moon_2009/item/b3eca83262582d86c2cf291f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iOS7 屏幕高度，状态栏高度，标签栏尺寸等获取方式</title><link>https://zhangdapeng.dev/p/ios7-ping-mu-gao-du-zhuang-tai-lan-gao-du-biao-qian-lan-chi-cun-deng-huo-qu-fang-shi/</link><pubDate>Wed, 25 Jun 2025 11:35:04 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-ping-mu-gao-du-zhuang-tai-lan-gao-du-biao-qian-lan-chi-cun-deng-huo-qu-fang-shi/</guid><description>&lt;p&gt;关于新的获取屏幕高度，状态栏尺寸，标签栏尺寸的获取方法，找了多个资料和文章，其方法总结如下&lt;/p&gt;
&lt;h3 id="app尺寸去掉状态栏"&gt;&lt;a class="link" href="#1" &gt;App尺寸，去掉状态栏&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ UIScreen mainScreen ].applicationFrame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;r.height = %f,r.width = %f,r.x = %f,r.y = %f&amp;#34;&lt;/span&gt;,r.size.height,r.size.width,r.origin.x,r.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gowhich得到的结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-11-28 12:09:22.188 寻艺&lt;span style="color:#f92672"&gt;[&lt;/span&gt;49308:70b&lt;span style="color:#f92672"&gt;]&lt;/span&gt; r.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 548.000000,r.width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 320.000000,r.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.000000,r.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 20.000000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="屏幕尺寸"&gt;&lt;a class="link" href="#2" &gt;屏幕尺寸&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect rx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIScreen mainScreen].bounds;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;rx.height = %f,rx.width = %f,rx.x = %f,rx.y = %f&amp;#34;&lt;/span&gt;,rx.size.height,rx.size.width,rx.origin.x,rx.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得到的结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-11-28 12:09:22.189 寻艺&lt;span style="color:#f92672"&gt;[&lt;/span&gt;49308:70b&lt;span style="color:#f92672"&gt;]&lt;/span&gt; rx.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 568.000000,rx.width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 320.000000,rx.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.000000,rx.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.000000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="状态栏尺寸"&gt;&lt;a class="link" href="#3" &gt;状态栏尺寸&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIApplication sharedApplication] statusBarFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;rect.height = %f,rect.width = %f,rect.x = %f,rect.y = %f&amp;#34;&lt;/span&gt;,rect.size.height,rect.size.width,rect.origin.x,rect.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得到的结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-11-28 12:14:18.972 寻艺&lt;span style="color:#f92672"&gt;[&lt;/span&gt;49617:70b&lt;span style="color:#f92672"&gt;]&lt;/span&gt; rect.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 20.000000,rect.width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 320.000000,rect.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.000000,rect.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.000000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="iphone中获取屏幕分辨率的方法"&gt;&lt;a class="link" href="#4" &gt;iPhone中获取屏幕分辨率的方法&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGSize size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rect.size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; size.height;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另外，设计UI的时候，注意用户最小的触控面积。有2种说法&lt;/p&gt;
&lt;p&gt;&lt;code&gt;44*44&lt;/code&gt; 好像是来自sdk&lt;/p&gt;
&lt;p&gt;&lt;code&gt;64*64&lt;/code&gt; 来自standford讲义&lt;/p&gt;
&lt;p&gt;参考文章:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/linzhiji/article/details/6764738" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/linzhiji/article/details/6764738&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS7 下修改 UINavigationBar 的背景色和设置标题的颜色</title><link>https://zhangdapeng.dev/p/ios7-xia-xiu-gai-uinavigationbar-de-bei-jing-se-he-she-zhi-biao-ti-de-yan-se/</link><pubDate>Wed, 25 Jun 2025 11:34:55 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-xia-xiu-gai-uinavigationbar-de-bei-jing-se-he-she-zhi-biao-ti-de-yan-se/</guid><description>&lt;p&gt;关于修改 UINavigationBar 的背景色和设置标题的颜色，至于以前是如何设置的我到现在已经忘的差不多了，因为总是在不同的平台和语言之间进行切换，偶尔某个会耽搁时间比较久，反正之前的iOS7之前是不是这样设置的，到时候后来的结果出现了问题。&lt;/p&gt;
&lt;p&gt;下面简单的介绍下再iOS7下是如何进行设置的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//导航条背景色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navBackgroundBarImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;bg_head&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;																 ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithContentsOfFile:navBackgroundBarImage] forBarMetrics:UIBarMetricsDefault];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//字体大小、颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attributes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;							[UIColor whiteColor],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;							NSForegroundColorAttributeName, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setTitleTextAttributes:attributes];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将这几行代码添加到&lt;code&gt;-(void) viewDidLoad;&lt;/code&gt;方法中，顺便将图片改为自己想要的图片，就会有结果了。自己试试看看&lt;/p&gt;</description></item><item><title>iOS7 下操作 UIToolbar UINavigationController UINavigationBar UIBarButtonItem</title><link>https://zhangdapeng.dev/p/ios7-xia-cao-zuo-uitoolbar-uinavigationcontroller-uinavigationbar-uibarbuttonitem/</link><pubDate>Wed, 25 Jun 2025 11:34:51 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-xia-cao-zuo-uitoolbar-uinavigationcontroller-uinavigationbar-uibarbuttonitem/</guid><description>&lt;p&gt;关于UIToolbar，UINavigationController，UINavigationBar，UIBarButtonItem在ios7的使用的简单的介绍，经过搜索资料做了如下的一些汇集&lt;/p&gt;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UIBarButtonItem&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;1: UIBarButtonItem 隐藏的方式&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.btnPunctuation setWidth:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2: UIBarButtonItem 获取所在父视图中的frame 相当于将 UIBarButtonItem 转换成 UIView&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;barButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;targetView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[barButtonItem performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(view)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3:设置自定义字体和 系统的self.title 保持风格完全一致.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;titleButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton setFrame:(CGRect){&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;}];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton setContentEdgeInsets:UIEdgeInsetsMake(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;社会活动&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton.titleLabel setFont:[UIFont boldSystemFontOfSize:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[titleButton.titleLabel setShadowOffset:(CGSize){&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;}];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationItem setTitleView:titleButton];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UIBarButtonItem&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UINavigationBar&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;1: 修改导航控制器背景图片的方式(IOS5以上)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注: 通过appearance可以设置全局的控件初始化外观.不过在初始化成功以后,有单独样式需求亦可用同样的方法修改.&lt;/p&gt;
&lt;p&gt;UINavigationBar的标准高度是44,在iOS7之前可以通过44+X的方式实现背景+阴影的效果.从iOS7以后就不行了.&lt;/p&gt;
&lt;p&gt;iOS7对UINavigationBar的标准进行重新的定义,其高度可以延伸到状态栏.所以44+20的高度等于64.&lt;/p&gt;
&lt;p&gt;而刚刚说的44+X方式不再适用于iOS7,iOS7的新规范是64+1.背景图和阴影将单独来设定,代码如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//iOS7 新背景图片设置方法 高度 必需是 64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;toolbar_background_iOS7Test&amp;#34;&lt;/span&gt;] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//iOS7 阴影需单独设定 UIColor clearColor 是去掉字段 1像素阴影
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setShadowImage:[UIImage Help_imageWithColor:[UIColor clearColor]]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2:为UINavigationBar设置半透明的背景效果:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setTranslucent:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注:在iOS7中 默认生成 UINavigationBar的translucent属性为YES. 自动添加遮罩模糊效果.&lt;/p&gt;
&lt;p&gt;3:修改UINavigationBar的背景颜色(iOS7以上)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UINavigationBar&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UINavigationController&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;1: 修改UINavigationController的高度&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.navigationBar setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2:激活 UINavigationControllerDelegate的方式&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationController.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3:为 UINavigationController 设置 默认的 navigationBar&lt;/p&gt;
&lt;p&gt;这里只提供一下思路:&lt;/p&gt;
&lt;p&gt;继承:UINavigationController以后重写 如下两个方法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithRootViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)rootViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithRootViewController:rootViewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self Base_backAction_initNavigationBar:rootViewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;pushViewController:&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)viewController &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super pushViewController:viewController animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self Base_backAction_initNavigationBar:viewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-UINavigationController&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;
&lt;p&gt;果然使用起来还是有些变化的&lt;/p&gt;</description></item><item><title>iOS webView 中 代码控制滚动条的位置</title><link>https://zhangdapeng.dev/p/ios-webview-zhong-dai-ma-kong-zhi-gun-dong-tiao-de-wei-zhi/</link><pubDate>Wed, 25 Jun 2025 11:34:35 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-webview-zhong-dai-ma-kong-zhi-gun-dong-tiao-de-wei-zhi/</guid><description>&lt;p&gt;得到当前webView 中 Scroll的坐标&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; scrollPosition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[DataWebView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;window.pageYOffset&amp;#34;&lt;/span&gt;] intValue];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得到当前webView页&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sizePage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[DataWebView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;document.getElementById(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;foo&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;).offsetHeight;&amp;#34;&lt;/span&gt;] intValue];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;跳到你指定的位置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[DataWebView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;window.scrollBy(0,%d);&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;] ];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;0，200&lt;/code&gt;改为你所要改的坐标&lt;/p&gt;</description></item><item><title>iOS7 UITableViewCell cellForRowAtIndexPath最新实现方法</title><link>https://zhangdapeng.dev/p/ios7-uitableviewcell-cellforrowatindexpath-zui-xin-shi-xian-fang-fa/</link><pubDate>Wed, 25 Jun 2025 10:26:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios7-uitableviewcell-cellforrowatindexpath-zui-xin-shi-xian-fang-fa/</guid><description>&lt;p&gt;最近在开发iOS7的应用发现有个方法似乎是有问题的，就是下面这个&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面分别查看之前的实现过程和现在的实现过程&lt;/p&gt;
&lt;p&gt;之前的实现过程如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;TeleplayPlayTableCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [_dataTableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取行的个数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the cell...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.detailTextLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;good&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;iOS7下面的实现过程如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;TeleplayPlayTableCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注册要使用的cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView registerClass:[UITableViewCell &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forCellReuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [_dataTableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取行的个数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the cell...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.detailTextLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;good&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;大家可以尝试一下，如果有其他问题，请指教。&lt;/p&gt;</description></item><item><title>iOS 为UINavigationBar设置背景图片</title><link>https://zhangdapeng.dev/p/ios-wei-uinavigationbar-she-zhi-bei-jing-tu-pian/</link><pubDate>Wed, 25 Jun 2025 09:58:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-wei-uinavigationbar-she-zhi-bei-jing-tu-pian/</guid><description>&lt;p&gt;ios开发中，对于如何设置UINavigationBar的背景图片的设置，我搜索到了如下的一些代码&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;第一种方法：针对局部NavigationBar进行背景更改的方法：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIDevice currentDevice] systemVersion] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;backgroundImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;myBackgroundImage.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (version &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;第二种方法：全局更改NavigationBar背景的方法:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;barBackground&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;topNavigationBar.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didMoveToSuperview&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//iOS5 only
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self respondsToSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(setBackgroundImage:forBarMetrics:)])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setBackgroundImage:[self barBackground] forBarMetrics:UIBarMetricsDefault];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//this doesn&amp;#39;t work on iOS5 but is needed for iOS4 and earlier
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//draw image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self barBackground] drawInRect:rect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在iPhone开发中, 有时候我们想给导航条添加背景图片, 实现多样化的导航条效果, 用其他方法往往无法达到理想的效果, 经过网上搜索及多次实验, 确定如下最佳实现方案:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;第三种方法：为UINavigatonBar增加如下Category:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UINavigationBar&lt;/span&gt; (CustomImage)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed: &lt;span style="color:#e6db74"&gt;@&amp;#34;NavigationBar.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[image drawInRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, self.frame.size.width, self.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如, 在我的项目中, 添加如下代码:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* input: The image and a tag to later identify the view */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UINavigationBar&lt;/span&gt; (CustomImage)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed: &lt;span style="color:#e6db74"&gt;@&amp;#34;title_bg.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[image drawInRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, self.frame.size.width, self.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FriendsPageViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor purpleColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self initWithRootViewController:[[RegPageViewController alloc] init]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 简单实现在导航栏处添加SearchBar</title><link>https://zhangdapeng.dev/p/ios-jian-dan-shi-xian-zai-dao-hang-lan-chu-tian-jia-searchbar/</link><pubDate>Wed, 25 Jun 2025 09:58:04 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-jian-dan-shi-xian-zai-dao-hang-lan-chu-tian-jia-searchbar/</guid><description>&lt;p&gt;导航栏出添加搜索框，应该是大多数app应用中需要使用的，这里简单展示一下添加的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect mainViewBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.navigationController.view.bounds;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;customSearchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc] initWithFrame:CGRectMake(CGRectGetMinX(mainViewBounds),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRectGetMinY(mainViewBounds) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;44.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.view.bounds.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;customSearchBar.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;customSearchBar.showsCancelButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController.view addSubview: customSearchBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect viewBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.navigationController.view.bounds;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view setFrame:CGRectMake(CGRectGetMinX(viewBounds),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRectGetMinY(viewBounds) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRectGetWidth(viewBounds),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRectGetHeight(viewBounds) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UIImage 图片处理：截图，缩放，设定大小，存储</title><link>https://zhangdapeng.dev/p/uiimage-tu-pian-chu-li-jie-tu-suo-fang-she-ding-da-xiao-cun-chu/</link><pubDate>Wed, 25 Jun 2025 09:57:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/uiimage-tu-pian-chu-li-jie-tu-suo-fang-she-ding-da-xiao-cun-chu/</guid><description>&lt;p&gt;图片的处理大概分 截图(capture), 缩放(scale), 设定大小(resize), 存储(save)&lt;/p&gt;
&lt;p&gt;1.等比率缩放&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;scaleImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;toScale:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;)scaleSize
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(CGSizeMake(image.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; scaleSize, image.size.height &lt;span style="color:#f92672"&gt;*&lt;/span&gt; scaleSize);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [image drawInRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, image.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; scaleSize, image.size.height &lt;span style="color:#f92672"&gt;*&lt;/span&gt; scaleSize)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scaledImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; scaledImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.自定长宽&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;reSizeImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;toSize:&lt;/span&gt;(CGSize)reSize
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [image drawInRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, reSize.width, reSize.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;reSizeImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reSizeImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.处理某个特定View&lt;/p&gt;
&lt;p&gt;只要是继承UIView的object 都可以处理&lt;/p&gt;
&lt;p&gt;必须先import QuzrtzCore.framework&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;captureView:&lt;/span&gt;(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)theView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; theView.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(rect.size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [theView.layer renderInContext:context];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; img;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.储存图片&lt;/p&gt;
&lt;p&gt;储存图片这里分成储存到app的文件里和储存到手机的图片库里&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;储存到app的文件里&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSHomeDirectory()stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;]stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;image.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIImagePNGRepresentation(image) writeToFile:pathatomically:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把要处理的图片, 以image.png名称存到app home下的Documents目录里&lt;/p&gt;
&lt;p&gt;2)储存到手机的图片库里(必须在真机使用，模拟器无法使用)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGImageRef screen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGetScreenImage();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithCGImage:screen];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGImageRelease(screen);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGetScreenImage(); &lt;span style="color:#75715e"&gt;// 原来是private(私有)api, 用来截取整个画面,不过SDK 4.0后apple就开放了
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;//====================================================================&lt;/p&gt;
&lt;p&gt;以下代码用到了Quartz Framework 和 Core Graphics Framework. 在workspace的framework目录里添加这两个framework.在UIKit里，图像类UIImage和CGImageRef的画图操作都是通过Graphics Context来完成。Graphics Context封装了变换的参数，使得在不同的坐标系里操作图像非常方便。缺点就是，获取图像的数据不是那么方便。下面会给出获取数据区的代码。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从UIView中获取图像相当于窗口截屏。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(ios提供全局的全屏截屏函数UIGetScreenView(). 如果需要特定区域的图像，可以crop一下)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGImageRef screen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGetScreenImage();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithCGImage:screen];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;对于特定UIView的截屏。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（可以把当前View的layer，输出到一个ImageContext中，然后利用这个ImageContext得到UIImage）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;captureView:&lt;/span&gt; (UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)theView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; theView.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(rect.size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [theView.layer renderInContext:context];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; img;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;如果需要裁剪指定区域。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（可以path &amp;amp; clip，以下例子是建一个200x200的图像上下文，再截取出左上角）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGraphicsBeginImageContext(CGMakeSize(&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextRefcontext&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGraphicsPushContext(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ...把图写到context中，省略[indent]CGContextBeginPath();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextAddRect(CGMakeRect(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextClosePath();[&lt;span style="color:#f92672"&gt;/&lt;/span&gt;indent]CGContextDrawPath();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextFlush(); &lt;span style="color:#75715e"&gt;// 强制执行上面定义的操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIGraphicsPopContext();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;存储图像。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（分别存储到home目录文件和图片库文件。）&lt;/p&gt;
&lt;p&gt;存储到目录文件是这样&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;image.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若要存储到图片库里面&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;
&lt;li&gt;互相转换UImage和CGImage。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（UImage封装了CGImage, 互相转换很容易）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; imUI&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGImageRef imCG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;imUI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage initWithCGImage:imCG];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;imCG &lt;span style="color:#f92672"&gt;=&lt;/span&gt; imUI.CGImage;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;
&lt;li&gt;从CGImage上获取图像数据区。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（在apple dev上有QA, 不过好像还不支持ios）&lt;/p&gt;
&lt;p&gt;下面给出一个在ios上反色的例子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;invertContrast:&lt;/span&gt;(UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)img
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGImageRef inImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; img.CGImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef ctx;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CFDataRef m_DataRef;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m_DataRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGDataProviderCopyData(CGImageGetDataProvider(inImage));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGImageGetWidth( inImage );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGImageGetHeight( inImage );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; bpc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGImageGetBitsPerComponent(inImage);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; bpp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGImageGetBitsPerPixel(inImage);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; bpl &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGImageGetBytesPerRow(inImage);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;UInt8&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; m_PixelBuf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;UInt8&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) CFDataGetBytePtr(m_DataRef);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CFDataGetLength(m_DataRef);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;len %d&amp;#34;&lt;/span&gt;, length);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;width=%d, height=%d&amp;#34;&lt;/span&gt;, width, height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;1=%d, 2=%d, 3=%d&amp;#34;&lt;/span&gt;, bpc, bpp,bpl);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; index &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; length; index &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];&lt;span style="color:#75715e"&gt;// b
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];&lt;span style="color:#75715e"&gt;// g
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; m_PixelBuf[index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];&lt;span style="color:#75715e"&gt;// r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ctx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGBitmapContextCreate(m_PixelBuf, width, height, bpb, bpl, CGImageGetColorSpace( inImage ), kCGImageAlphaPremultipliedFirst );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGImageRef imageRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGBitmapContextCreateImage (ctx);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; rawImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithCGImage:imageRef];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRelease(ctx);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; rawImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;
&lt;li&gt;显示图像数据区。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（显示图像数据区，也就是&lt;code&gt;unsigned char*&lt;/code&gt;转为&lt;code&gt;graphics context&lt;/code&gt;或者&lt;code&gt;UIImage&lt;/code&gt;或和&lt;code&gt;CGImageRef&lt;/code&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextRef ctx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGBitmapContextCreate(pixelBuf,width,height, bitsPerComponent,bypesPerLine, colorSpace,kCGImageAlphaPremultipliedLast );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGImageRef imageRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGBitmapContextCreateImage (ctx);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithCGImage:imageRef];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;ss.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIImagePNGRepresentation(self.image) writeToFile:path atomically:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGContextRelease(ctx);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得到图像数据区后就可以很方便的实现图像处理的算法。&lt;/p&gt;</description></item><item><title>UITabbar 相关属性设置</title><link>https://zhangdapeng.dev/p/uitabbar-xiang-guan-shu-xing-she-zhi/</link><pubDate>Wed, 25 Jun 2025 09:57:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitabbar-xiang-guan-shu-xing-she-zhi/</guid><description>&lt;p&gt;背景颜色的设置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabbarBackgroundImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;bg_tabbar@2x&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UITabBar appearance] setBackgroundImage:[UIImage imageWithContentsOfFile:tabbarBackgroundImage]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tabbar选择后的背景设置&lt;span style="color:#960050;background-color:#1e0010"&gt;（这里由于图片的大小，做了一下图片的大小调整）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:tabbarBackgroundImage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGSize size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;resizeImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self reSizeImage:image toSize:size];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UITabBar appearance] setSelectionIndicatorImage:resizeImage];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tabbar字体的颜色设置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor grayColor],UITextAttributeTextColor, nil] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加一个图片重新调整的函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;reSizeImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;toSize:&lt;/span&gt;(CGSize)reSize
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [image drawInRect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, reSize.width, reSize.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;reSizeImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reSizeImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 5中定制Tabbar很简单，如何让选中的Tab显示不同图片</title><link>https://zhangdapeng.dev/p/ios-5-zhong-ding-zhi-tabbar-hen-jian-dan-ru-he-rang-xuan-zhong-de-tab-xian-shi-bu-tong-tu-pian/</link><pubDate>Wed, 25 Jun 2025 09:57:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-5-zhong-ding-zhi-tabbar-hen-jian-dan-ru-he-rang-xuan-zhong-de-tab-xian-shi-bu-tong-tu-pian/</guid><description>&lt;p&gt;第一步：获取tabbar&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITabBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.tabBarController.tabBar;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：获取tababr的所有选项&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tabBar.items objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步：设置图片，选择要设置的tabbaritem&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;homePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;btn_home_highlight@2x&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(item.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; item.selectedImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:homePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个就搞定了&lt;/p&gt;</description></item><item><title>NSDictionary和NSMutableDictionary简单小练习</title><link>https://zhangdapeng.dev/p/nsdictionary-he-nsmutabledictionary-jian-dan-xiao-lian-xi/</link><pubDate>Tue, 24 Jun 2025 15:29:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsdictionary-he-nsmutabledictionary-jian-dan-xiao-lian-xi/</guid><description>&lt;p&gt;NSDictionary和NSMutableDictionary简单小练习&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//nsdictionary
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;OneValue&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;One&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:&lt;span style="color:#e6db74"&gt;@&amp;#34;OneValue&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;One&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;TwoValue&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;Two&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;ThreeValue&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;Three&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;FourValue&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;Four&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;FiveValue&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;Five&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict1 = %@&amp;#34;&lt;/span&gt;, dict1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict2 = %@&amp;#34;&lt;/span&gt;, dict2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithDictionary:dict2];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict3 = %@&amp;#34;&lt;/span&gt;,dict3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取字典的数量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict2 count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict2 count = %ld&amp;#34;&lt;/span&gt;,(&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)count);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取字典的value
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict3 objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;One&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;One String = %@&amp;#34;&lt;/span&gt;,string);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//获取字典的所有的keys和values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;allKeys &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict3 allKeys];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;allValues &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dict3 allValues];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict3 allkeys = %@&amp;#34;&lt;/span&gt;,allKeys);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;dict3 allvalues = %@&amp;#34;&lt;/span&gt;,allValues);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//nsmutablensctionary
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mutableDict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:&lt;span style="color:#e6db74"&gt;@&amp;#34;v1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;v2&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;v3&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k3&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;v4&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k4&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;v5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k5&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;v6&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k6&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;mutableDict = %@&amp;#34;&lt;/span&gt;,mutableDict);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:&lt;span style="color:#e6db74"&gt;@&amp;#34;v7&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;k7&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mutableDict addEntriesFromDictionary:dict4];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;mutabledict = %@&amp;#34;&lt;/span&gt;,mutableDict);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mutableDict setObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;v8&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;k8&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;mutableDict = %@&amp;#34;&lt;/span&gt;,mutableDict);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mutableDict2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mutableDict2 setDictionary:mutableDict];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;mutabledict2 = %@&amp;#34;&lt;/span&gt;,mutableDict2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//删除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mutableDict2 removeObjectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;k3&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;mutabledict2 = %@&amp;#34;&lt;/span&gt;,mutableDict2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//遍历字典 一般的方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; index &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [mutableDict count]; index&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [mutableDict objectForKey:[[mutableDict allKeys] objectAtIndex:index]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;String = %@&amp;#34;&lt;/span&gt;,string);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;_______________________________________________快速枚举&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//快速枚举
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; key &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; mutableDict){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [mutableDict objectForKey:key];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;string = %@&amp;#34;&lt;/span&gt;,string);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;_______________________________________________枚举类型&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//使用枚举类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSEnumerator &lt;span style="color:#f92672"&gt;*&lt;/span&gt;enumerator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [mutableDict keyEnumerator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; key;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (key) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obejct &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [mutableDict objectForKey:key];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [enumerator nextObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;string = %@&amp;#34;&lt;/span&gt;,string);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// insert code here...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>如何使用Cocos2D制作一款简单的iphone游戏</title><link>https://zhangdapeng.dev/p/ru-he-shi-yong-cocos2d-zhi-zuo-yi-kuan-jian-dan-de-iphone-you-xi/</link><pubDate>Tue, 24 Jun 2025 11:24:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/ru-he-shi-yong-cocos2d-zhi-zuo-yi-kuan-jian-dan-de-iphone-you-xi/</guid><description>&lt;p&gt;Cocos2D是一款功能强大的iphone游戏引擎，它可以很大程度上节约你的游戏开发时间。它包含sprite（精灵），绚丽的特效，animations（动画），物理引擎，声音引擎，以及其他一些相当实用的功能。&lt;/p&gt;
&lt;p&gt;我也是刚接触Cocos2D，虽然目前市面上有很多cocos2d相关的教程，但我没能找到我想到的那种入门级别的教程-如何制作一款非常简单但是功能齐全的游戏。对于入门教程，这款游戏应当仅仅包含一些较为基础的功能，如animation（动画）, collisions（碰撞）和声音。&lt;/p&gt;
&lt;h3 id="下载并安装cocos2d"&gt;&lt;a class="link" href="#1" &gt;下载并安装Cocos2D&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;你可以从以下地址下载到最新的&lt;a class="link" href="https://code.google.com/p/cocos2d-iphone/" target="_blank" rel="noopener"
 &gt;Cocos2Dthe Cocos2D Google Code page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;下载完成后，你需要安装实用的project templates（工程模板）。在mac下打开一个终端窗口，&lt;/p&gt;
&lt;p&gt;进入到刚刚下载到的Cocos2D的目录并输入以下指令： ./install-templates.sh -f -u&lt;/p&gt;
&lt;p&gt;注意，如果xcode没有安装在默认目录下，在这里你可以选择性的在指令后添加参数（如果你的机器曾经安装过多个版本的SDK的话，那么很可能之前你已经会用这种方法了）。&lt;/p&gt;
&lt;h3 id="hello-cocos2d"&gt;&lt;a class="link" href="#2" &gt;Hello, Cocos2D!&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;让我们从建立一个简单的Hello World程序开始吧！&lt;/p&gt;
&lt;p&gt;启动Xcode，选择cocos2d Application template建立一个新工程。将其命名为 “Cocos2DSimpleGame”。&lt;/p&gt;
&lt;p&gt;编译(Cmd+B)并运行(Cmd+R)&lt;/p&gt;
&lt;p&gt;Cocos2D是以场景（scenes）组织的，对一个游戏来说，场景可以是关卡或者是屏幕。比如游戏一开始的主菜单场景，游戏中运行起来的场景，还有游戏结束game over的场景。在场景中，可以有很多的层layers（很像photoshop中的层），层中又可以包含很多节点nodes比如精灵sprite，文本labels，菜单menus和其他的。同时每个节点又可以包含其他的节点（例如一个sprite节点可以包含另一个sprite节点作为他的child）。&lt;/p&gt;
&lt;p&gt;观察下Hello World示例工程，会发现里边只有一个层-HelloWorldLayer-我们准备在这儿实现我们主要的游戏逻辑。打开这个文件，会看到在init方法里边被加入了一个写着”Hello World”的label，现在删除掉它，我们以后将用一个sprite来替换它。&lt;/p&gt;
&lt;h3 id="添加一个sprite"&gt;&lt;a class="link" href="#3" &gt;添加一个Sprite&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在添加一个sprie之前，我们需要一些图片，你可以使用自己创建的，或者直接使用我（ray）可爱的妻子为这个项目制作的图片资源： &lt;a class="link" href="http://d1xzuxjlafny7l.cloudfront.net/downloads/Player.png" target="_blank" rel="noopener"
 &gt;a Player image&lt;/a&gt;, &lt;a class="link" href="http://d1xzuxjlafny7l.cloudfront.net/downloads/Projectile.png" target="_blank" rel="noopener"
 &gt;a Projectile image&lt;/a&gt;, and &lt;a class="link" href="http://d1xzuxjlafny7l.cloudfront.net/downloads/Target.png" target="_blank" rel="noopener"
 &gt;a Target image&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;获得这些图片后，把它们从finder里拖拽进Xcode工程的resources文件夹下，确保”Copy items into destination group’s folder （if needed）是选中的。&lt;/p&gt;
&lt;p&gt;好的，现在有了图片资源，下面要计算出该往哪里放置我们的主人公。需要注意的是在Cocos2D里，屏幕的左下角是(0,0)点，随着你往右上方向移动，x和y值会随之增加。因为本项目是landscape模式的（手机横向放置），所以这意味着右上角的坐标是(480,320)。&lt;/p&gt;
&lt;p&gt;还需要注意的是，每当设置一个对象的坐标，默认情况下设置的是该对象自身中心的位置。所以如果想把主人公sprite放置到屏幕的横向左边缘，纵向屏幕一半的位置，需要执行以下两步：&lt;/p&gt;
&lt;p&gt;x坐标，设置其为&lt;code&gt;[player sprite's width]/2&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;y坐标，设置其为&lt;code&gt;[window height]/2&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这就试试看！打开Classes文件夹并点击HelloWorldLayer.m，用以下内容替换掉init方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;( (self&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[super init] )) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize winSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CCDirector sharedDirector] winSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;player &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCSprite spriteWithFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;Player.png&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;27&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; player.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccp(player.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, winSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChild:player];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译并运行，主人公sprite跃然屏幕之上，但注意背景默认是黑色的，白色看起来也许会更好点儿。使用CCLayerColor class可以简单的完成这一目标。打开HelloWorldLayer.h并修改其interface 声明部分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HelloWorldLayer&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;CCLayerColor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后打开HelloWorldLayer.m，对init方法做一个轻微的修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;( (self&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[super initWithColor:ccc4(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;)] )) {
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;背景就顺利变为了白色。&lt;/p&gt;
&lt;p&gt;编译并运行，主人公出现在白色背景之上了，哈哈，我们的小忍者看起来跃跃欲试了！&lt;/p&gt;
&lt;h3 id="移动靶子moving-targets"&gt;&lt;a class="link" href="#4" &gt;移动靶子Moving Targets&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;接下来为了让我们的忍者不至于独孤求败，我们加入一些靶子，为了让游戏更有趣，可以让靶子移动起来-否则游戏将不会有很好的挑战性。将这些靶子稍微向右移出屏幕一点儿，并给他们设置一个向左移动的动作。&lt;/p&gt;
&lt;p&gt;在init方法之前添加以下方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;addTarget&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;target &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCSprite spriteWithFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;Target.png&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;27&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Determine where to spawn the target along the Y axis
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize winSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CCDirector sharedDirector] winSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; target.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; winSize.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; target.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; rangeY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; maxY &lt;span style="color:#f92672"&gt;-&lt;/span&gt; minY;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; actualY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (arc4random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; rangeY) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; minY;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create the target slightly off-screen along the right edge,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// and along a random position along the Y axis as calculated above
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccp(winSize.width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (target.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), actualY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChild:target];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Determine speed of the target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; rangeDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; maxDuration &lt;span style="color:#f92672"&gt;-&lt;/span&gt; minDuration;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; actualDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (arc4random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; rangeDuration) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; minDuration;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create the actions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; actionMove &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCMoveTo actionWithDuration:actualDuration 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; position:ccp(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;target.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, actualY)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; actionMoveDone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCCallFuncN actionWithTarget:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(spriteMoveFinished:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [target runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了让事情更容易理解，我使用了有点儿冗长的方式来讲解。这一部分其实就是和之前主人公sprite同样的方式来计算对象该放到哪儿，设置坐标并将其加入到场景中去。&lt;/p&gt;
&lt;p&gt;唯一不同的是这里加入了actions（动作）。Cocos2D内部提供了许多极为便利的动作来给你的sprite动起来，例如move actions（移动），jump actions（跳跃），fade actions（渐隐渐现），animation actions（动画）等等，这里我们只用其中的三个action：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CCMoveTo: 使用CCMoveTo action来让对象从右侧屏幕外移动到屏幕左侧。注意可以通过指定duration参数控制这一过程需要多久，这里我们随机给他2-4秒的时间。&lt;/li&gt;
&lt;li&gt;CCCallFuncN: CCCallFuncN action 允许我们指定一个在动作执行完成后执行的回调函数。暂时写一个空的回调“spriteMoveFinished”，以后再填入内容。&lt;/li&gt;
&lt;li&gt;CCSequence: CCSequence action 允许将一系列动作按先后顺序组合成一个动作，一次执行，这里，让CCMoveTo首先执行，当它完成时，再执行CCCallFuncN动作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，添加上文提到的那个CCCallFuncN action中需要的回调函数，在addTarget:方法之前添加以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;spriteMoveFinished:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sprite &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeChild:sprite cleanup:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此方法的目的是一旦sprite超出屏幕范围，就将其从屏幕上移除。随着靶子数量的不断增加，如果不及时清理之，将会有严重的内存泄漏问题出现。解决这个问题也可以使用另一种更为高端的手段-使用数组存储一系列可以重复使用的sprites对象，但对于这篇初学者教学来说，我们用目前这个基础的方法即可。&lt;/p&gt;
&lt;p&gt;在继续前还有一件事儿要做。我们需要实际调用创建靶子的方法。为了让游戏更有趣，我们让靶子每隔一小段时间就出现。通过每隔一段时间就会被调用的schedule（调度）回调函数，就能完成这个目标。每隔一秒刷新一个靶子，在init方法里的return之前加入以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self schedule:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(gameLogic:) interval:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来在回调函数里填入如下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;gameLogic:&lt;/span&gt;(ccTime)dt {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addTarget];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译并运行，你会看到靶子们欢快地在屏幕上移动着：&lt;/p&gt;
&lt;h3 id="射击shooting-projectiles"&gt;&lt;a class="link" href="#5" &gt;射击Shooting Projectiles&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;到这里，主人公忍者多么渴望着被添加一个射击动作。虽然有很多方法可以实现射击，但是这个游戏里，我们希望每当用户触摸屏幕时，让主人公向着触摸的方向发射一个飞镖。&lt;/p&gt;
&lt;p&gt;我使用CCMoveTo action来让所有逻辑尽量简单，但是使用它还是需要一丁点儿数学计算。CCMoveTo需要被指定一个目标点，我们不能直接使用用户触摸屏幕的点，因为这个点仅仅能表示主人公射击靶子的方向，实际上我们想让飞镖持续飞行到一直飞出屏幕为止。&lt;/p&gt;
&lt;p&gt;首先我们在层里启用触摸，在init方法中加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.isTouchEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于启用了触摸，在层里会接收到相应的触摸回调函数。每当用户的手指从屏幕抬起，将会触发ccTouchesEnded方法，我们这就实现它：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;ccTouchesEnded:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Choose one of the touches to work with
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITouch &lt;span style="color:#f92672"&gt;*&lt;/span&gt;touch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [touches anyObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [touch locationInView:[touch view]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CCDirector sharedDirector] convertToGL:location];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set up initial location of projectile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize winSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CCDirector sharedDirector] winSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;projectile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCSprite spriteWithFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;Projectile.png&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; projectile.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccp(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, winSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Determine offset of location to projectile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; offX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; location.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; projectile.position.x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; offY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; location.y &lt;span style="color:#f92672"&gt;-&lt;/span&gt; projectile.position.y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Bail out if we are shooting down or backwards
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (offX &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Ok to add now - we&amp;#39;ve double checked position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChild:projectile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Determine where we wish to shoot the projectile to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; realX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; winSize.width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (projectile.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; ratio &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;) offY &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;) offX;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; realY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (realX &lt;span style="color:#f92672"&gt;*&lt;/span&gt; ratio) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; projectile.position.y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint realDest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccp(realX, realY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Determine the length of how far we&amp;#39;re shooting
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; offRealX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; realX &lt;span style="color:#f92672"&gt;-&lt;/span&gt; projectile.position.x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; offRealY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; realY &lt;span style="color:#f92672"&gt;-&lt;/span&gt; projectile.position.y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sqrtf((offRealX&lt;span style="color:#f92672"&gt;*&lt;/span&gt;offRealX)&lt;span style="color:#f92672"&gt;+&lt;/span&gt;(offRealY&lt;span style="color:#f92672"&gt;*&lt;/span&gt;offRealY));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; velocity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;480&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 480pixels/1sec
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; realMoveDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; length&lt;span style="color:#f92672"&gt;/&lt;/span&gt;velocity;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Move projectile to actual endpoint
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [projectile runAction:[CCSequence actions:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [CCMoveTo actionWithDuration:realMoveDuration position:realDest],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [CCCallFuncN actionWithTarget:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(spriteMoveFinished:)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在第一部分里，我们从touches对象集合中选择一个，得到他在当前屏幕上的坐标，通过调用convertToGL来把此坐标转换为当前屏幕模式适应的，这一点很重要，因为我们使用的是landscape模式。&lt;/p&gt;
&lt;p&gt;接下来加载飞镖sprite并像往常一样设置其初始坐标。根据之前讨论过的相似三角形算法，我们计算得到飞镖的终点。&lt;/p&gt;
&lt;p&gt;注意这个算法并不完美。即使飞镖的Y坐标已经出了屏幕，它还是会被强制移动到X坐标移出屏幕为止。想解决这个有很多手段，包括检测射击点到屏幕边缘的最短距离，在游戏逻辑的回调里检测飞镖坐标是否在屏幕之外（比如visit），虽然这些方法都可以解决它，但简单起见，这篇初学者教程还是会使用之前的方式。&lt;/p&gt;
&lt;p&gt;最后一件事儿是决定运动所需的时间。飞镖最好是能以固定的速率射出，所以我们还需要一丁点儿数学计算。使用 勾股定理可以轻松地得到斜边的长度。&lt;/p&gt;
&lt;p&gt;一旦有了距离，只需要将其除以一个固定的速率，便可得到时间。&lt;/p&gt;
&lt;p&gt;剩余部分就像我们之前做的，给靶子设置上actions。编译并运行，哈哈，你的忍者能给予冲过来的鬼头靶子致命打击了！&lt;/p&gt;
&lt;h3 id="碰撞检测collision-detection"&gt;&lt;a class="link" href="#6" &gt;碰撞检测Collision Detection&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;飞镖四处飞，但我们的小忍者并没有看到飞镖击倒鬼头靶子。是时候加入一些检测飞镖与靶子碰撞检测的代码了。&lt;/p&gt;
&lt;p&gt;使用Cocos2D有很多途径解决这个，包括使用其中一个引擎包含的物理引擎：Box2D或者Chipmunk。为了有效说明问题的本质并使事情简单，我们将自己实现一个简单的碰撞检测。&lt;/p&gt;
&lt;p&gt;首先，我们需要记录所有在当前场景里的靶子和飞镖对象。在HelloWorldLayer类的声明中加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_targets;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_projectiles;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并在init方法里加入初始化数组的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_targets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_projectiles &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在dealloc方法里边清理之：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_targets &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_targets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_projectiles &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_projectiles &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，修改addTarget方法，在靶子数组中加入一个新靶子并设置其标识（tag）留待后用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_targets addObject:target];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同样的，把在ccTouchesEnded里新建的飞镖加入到飞镖数组中并设置tag留待后用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;projectile.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_projectiles addObject:projectile];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后，修改spriteMoveFinished方法，根据tag分类把即将删除的对象从数组中也移除掉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (sprite.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_targets removeObject:sprite];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (sprite.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// projectile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_projectiles removeObject:sprite];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译并运行，确保到目前为止一切都OK。虽然目前还看不到什么显著的变化，但我们已经有了做碰撞检测的基础了。&lt;/p&gt;
&lt;p&gt;添加以下方法到HelloWorldLayer：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;update:&lt;/span&gt;(ccTime)dt {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;projectilesToDelete &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;projectile &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; _projectiles) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect projectileRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; projectile.position.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; (projectile.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; projectile.position.y &lt;span style="color:#f92672"&gt;-&lt;/span&gt; (projectile.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; projectile.contentSize.width, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; projectile.contentSize.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;targetsToDelete &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;target &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; _targets) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect targetRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target.position.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; (target.contentSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target.position.y &lt;span style="color:#f92672"&gt;-&lt;/span&gt; (target.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target.contentSize.width, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target.contentSize.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (CGRectIntersectsRect(projectileRect, targetRect)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [targetsToDelete addObject:target];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;target &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; targetsToDelete) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_targets removeObject:target];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeChild:target cleanup:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (targetsToDelete.count &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [projectilesToDelete addObject:projectile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [targetsToDelete &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;projectile &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; projectilesToDelete) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_projectiles removeObject:projectile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeChild:projectile cleanup:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [projectilesToDelete &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上内容很清晰。我们遍历了一下飞镖和靶子数组，在遍历中得到每一个对象的bounding box（碰撞框），使用CGRectIntersectsRect来检测两个矩形是否相交。如果有相交，则将飞镖和靶子分别从场景和数组中移除。注意我们必须将这些对象加入到“toDelete”结尾的数组中，因为我们没法在当前循环中从数组中删掉它。还是一样，有很多更优的方法来解决这类问题，简单起见，我使用最简单的方法。&lt;/p&gt;
&lt;p&gt;你仅仅需要一步就可以欢呼了，使用schedule调度这个方法，使其在每一帧都执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self schedule:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(update:)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译并运行，所有和飞镖碰撞的靶子都会灰飞烟灭了！&lt;/p&gt;
&lt;h3 id="完成触摸finishing-touches"&gt;&lt;a class="link" href="#7" &gt;完成触摸Finishing Touches&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;我们已经非常接近制作出一个成品（但很简单）的游戏了。只需要再加入一些音效和音乐（没有游戏不带声音的！）以及一些简单的游戏逻辑。&lt;/p&gt;
&lt;p&gt;如果你阅读过我的blog series on audio programming for the iPhone这篇教程，你会非常欣喜地发现在Cocos2D中播放声音原来如此简单。&lt;/p&gt;
&lt;p&gt;首先，把背景音乐和一个射击音效拖拽进你的工程的resources文件夹。你可以随意使用以下资源cool background music I made or my awesome pew-pew sound effect, 或者制作你自己的。&lt;/p&gt;
&lt;p&gt;接下来在HelloWorldLayer.m的一开头导入头文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SimpleAudioEngine.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在init方法中，如下所示播放背景音乐：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[SimpleAudioEngine sharedEngine] playBackgroundMusic:&lt;span style="color:#e6db74"&gt;@&amp;#34;background-music-aac.caf&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在ccTouchesEnded方法中播放音效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[SimpleAudioEngine sharedEngine] playEffect:&lt;span style="color:#e6db74"&gt;@&amp;#34;pew-pew-lei.caf&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，我们加入一个提示“You Win”或者“You Lose”的游戏结束场景。右键点击Classes文件夹，选择FileNew File，并选择Objective-C class，确保继承的类是NSObject。点击Next，在filename位置输入GameOverScene作为文件名，确保“Also create GameOverScene.h”是选中的。&lt;/p&gt;
&lt;p&gt;用以下内容替换掉GameOverScene.h：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;cocos2d.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameOverLayer&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;CCLayerColor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CCLabelTTF &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) CCLabelTTF &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameOverScene&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;CCScene&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GameOverLayer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_layer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) GameOverLayer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;layer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用以下内容替换掉GameOverScene.m：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameOverScene.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;HelloWorldLayer.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameOverScene&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; layer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _layer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;init&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init])) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.layer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [GameOverLayer node];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChild:_layer];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_layer &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _layer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameOverLayer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;( (self&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[super initWithColor:ccc4(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;)] )) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize winSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CCDirector sharedDirector] winSize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CCLabelTTF labelWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt; fontName:&lt;span style="color:#e6db74"&gt;@&amp;#34;Arial&amp;#34;&lt;/span&gt; fontSize:&lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _label.color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccc3(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _label.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ccp(winSize.width&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, winSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChild:_label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self runAction:[CCSequence actions:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [CCDelayTime actionWithDuration:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [CCCallFunc actionWithTarget:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(gameOverDone)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;gameOverDone&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_label &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意这里有两个不同的对象：一个scene和一个layer。一个scene可以包含很多layer。不过目前这个只有一个，这个layer只是放置了一个label在屏幕中心，并schedule了一个3秒会自动返回Hello World场景的事件。&lt;/p&gt;
&lt;p&gt;最后，加入一些极为简单的游戏逻辑进去。首先，记录一下被主人公的飞镖干掉的靶子。在HelloWorldLayer类中加入一个成员变量，在HelloWorldLayer.h中的@interface块儿加入如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; _projectilesDestroyed;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在HelloWorldLayer.m里，导入GameOverScene类：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameOverScene.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在update方法中，增加飞镖摧毁靶子的数量并检测获得胜利的条件，在removeChild:target:之后加入:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_projectilesDestroyed&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_projectilesDestroyed &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GameOverScene &lt;span style="color:#f92672"&gt;*&lt;/span&gt;gameOverScene &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [GameOverScene node];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _projectilesDestroyed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [gameOverScene.layer.label setString:&lt;span style="color:#e6db74"&gt;@&amp;#34;You Win!&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[CCDirector sharedDirector] replaceScene:gameOverScene];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当有鬼头靶子越过了屏幕左侧，你就输了，修改spriteMoveFinished方法，在tag == 1 case中removeChild:sprite:方法之后加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GameOverScene &lt;span style="color:#f92672"&gt;*&lt;/span&gt;gameOverScene &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [GameOverScene node];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[gameOverScene.layer.label setString:&lt;span style="color:#e6db74"&gt;@&amp;#34;You Lose :[&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[CCDirector sharedDirector] replaceScene:gameOverScene];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译并执行，现在你胜利或失败后会进入game over场景中，根据条件的不同会显示相应信息。&lt;/p&gt;
&lt;p&gt;源码拿来！&lt;a class="link" href="http://d1xzuxjlafny7l.cloudfront.net/downloads/Cocos2DSimpleGame.zip" target="_blank" rel="noopener"
 &gt;Gimme The Code!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;就到这里！这是到目前为止所有的源码下载地址simple Cocos2D iPhone game&lt;/p&gt;</description></item><item><title>总结阐述Cocos2d-X与Cocos2d-iphone区别</title><link>https://zhangdapeng.dev/p/zong-jie-chan-shu-cocos2d-x-yu-cocos2d-iphone-qu-bie/</link><pubDate>Tue, 24 Jun 2025 11:24:34 +0000</pubDate><guid>https://zhangdapeng.dev/p/zong-jie-chan-shu-cocos2d-x-yu-cocos2d-iphone-qu-bie/</guid><description>&lt;p&gt;最近开始学习cocos2d, 查阅资料发现有个Cocos2d-X和Cocos2d-iphone, 不解，为什么会有两种&lt;/p&gt;
&lt;p&gt;不得不说要说总结，因为Cocos2d-X的代码和Cocos2d-iphone两个引擎除了语言不同外（Cocos2d-X使用C++，Cocos2d-iphone使用Object-C）可以说没有其他差异。&lt;/p&gt;
&lt;p&gt;下面Himi举例对比几段代码来说明吧：&lt;/p&gt;
&lt;h3 id="创建添加一个精灵代码对比"&gt;&lt;a class="link" href="#1" &gt;创建添加一个精灵代码对比：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;使用Cocos2d-X&lt;/strong&gt;&lt;/em&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//---------Cocos2d-X代码部分-- 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建一个精灵 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;spriteTemp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;CCSprite&lt;span style="color:#f92672"&gt;::&lt;/span&gt;spriteWithFile(&lt;span style="color:#e6db74"&gt;&amp;#34;icon.png&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置精灵的坐标 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spriteTemp&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;setPosition(ccp(size.width&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;,size.height&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;)); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将精灵添加到layer中 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;this&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;addChild(spriteTemp,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;使用Cocos2d-iphone&lt;/strong&gt;&lt;/em&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//---------Cocos2d-iphone代码部分-- 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建一个精灵 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CCSprite &lt;span style="color:#f92672"&gt;*&lt;/span&gt;spriteTemp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[CCSprite spriteWithFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;icon.png&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置精灵的坐标 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spriteTemp.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ccp(size.width&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;,size.height&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将精灵添加到layer中 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self addChild:spriteTemp z:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; tag:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="添加一个粒子代码对比"&gt;&lt;a class="link" href="#2" &gt;添加一个粒子代码对比:&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;使用Cocos2d-X&lt;/strong&gt;&lt;/em&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//---------Cocos2d-X代码部分-- 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CCParticleSystem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempSystem &lt;span style="color:#f92672"&gt;=&lt;/span&gt;ARCH_OPTIMAL_PARTICLE_SYSTEM&lt;span style="color:#f92672"&gt;::&lt;/span&gt;particleWithFile(&lt;span style="color:#e6db74"&gt;&amp;#34;himi.plist&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tempSystem&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;setPosition(ccp(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;)); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;this&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;addChild(tempSystem);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;使用Cocos2d-iphone：&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//---------Cocos2d-iphone代码部分-- 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CCParticleSystem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempSystem &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile:&lt;span style="color:#e6db74"&gt;@&amp;#34;himi.plist&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tempSystem.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ccp(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self addChild:tempSystem];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK，不在举例了，通过以上随便举例的两段代码童鞋们很清楚的看出来，基本上没有差异。。So～这也是Himi没有在更新Cocos2d-X博文的必要，以后主要会继续更新Cocos2d（Cocos2d-iphone）博文的，以后童鞋们不管是做Cocos2d-X还是做Cocos2d-iphone都可以看我的【iOS-Cocos2d游戏开发系列博文的】谁让它们通用呢&lt;/p&gt;
&lt;h3 id="这里还有三点要说下"&gt;&lt;a class="link" href="#3" &gt;这里还有三点要说下：&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一：现在很多游戏公司都趋向于Cocos2d-X引擎开发游戏的趋势，不得不说Cocos2d-X多平台平移确实很诱惑人，而且通过网龙《91部落》手机网游的成功发布，不得不说Cocos2d-X已成熟！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第二：不少童鞋肯定会很想知道Cocos2d-X能多平台平移，那么平移稳定性如何？&lt;/p&gt;
&lt;p&gt;通过Himi的了解，Cocos2d-X开发都会使用统一的C++语言开发，例如在iOS开发中使用Xcode+cocos2d-X，在Android上一般使用Eclipse+Android NDK+ADT&amp;hellip;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其实总结一句，Cocos2d-iphone并不像很多童鞋认为的只要的一人开发就可打包多平台包这样子～ 如果说用一句话更贴切的形容Cocos2d-X，Himi会用“Cocos2d-X代码通用”来形容；&lt;/p&gt;
&lt;p&gt;从CC（CocoChina）上我看到王哲walzer（cocos2d-x 游戏引擎作者）在回复一童鞋问题时候这么说的：&lt;/p&gt;
&lt;p&gt;问：关于如何打包cocos2d-x程序的问题 本人新手，想请教一下如何将Cocos2d-x win32的程序打包成iphone能够运行的程序，请各位大大不吝赐教!谢谢！&lt;/p&gt;
&lt;p&gt;王哲walzer 答：win32上只是让你调试方便，要发布到appstore上，你还是得有个mac机，装好cocos2d-x template，新建工程，然后把win32上代码拷过来，手工地加入xcode工程里面，编译运行&lt;/p&gt;
&lt;p&gt;从上面的对话可以证实Himi所说的Cocos2d-X是代码通用！&lt;/p&gt;</description></item><item><title>iOS Push机制</title><link>https://zhangdapeng.dev/p/ios-push-ji-zhi/</link><pubDate>Mon, 23 Jun 2025 16:26:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-push-ji-zhi/</guid><description>&lt;p&gt;今天看了一下关于IOS的Push的机制，对于初学者我看了一下，顺便在自己的博客中进行记录一下&lt;/p&gt;
&lt;h3 id="push机制的介绍"&gt;&lt;a class="link" href="#1" &gt;Push机制的介绍&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;iPhone 对于应用程序在后台运行有诸多限制（除非你越狱）。因此，当用户切换到其他程序后，原先的程序无法保持运行状态。对于那些需要保持持续连接状态的应用程序（比如社区网络应用），将不能收到实时的信息。&lt;/p&gt;
&lt;p&gt;为解决这一限制，苹果推出了APNs（苹果推送通知服务）。APNs 允许设备与苹果的推送通知服务器保持常连接状态。当你想发送一个推送通知给某个用户的iPhone上的应用程序时，你可以使用 APNs 发送一个推送消息给目标设备上已安装的某个应用程序。&lt;/p&gt;
&lt;p&gt;Push机制的类型：&lt;/p&gt;
&lt;p&gt;四种：徽章、提示框、声音和横幅&lt;/p&gt;
&lt;p&gt;Push机制的4个组件&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Provider&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;APNS&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;iPhone设备&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Client App&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;其中APNS（Apple Push Notification Service）是由苹果提供的消息推送服务中心，所有的消息都经由这里转发给相应的设备。&lt;/p&gt;
&lt;p&gt;Provider和Device与APNS进行通信时，时建立在SSL/TLS安全连接之上的。如下面的两个图所示（TSL的建立过程）&lt;/p&gt;
&lt;p&gt;Provider与APNS之间的通信还需要&amp;mdash;&amp;ndash;DeviceToken&lt;/p&gt;
&lt;p&gt;DeviceToken是设备令牌，有APNS生成，并返回给设备，再由设备提供给Provider。&lt;/p&gt;
&lt;h3 id="push机制的使用"&gt;&lt;a class="link" href="#2" &gt;Push机制的使用&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Push通知的使用可以分为以下几个步骤。其中前4个步骤相当于准备工作，也非常重要。&lt;/p&gt;
&lt;p&gt;接下来，我们就一个步骤一个步骤的进行讲解。&lt;/p&gt;
&lt;p&gt;a 证书请求：&lt;/p&gt;
&lt;p&gt;证书请求制作的目的是为了获取ssl证书。通过在“钥匙串访问”程序中来创建证书请求，具体的操作过程，建议大家看看本文开头给出的视频连接。&lt;/p&gt;
&lt;p&gt;b 创建appid&lt;/p&gt;
&lt;p&gt;appid在制作ssl证书和profile文件会用到。具体创建过程看如下图（建议大家看看本文开头给出的视频连接。）&lt;/p&gt;
&lt;p&gt;登录网站&lt;a class="link" href="https://developer.apple.com/devcenter/ios/" target="_blank" rel="noopener"
 &gt;https://developer.apple.com/devcenter/ios/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;c 生成ssl证书&lt;/p&gt;
&lt;p&gt;ssl证书的一个主要作用就是运行程序接收从apns发送过来的消息&lt;/p&gt;
&lt;p&gt;具体生成过程，看下面的图，当然，这里也建议观看本文开头给出的视频&lt;/p&gt;
&lt;p&gt;d 创建profile文件&lt;/p&gt;
&lt;p&gt;profile文件的主要作用是运行程序可以被安装在手机上（push测试需要在真机上进行）&lt;/p&gt;
&lt;h3 id="push故障排除"&gt;&lt;a class="link" href="#3" &gt;Push故障排除&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="demo示例代码打包在如下文件中"&gt;&lt;a class="link" href="#4" &gt;Demo示例代码打包在如下文件中&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="http://gowhich.com/resource#tab-IOS" target="_blank" rel="noopener"
 &gt;PushMeBaby.rar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://gowhich.com/resource#tab-IOS" target="_blank" rel="noopener"
 &gt;PushClient.rar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://gowhich.com/resource#tab-IOS" target="_blank" rel="noopener"
 &gt;apn.rar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考地址：http://www.devdiv.com/iOS_iPhone-&lt;em&gt;ios_push&lt;/em&gt;-thread-130543-1-1.html&lt;/p&gt;
&lt;p&gt;DevDiv视频地址：http://www.devdiv.com/article-4042-1.html&lt;/p&gt;
&lt;p&gt;Youku视频地址：&lt;a class="link" href="http://v.youku.com/v_show/id_XNDI5ODExNzMy.html" target="_blank" rel="noopener"
 &gt;http://v.youku.com/v_show/id_XNDI5ODExNzMy.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="服务器端步骤"&gt;&lt;a class="link" href="#5" &gt;服务器端步骤&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;生成app在服务端需要的许可证&lt;/p&gt;
&lt;p&gt;1）进入Provisioning Portal, 下载Certificates在development下的证书。&lt;/p&gt;
&lt;p&gt;2） 找到需要测试的app id,然后enable它在development下的Apple Push Notification service: Development Push SSL Certificate。需要输入1）中的签名证书才可以生成一个aps_developer_identity.cer.&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;双击aps_developer_identity.cer，会打开系统的key chain.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在My certificates下找到Apple Development Push Services。需要为certificate和它之下的private key各自export出一个.p12文件。(会出现设置密码过程)&lt;/p&gt;
&lt;p&gt;4）需要将上面的2个.p12文件转成.pem格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl pkcs12 -nocerts -out key.pem -in key.p12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5）如果需要对 key不进行加密：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;openssl rsa -in key.pem -out key.unencrypted.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6）然后就可以 合并两个.pem文件, 这个ck.pem就是服务端需要的证书了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat cert.pem key.unencrypted.pem &amp;gt; ck.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4个pem，另外加上php文件，打包放到服务器上&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://gowhich.com/resource#tab-IOS" target="_blank" rel="noopener"
 &gt;apn_pem.zip&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS查看手机通讯录</title><link>https://zhangdapeng.dev/p/ios-cha-kan-shou-ji-tong-xun-lu/</link><pubDate>Mon, 23 Jun 2025 15:49:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cha-kan-shou-ji-tong-xun-lu/</guid><description>&lt;p&gt;查看iphone的手机通讯录的话，需要用到一个库AddressBook。&lt;/p&gt;
&lt;p&gt;可以使用里面的方法调用我们自己的通许录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getPhoneContacts&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABAddressBookRef addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[UIDevice currentDevice].systemVersion doubleValue] &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABAddressBookCreateWithOptions(NULL, NULL);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_t sema &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dispatch_semaphore_create(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABAddressBookRequestAccessWithCompletion(addressBook, &lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; granted, CFErrorRef error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_signal(sema);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABAddressBookCreate();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;temPeoples &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABAddressBookCopyArrayOfAllPeople(addressBook);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; temPerson &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; temPeoples)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;phoneArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpFirstName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonFirstNameProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpLastName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonLastNameProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setValue:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@ %@&amp;#34;&lt;/span&gt;, tmpFirstName, tmpLastName] forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABMultiValueRef phone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonPhoneProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; k &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; k &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; ABMultiValueGetCount(phone); k&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personPhone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABMultiValueCopyValueAtIndex(phone, k);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [phoneArray addObject:personPhone];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setValue:phoneArray forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;phone&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [resultArray addObject:dic];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ABAddressBookCreate&lt;/p&gt;
&lt;p&gt;和&lt;/p&gt;
&lt;p&gt;ABAddressBookCreateWithOptions，ABAddressBookRequestAccessWithCompletion&lt;/p&gt;
&lt;p&gt;是不同版本所使用的方法&lt;/p&gt;
&lt;p&gt;ABAddressBookCreate适用于6.0以上的，另外的则使用雨6.0以后的，&lt;/p&gt;
&lt;p&gt;之后调用ABAddressBookCopyArrayOfAllPeople，获取通讯录的内容。&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;p&gt;PhoneContactsViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PhoneContactsViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PhoneContacts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-25.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;PhoneContactsViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;AddressBook/AddressBook.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PhoneContactsViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PhoneContactsViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; resultArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;查看手机通讯录&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resultArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self getPhoneContacts];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//left的button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;btnBack &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btnBack setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btnBack setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btnBack addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(pressBtnBack) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;leftBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithCustomView:btnBack];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; leftBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//表表格处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tableView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, self.view.frame.size.width, self.view.frame.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;44.0&lt;/span&gt;) style:UITableViewStylePlain];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView setDataSource:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView setShowsHorizontalScrollIndicator:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView setShowsVerticalScrollIndicator:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:tableView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pressBtnBack&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController popViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getPhoneContacts&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABAddressBookRef addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[UIDevice currentDevice].systemVersion doubleValue] &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABAddressBookCreateWithOptions(NULL, NULL);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_t sema &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dispatch_semaphore_create(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABAddressBookRequestAccessWithCompletion(addressBook, &lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; granted, CFErrorRef error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_signal(sema);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addressBook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABAddressBookCreate();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;temPeoples &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABAddressBookCopyArrayOfAllPeople(addressBook);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; temPerson &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; temPeoples)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;phoneArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpFirstName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonFirstNameProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpLastName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonLastNameProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setValue:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@ %@&amp;#34;&lt;/span&gt;, tmpFirstName, tmpLastName] forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABMultiValueRef phone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ABRecordCopyValue((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; ABRecordRef)(temPerson), kABPersonPhoneProperty);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; k &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; k &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; ABMultiValueGetCount(phone); k&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personPhone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) ABMultiValueCopyValueAtIndex(phone, k);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [phoneArray addObject:personPhone];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setValue:phoneArray forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;phone&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [resultArray addObject:dic];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;indentationLevelForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [resultArray count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;cell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [resultArray objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;strName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; strName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [strName stringByReplacingOccurrencesOfString:&lt;span style="color:#e6db74"&gt;@&amp;#34;(null)&amp;#34;&lt;/span&gt; withString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; strName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.detailTextLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;邀请&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;didSelectRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(deleteSelectedCell) withObject:nil afterDelay:&lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [resultArray objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;numArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;phone&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;请选择号码&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;number &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; numArray)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet addButtonWithTitle:number];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet addButtonWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;取消&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet setCancelButtonIndex:[numArray count]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;deleteSelectedCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;actionSheet:&lt;/span&gt;(UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)actionSheet &lt;span style="color:#a6e22e"&gt;clickedButtonAtIndex:&lt;/span&gt;(NSInteger)buttonIndex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [actionSheet buttonTitleAtIndex:buttonIndex];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([string isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;取消&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showMSMViewByNumber:string];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showMSMViewByNumber:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([MFMessageComposeViewController canSendText]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self displaySMSComposeSheet:string];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Device not configured to send SMS.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;displaySMSComposeSheet:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MFMessageComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;picker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[MFMessageComposeViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.messageComposeDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;老婆我爱你&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.recipients &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:string, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentModalViewController:picker animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;messageComposeViewController:&lt;/span&gt;(MFMessageComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#a6e22e"&gt;didFinishWithResult:&lt;/span&gt;(MessageComposeResult)result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MessageComposeResultSent:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;信息发送成功!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MessageComposeResultFailed:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;信息发送失败!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissModalViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PhoneContactsViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PhoneContactsViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PhoneContacts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-25.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;MessageUI/MessageUI.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PhoneContactsViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDataSource, UITableViewDelegate, UIActionSheetDelegate, MFMessageComposeViewControllerDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;resultArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;别忘记引入文件：MessageUI和AddressBook&lt;/p&gt;</description></item><item><title>获取iOS版本</title><link>https://zhangdapeng.dev/p/huo-qu-ios-ban-ben/</link><pubDate>Mon, 23 Jun 2025 15:49:28 +0000</pubDate><guid>https://zhangdapeng.dev/p/huo-qu-ios-ban-ben/</guid><description>&lt;p&gt;如果你想开发一个同时支持IOS2和IOS3的应用，那你就需要获取当前的IOS版本了。因为IOS2中的部分方法在IOS3中已被移除。&lt;/p&gt;
&lt;p&gt;例如，在旋转开始之后，最后的旋转动画发生之前将会自动调用willAnimateRotationToInterfaceOrientation:duration:方法，而该方法是IOS3中新增的方法，在以前的SDK版本中，可以使用willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:方法，但是，IOS3以前的版本中使用的两段式动画比willAnimateRotationToInterfaceOrientation:duration:方法要慢得多，所以应避免这些方法，除非确实需要在应用程序中支持旧的IOS版本。&lt;/p&gt;
&lt;p&gt;用宏指令判断版本号：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifdef __IPHONE_6_0 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// code 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#else 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// code 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifdef __IPHONE_6_0 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;willAnimateRotationToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)interfaceOrientation &lt;span style="color:#a6e22e"&gt;duration:&lt;/span&gt;(NSTimeInterval)duration { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#else 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)willAnimateSecondHalfOfRotationFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你还可以通过以下方法获取IOS的版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIDevice currentDevice].systemVersion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这将会返回IOS的当前版本。&lt;/p&gt;
&lt;p&gt;在方法体中判断：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[UIDevice currentDevice].systemVersion doubleValue] &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6.0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//你的逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自定义返回按钮时，iOS7手势返回遇到的问题</title><link>https://zhangdapeng.dev/p/zi-ding-yi-fan-hui-an-niu-shi-ios7-shou-shi-fan-hui-yu-dao-de-wen-ti/</link><pubDate>Mon, 23 Jun 2025 15:49:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-fan-hui-an-niu-shi-ios7-shou-shi-fan-hui-yu-dao-de-wen-ti/</guid><description>&lt;p&gt;从iOS7的Beta版开始，就着手做兼容工作，到Beta4的時候，应用已经基本兼容，只是偶然发现，iOS样式的手势返回，也就是用interactivePopGestureRecognizer返回的时候,出现下面一些列问题。各方调研，无果，史无前例（废话，刚出来的7，上哪有例去&amp;ndash;#）。&lt;/p&gt;
&lt;p&gt;A，我的应用是自定义的返回按钮图标(默认返回按钮样式不会出现问题3)，为了保险，写了这句代码&lt;code&gt;[self.navigationItem setHidesBackButton:YES]&lt;/code&gt;。 由于自定义返回按钮，所以iOS7自带返回手势无效。在需要的页面加上&lt;code&gt;navigationController.interactivePopGestureRecognizer.delegate = self&lt;/code&gt; 返回手势好用了。&lt;/p&gt;
&lt;p&gt;B，于是出现了第二个问题。 在一级视图中，iOS样式返回的手势滑动一下，然后进入二级视图，发现，画面卡住了，按Home键转入后台，再返回应用，发现并没有Crash掉，而是直 接跳到了二级视图里，运行正常了，大家知道push和pop的原理是用进栈出栈完成的，可能因为在一级视图中滑动那一下，影响了视图在栈中的位置。 好，先解决一下这个问题，一级视图中一定要加入&lt;code&gt;self.navigationController.interactivePopGestureRecognizer.enabled = NO;&lt;/code&gt;，先把iOS7手势返回屏蔽掉，到二级视图再用&lt;code&gt;self.navigationController.interactivePopGestureRecognizer.enabled = YES&lt;/code&gt;打开。就Ok了。&lt;/p&gt;
&lt;p&gt;C，好，第三个问题相继出现（其实是跟第二个一起出来的）。 手势返回拖动一半，放手，navigationBar上会出现三个小蓝点，而且位置不规律，可以肯定这个不是项目代码或者图片搞出来的东西，一定是SDK自己蹦出來的。 后台尝试发现UIBarButtonItem的title如果是nil的话，就会有这个问题。 解决方案：把&lt;code&gt;[self.navigationItem setHidesBackButton:YES];&lt;/code&gt;去掉，然後把假装成返回按钮的UIBarButtonItem的title设置成@&amp;quot;&amp;quot;。&lt;/p&gt;
&lt;p&gt;D，大功告成。可见设计要是不按苹果规范来的话，就会遇到各种坑啊。&lt;/p&gt;</description></item><item><title>iOS 6 SDK: 在应用内展示App Store</title><link>https://zhangdapeng.dev/p/ios-6-sdk-zai-ying-yong-nei-zhan-shi-app-store/</link><pubDate>Mon, 23 Jun 2025 15:49:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-6-sdk-zai-ying-yong-nei-zhan-shi-app-store/</guid><description>&lt;p&gt;出于什么样的原因你会希望用户从你的iOS app中进入App Store呢？可能你想用户去App Store 为你的应用评分，也可能你希望用户看到你其他的iOS app。iOS 6引入了SKStoreProductViewController类，可以让用户在不离开当前应用的前提下展示App Store中的其他产品。&lt;/p&gt;
&lt;h3 id="store-kit"&gt;&lt;a class="link" href="#1" &gt;Store Kit&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;SKStoreProductViewController类是Store Kit框架的一部分。SKStoreProductViewController使用起来非常简单，在用实例讲解之前，了解一些基本的知识很有必要。&lt;/p&gt;
&lt;p&gt;SKStoreProductViewController类是UIViewController的子类, 如果你对view controller比较熟悉的话，那SKStoreProductViewController使用起来也非常简单了。当你希望向用户展示App Store中产品时，你需要：&lt;/p&gt;
&lt;p&gt;1.实例化一个SKStoreProductViewController类&lt;br&gt;
2.设置它的delegate&lt;br&gt;
3.把sotre product视图控制器显示给消费者&lt;/p&gt;
&lt;p&gt;剩下的就交给操作系统来处理了。需要记住一点的是SKStoreProductViewController只能以模态的方式显示。 SKStoreProductViewControllerDelegate协议定义了一个单独的方法— productViewControllerDidFinish:，当消费者离开App Store时会调用这个方法—一般是通过点击左上角画面中的取消按钮。通过给代理发送productViewControllerDidFinish:消 息，操作系统就会把控制权返回到你的程序。下面我来演示一下如何在一个简单的程序中使用SKStoreProductViewController类。&lt;/p&gt;
&lt;p&gt;Step 1: Setting Up the Project&lt;/p&gt;
&lt;p&gt;我们将要创建的app不是多实用，仅有一个按钮，可以把用户带入App Store，向用户展示我最近发布的一款简单的天气类app。通过实例我们可以了解不同的部分如何很好地契合在一起，还可以了解如何在项目中使用 SKStoreProductViewController类。&lt;/p&gt;
&lt;p&gt;从模版列表中选择一个Single View Application模版，在Xcode中创建一个新的项目。&lt;/p&gt;
&lt;p&gt;将程序的名称设置为UsingStoreProduct，然后输入一个company identifier，并将device family设置为iPhone，最后勾选上Automatic Reference Counting。剩余的勾选框不要勾选。“告诉”Xcode你希望保存项目的地方，点击创建按钮。&lt;/p&gt;
&lt;p&gt;Step 2: Adding the Store Kit Framework&lt;/p&gt;
&lt;p&gt;由于SKStoreProductViewController类是Store Kit框架的一部分，所以我们需要将这个Store Kit框架链接到我们的工程中。在工程导航器中选中工程，然后在target列表中选中target。在画面的顶部，选择Build Phase选项，然后打开Link Binary With Libraries。点击‘+’按钮，并在列表中搜索StoreKit并选择StoreKit.framework。这样就可以成功的将Store Kit框架链接到工程中。&lt;/p&gt;
&lt;p&gt;为了使用UsingStoreProductViewController类里的Store Kit框架，我们需要输入框架的头文件，打开UsingStoreProductViewController.h，在顶部添加下边这个引入语法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;StoreKit/StoreKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 3: Using the SKStoreProductViewController Class&lt;/p&gt;
&lt;p&gt;在视图控制器的viewDidLoad方法中，在下面的代码片段中创建一个新的按钮。按钮的类型是UIButtonTypeRoundedRect，然后 我把这个按钮放在视图控制器view的正中间。同时我还给这个按钮制定了一个title，并添加了一个target-action——匹配 UIControlEventTouchUpInside事件。这意味无论何时，用户点击按钮，view controller就会收到“前往寻艺 App Store”的信息。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化一个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;button &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeRoundedRect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;前往寻艺 App Store&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setCenter:self.view.center];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:button];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(openAppStore:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在openAppStore: 方法中，我对SKStoreProductViewController进行了初始化，并将自己设置为它的delegate，然后在给这个实例发送一个 loadProductWithParameters:completionBlock:消息。&lt;br&gt;
loadProductWithParameters:completionBlock:接收两个参数：&lt;/p&gt;
&lt;p&gt;（1）一个字典：用一个key指定我们想要显示给用的程序的标示符。&lt;/p&gt;
&lt;p&gt;（2）一个completion block。&lt;br&gt;
当App store请求结束时会调用这个completion block。在完成的block中，我们要核实是否有错误遗漏，并把store product 视图控制器展示给用户。&lt;/p&gt;
&lt;p&gt;请记住，即使用户没有离开你的程序，操作系统仍然会在内部进行与App store的连接。由于在请求App Store过程中，会需要稍微长的一段时间，也就是说，最好在请求还没有返回响应时给用户显示一个风火轮。一旦请求完成（成功或者不成功），已经完成的 block将会允许我们解除activity indicator。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;openAppStore:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化Product View Controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SKStoreProductViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;storeProductViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[SKStoreProductViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//配置View　Controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [storeProductViewController setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [storeProductViewController loadProductWithParameters:&lt;span style="color:#ae81ff"&gt;@{&lt;/span&gt;SKStoreProductParameterITunesItemIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;685836302&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completionBlock:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; result, NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Error %@ with User Info %@.&amp;#34;&lt;/span&gt;, error, [error userInfo]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:storeProductViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animated:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：你可以在iTunes Connect找到app的唯一识别符，App Store中的每个app都有一个唯一识别符/Apple ID，注意你需要将在参数字典中以字符串的形式传递apple id。&lt;/p&gt;
&lt;p&gt;在生成和运行程序之前，我们需要MTViewController类通过实现productViewControllerDidFinish:方法以遵循 SKStoreProductViewControllerDelegate协议。我们可以通过告诉编译器“UsingStoreProductController类符合 SKStoreProductViewController授权协议”来更新view controller的接口文件，看下边：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;StoreKit/StoreKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UsingStoreProductViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;SKStoreProductViewControllerDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 4: Build and Run&lt;/p&gt;
&lt;p&gt;虽然苹果表示SKStoreProductViewController类可以向用户展示其他app，但这是一种理想的在用户不离开当前app的情况下，让用户去App Store评分的方法。&lt;/p&gt;
&lt;p&gt;整个的运行逻辑代码：&lt;/p&gt;
&lt;p&gt;UsingStoreProductViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UsingStoreProductViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UsingStoreProduct
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UsingStoreProductViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UsingStoreProductViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UsingStoreProductViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; indicatorView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化一个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;button &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeRoundedRect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;前往寻艺 App Store&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setCenter:self.view.center];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:button];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(openAppStore:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;openAppStore:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showIndicator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化Product View Controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SKStoreProductViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;storeProductViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[SKStoreProductViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//配置View　Controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [storeProductViewController setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [storeProductViewController loadProductWithParameters:&lt;span style="color:#ae81ff"&gt;@{&lt;/span&gt;SKStoreProductParameterITunesItemIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;685836302&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completionBlock:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; result, NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Error %@ with User Info %@.&amp;#34;&lt;/span&gt;, error, [error userInfo]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self hideIndicator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:storeProductViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animated:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;productViewControllerDidFinish:&lt;/span&gt;(SKStoreProductViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)viewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissViewControllerAnimated:YES completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showIndicator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView.autoresizingMask &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewAutoresizingFlexibleTopMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleBottomMargin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleLeftMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleRightMargin;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:indicatorView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView startAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.center;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hideIndicator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView stopAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>在iOS上用Quartz绘制圆角矩形</title><link>https://zhangdapeng.dev/p/zai-ios-shang-yong-quartz-hui-zhi-yuan-jiao-ju-xing/</link><pubDate>Mon, 23 Jun 2025 15:48:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-ios-shang-yong-quartz-hui-zhi-yuan-jiao-ju-xing/</guid><description>&lt;p&gt;Bezels是Mac OS X下，苹果私有的UI控件，用来提示用户某些信息。不过iOS下，就有很多第三方的Bezels风格的提示控件实现了。相信大家也见过很多了。下图左侧是OSX的提示音量变化的Bezels，右侧是iOS上的Bezels风格的进度提示。&lt;/p&gt;
&lt;p&gt;在iOS上做Bezels的思路很简单，无非就是在UIView里绘制一个半透明的圆角矩形，然后加入其他的SubView。因为没有现成的绘制圆角矩形的API可用，所以我们来自己绘制一个——反正是为了学习嘛。&lt;/p&gt;
&lt;p&gt;新建项目，添加一个UIView的子类，修改drawRect方法，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rect.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rect.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 简便起见，这里把圆角半径设置为长和宽平均值的1/10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat radius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; height) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.05&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取CGContext，注意UIKit里用的是一个专门的函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 移动到初始点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextMoveToPoint(context, radius, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 绘制第1条线和第1个1/4圆弧
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddArc(context, width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, radius, radius, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; M_PI, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 绘制第2条线和第2个1/4圆弧
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, width, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddArc(context, width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, radius, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; M_PI, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 绘制第3条线和第3个1/4圆弧
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, radius, height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddArc(context, radius, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; radius, radius, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; M_PI, M_PI, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 绘制第4条线和第4个1/4圆弧
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, radius);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddArc(context, radius, radius, radius, M_PI, &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; M_PI, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 闭合路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextClosePath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 填充半透明黑色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetRGBFillColor(context, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextDrawPath(context, kCGPathFill);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实这用到的只是些很基本的Quartz绘图函数而已。不过，我们顺利的绘制出了半透明，黑色的，圆角Bezel风格的View&lt;/p&gt;</description></item><item><title>iOS Interface Orientation学习</title><link>https://zhangdapeng.dev/p/ios-interface-orientation-xue-xi/</link><pubDate>Mon, 23 Jun 2025 15:27:33 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-interface-orientation-xue-xi/</guid><description>&lt;h3 id="设备方向改变通知"&gt;&lt;a class="link" href="#1" &gt;设备方向改变通知&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;iOS设备内置有加速计(Accelerometer)可以检测出当前设备的方法,当设备方向改变时,系统会发送UIDeviceOrientationDidChangeNotification通知,UIKit框架会监听此通知并根据当前应用设置来自动更新用户界面方向(Interface Orientation)。&lt;/p&gt;
&lt;p&gt;在iOS6版本中,设置应用支持的界面方向的方法和iOS5及之前的版本有差异,下面将分别介绍两个版本下的界面方向设置。&lt;/p&gt;
&lt;h3 id="ios6中设置支持的界面方向interface-orientations"&gt;&lt;a class="link" href="#2" &gt;iOS6中设置支持的界面方向(Interface Orientations)&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在iOS6中,UIKit框架接收到方向改变的通知时,会使用UIApplication的全局设置和当前topmost view controller的设置来共同判断是否允许旋转至此方向。&lt;/p&gt;
&lt;p&gt;1,&lt;a class="link" href="http://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009247" target="_blank" rel="noopener"
 &gt;Info.plist&lt;/a&gt;中的&lt;a class="link" href="http://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW10" target="_blank" rel="noopener"
 &gt;UISupportedInterfaceOrientations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;设置Info.plist中的&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW10" target="_blank" rel="noopener"
 &gt;UISupportedInterfaceOrientations&lt;/a&gt;对应的数组可控制app全局支持的方向，此设置对app的所有view controller都有效。使用当前topmost view controller支持的方向与此设置的与(AND)来确定给定的方向是否支持。与操作的结果不能为0，若为0，则会引发&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/c/data/UIApplicationInvalidInterfaceOrientationException" target="_blank" rel="noopener"
 &gt;UIApplicationInvalidInterfaceOrientationException&lt;/a&gt;异常。&lt;/p&gt;
&lt;p&gt;2,Topmost view controller支持的方向&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Topmost view controller是什么?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Here, the topmost view controller refers to the window’s root view controller unless another view controller is currently presented, in which case, the presented view controller becomes the topmost view controller for the duration it is presented. This should not be confused with the topViewController of a navigation controller.&lt;/p&gt;
&lt;p&gt;如Technical Q&amp;amp;A QA1688中所述，topmost view controller有两类:&lt;/p&gt;
&lt;p&gt;a. window的root view controller(当没有其他view controller正在被presented时);&lt;/p&gt;
&lt;p&gt;b. 当前正在被presented显示的其他view controller。&lt;/p&gt;
&lt;p&gt;查找当前topmost view controller的代码为:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;topMostController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;topController &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIApplication sharedApplication].keyWindow.rootViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(topController.presentedViewController){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; topController.presentedViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; topController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注(重要):要使iOS6中的方向旋转相关的方法生效,必须设置window的rootViewController属性,而不能简单的将root view controller的view加入到window中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UIViewController的方向设置(topmost view controller)&lt;/p&gt;
&lt;p&gt;a.&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/supportedInterfaceOrientations" target="_blank" rel="noopener"
 &gt;supportedInterfaceOrientations&lt;/a&gt; 设置view controller支持的界面方向(Interface Orientations)&lt;/p&gt;
&lt;p&gt;可以通过重写UIViewController的supportedInterfaceOrientations方法来确定当前view controller支持的Interface Orientation。默认情况下,iPad支持所有四个方向,iPhone支持除&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-SW5" target="_blank" rel="noopener"
 &gt;UIInterfaceOrientationPortraitUpsideDown&lt;/a&gt;以外的三个方向。下面为设置支持portrait方法和 landscape-left方向的代码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskPortrait &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIInterfaceOrientationMaskLandscapeLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;b. &lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/shouldAutorotate" target="_blank" rel="noopener"
 &gt;shouldAutorotate&lt;/a&gt; 设置是否允许自动旋转&lt;/p&gt;
&lt;p&gt;如果想暂时禁掉自动旋转,但不想修改supportedInterfaceOrientations中的方向mask,可重写shouldAutorotate方法,如果shouldAutorotate返回NO,则不进行旋转。&lt;/p&gt;
&lt;p&gt;c. &lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/preferredInterfaceOrientationForPresentation" target="_blank" rel="noopener"
 &gt;preferredInterfaceOrientationForPresentation&lt;/a&gt; 设置View Controller被Presented时的首选显示方向。&lt;/p&gt;
&lt;p&gt;当view controller被presented显示时，可能在一个特定的方向显示最合适,如果其仅仅支持这一个方向，可以在supportedInterfaceOrientations方法中简单的返回此方向。但如果view controller支持多个方向显示,但在某一个方向显示最佳,则可以通过重写preferredInterfaceOrientationForPresentation方法来返回此方向。这样,当view controller被presented时,将会以preferredInterfaceOrientationForPresentation返回的方向显示。&amp;lt;\br&amp;gt;&lt;br&gt;
注意:preferredInterfaceOrientationForPresentation返回的方向是supportedInterfaceOrientations中的一个。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="ios5及之前版本中设置支持的界面方向interface-orientations"&gt;&lt;a class="link" href="#3" &gt;iOS5及之前版本中设置支持的界面方向(Interface Orientations)&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1.Info.plist中的UISupportedInterfaceOrientations&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;与iOS6版本不同,iOS5版本中的UISupportedInterfaceOrientations对应的方向数组仅仅作为提示,不参与能否旋转至特定方向的判断
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.shouldAutorotateToInterfaceOrientation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;默认情况下，此方法只对UIInterfaceOrientationPortrait返回YES，如果view controller需要支持其他方向，则需要重写此方法，对支持的方向返回YES。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当对容器类view controller(container view controller)，比如UINavigationController，UITabBarController调用shouldAutorotateToInterfaceOrientation:方法时，其会对所有的子view controller调用同样的方法，如果子view controller不支持参数中指定的方法，同样返回NO。所以，在iOS5中，如果topmost view controller是个container view controller，则其子view controllers同样会参与旋转方向的判断。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;为了尽量遵循和iOS6一致的策略,应该在同时支持iOS5中的应用中做如下设置

1,对topmost view controller，仅返回其所支持的界面方向

2,在子view controller中，支持所有的界面方向，并合理设置自适应的view layout来支持不同的页面分辨率
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="界面方向旋转过程"&gt;&lt;a class="link" href="#4" &gt;界面方向旋转过程&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;当旋转发生时，在旋转的各个阶段对会调用topmost view controller中合适的方法，若topmost view controller是个container view controller，则会继续调用当前可见的子view controller中的对应方法。view contoller可以在这些方法中隐藏或者显示视图，调整视图的位置或者大小，或者将方向变化通知给app的其它部分。因为这些方法在旋转的过程中调用，所有不能做任何耗时操作。应该避免在这些方法中替换整个view 架构。&lt;/p&gt;
&lt;p&gt;相关方法的调用顺序为:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;window调用view controller的willRotateToInterfaceOrientation:duration:方法&lt;/p&gt;
&lt;p&gt;在此方法中,所有调整都还未进行。view的bounds,view controller的interfaceOrientation以及UIApplication的statusBarOrientation都为原来的值；可在此方法中隐藏视图或者做其他view布局的改变。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;window改变view的bounds。改变view的bounds会引发下面一系列操作(假定未使用autolayout):&lt;/p&gt;
&lt;p&gt;注:viewWillLayoutSubviews，viewDidLayoutSubviews方法在iOS5.0引入。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; a. view及其子views根据自身的autoresizing掩码设置重新调整大小。

 b. 调用view controller的viewWillLayoutSubviews方法。 
 在此方法运行时,view的bounds、view controller的interfaceOrientation以及UIApplication的statusBarOrientation都已经更新为新值。

 c. 调用view的layoutsubviews方法。

 d. 调用view controlelr的viewDidLayoutSubviews方法。
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用view controller的willAnimateRotationToInterfaceOrientation:duration:方法。&lt;/p&gt;
&lt;p&gt;此方法在动画块（animation block）中被调用，所以在此方法中的属性改变也参与到旋转动画中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;旋转动画终止。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用view controller的didRotateFromInterfaceOrientation: 方法通知旋转动画已终止。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="隐藏view-controller的界面旋转"&gt;&lt;a class="link" href="#5" &gt;隐藏view controller的界面旋转&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;若旋转发生时,view controller的内容没有显示在屏幕上(比如present了一个全屏view controller)，则此view controller不会收到上述的旋转消息。当此view controller重新显示时,其view会被调整位置和大小以适应新的界面方法，其过程如上述中的步骤2。&lt;/p&gt;
&lt;h3 id="横屏竖屏使用不同的viewcontroller"&gt;&lt;a class="link" href="#6" &gt;横屏竖屏使用不同的ViewController&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果一个页面在横屏和竖屏数据显示方式差别很大,可以使用两个单独的view controllers，一个使用竖屏显示，另一个使用横屏显示。使用两个view controllers与每次选择都调整整个view架构相比简单而且效率高。&lt;/p&gt;
&lt;p&gt;其实现方式如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;实现两个view controller对象,一个做竖屏显示布局，另一个做横屏显示布局。按照本文前面所述方法设置每个view controller只支持特定的一种界面方向，以防止在设备旋转时，view controller内部自行做旋转操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主view controller(通常为竖屏的那个)注册&lt;/p&gt;
&lt;p&gt;接收UIDeviceOrientationDidChangeNotification通知，在通知的处理方法中，根据当前的设备方向presen或dismiss另一个view controller。&lt;/p&gt;
&lt;p&gt;参考代码如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PortraitViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isShowingLandscapeView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LandscapeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;landscapeViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; landscapeViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[LandscapeViewController alloc]init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;orientationChanged:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)notification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientation deviceOrientation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIDevice currentDevice].orientation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (UIDeviceOrientationIsLandscape(deviceOrientation) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;isShowingLandscapeView) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentModalViewController:landscapeViewController animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isShowingLandscapeView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(UIDeviceOrientationIsPortrait(deviceOrientation) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; isShowingLandscapeView){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissModalViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isShowingLandscapeView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskPortrait;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LandscapeViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.modalTransitionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIModalTransitionStyleCrossDissolve;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskLandscape;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="contrainer-view-controller与设备旋转"&gt;&lt;a class="link" href="#7" &gt;Contrainer View controller与设备旋转&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Container View Controller在设备旋转的过程中扮演重要的角色。在iOS5旋转方向判断时,Container View Controller会调用子View controller的shouldAutorotateToInterfaceOrientation:方法，判断是否支持某一方向。在界面旋转的过程中,Container View Controller会调用当前正在显示的子View Controllers的&lt;a class="link" href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/willRotateToInterfaceOrientation:duration:" target="_blank" rel="noopener"
 &gt;willRotateToInterfaceOrientation:duration:&lt;/a&gt;等一系列方法。&lt;/p&gt;
&lt;p&gt;对于系统定义的Container View Controller，如UINavigationController,UITabBarViewController，上述过程是自动进行的。对于自定义的Container View Controller，则在添加/删除child view controllers时要做合适的处理,以保证相关消息的正确分发。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;向container View Controller增加child view controller&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;displayContentController:&lt;/span&gt; (UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChildViewController:content]; &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self frameForContentController]; &lt;span style="color:#75715e"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.currentClientView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [content didMoveToParentViewController:self]; &lt;span style="color:#75715e"&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1.调用container的addChildViewController:方法添加child，调用addChildViewController:会自动调用child的willMoveToParentViewController:方法。&lt;/p&gt;
&lt;p&gt;2.修改child view的frame，并将其加入到container的view架构中。&lt;/p&gt;
&lt;p&gt;3.调用child的 didMoveToParentViewController:方法通知操作已结束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从container View Controller移除child view controller&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;hideContentController:&lt;/span&gt; (UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) content
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [content willMoveToParentViewController:nil]; &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [content.view removeFromSuperview]; &lt;span style="color:#75715e"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [content removeFromParentViewController]; &lt;span style="color:#75715e"&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1.调用child的willMoveToParentViewController:，传递参数为nil，告知其将被移除。&lt;/p&gt;
&lt;p&gt;2.将child的view从container的view架构中移出。&lt;/p&gt;
&lt;p&gt;3.调用child的removeFromParentViewController的方法,调用此方法会自动调用child的didMoveToParentViewController:方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在两个child view controllers之间切换,综合上面两个步骤&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;cycleFromViewController:&lt;/span&gt; (UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) oldC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;toViewController:&lt;/span&gt; (UIViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) newC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [oldC willMoveToParentViewController:nil]; &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addChildViewController:newC];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newC.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self newViewStartFrame]; &lt;span style="color:#75715e"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect endFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self oldViewEndFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self transitionFromViewController: oldC toViewController: newC &lt;span style="color:#75715e"&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; duration: &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt; options:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animations:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newC.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; oldC.view.frame; &lt;span style="color:#75715e"&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; oldC.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; endFrame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; finished) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [oldC removeFromParentViewController]; &lt;span style="color:#75715e"&gt;// 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [newC didMoveToParentViewController:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果不想container自动转发rotation事件给child,则可重写shouldAutomaticallyForwardRotationMethods返回NO,然后在合适的时机手动调用child的willRotateToInterfaceOrientation:duration:等方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;附加:枚举常量定义&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;获取当前方向的三个方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIViewController的interfaceOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] statusBarOrientation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIDevice currentDevice] orientation];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UIDeviceOrientation定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationUnknown,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationPortrait,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationPortraitUpsideDown,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationLandscapeLeft,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationLandscapeRight,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationFaceUp,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDeviceOrientationFaceDown
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIDeviceOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UIInterfaceOrientation定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationPortrait &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationPortrait,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationPortraitUpsideDown &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationPortraitUpsideDown,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationLandscapeLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationLandscapeRight,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationLandscapeRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationLandscapeLeft
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIInterfaceOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意:UIInterfaceOrientationLandscapeLeft定义为UIDeviceOrientationLandscapeRight，UIInterfaceOrientationLandscapeRight定义为UIDeviceOrientationLandscapeLeft，两者是相反的。&lt;/p&gt;
&lt;p&gt;UIInterfaceOrientationMask定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskPortrait &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; UIInterfaceOrientationPortrait),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskLandscapeLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; UIInterfaceOrientationLandscapeLeft),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskLandscapeRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; UIInterfaceOrientationLandscapeRight),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskPortraitUpsideDown &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; UIInterfaceOrientationPortraitUpsideDown),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskLandscape &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (UIInterfaceOrientationMaskLandscapeLeft &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIInterfaceOrientationMaskLandscapeRight),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskAll &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (UIInterfaceOrientationMaskPortrait &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIInterfaceOrientationMaskLandscapeLeft &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskLandscapeRight &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIInterfaceOrientationMaskPortraitUpsideDown),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskAllButUpsideDown &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (UIInterfaceOrientationMaskPortrait &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIInterfaceOrientationMaskLandscapeLeft &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationMaskLandscapeRight),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIInterfaceOrientationMask;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS6 迷你计算器小实例</title><link>https://zhangdapeng.dev/p/ios6-mi-ni-ji-suan-qi-xiao-shi-li/</link><pubDate>Mon, 23 Jun 2025 15:27:29 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios6-mi-ni-ji-suan-qi-xiao-shi-li/</guid><description>&lt;p&gt;我们来做一下小的实例，迷你计算器，很简单的，虽然这里初次不是很完善，后面会渐渐完善的。&lt;/p&gt;
&lt;p&gt;新建Single View Application项目CaculateUI,类前缀CaculateUI。&lt;/p&gt;
&lt;p&gt;CaculateUIAppDelegate两个文件均为自动生成未修改。&lt;/p&gt;
&lt;p&gt;新建一个Objective-C Class，名为CalculatorBrain，这个就是MVC模式中的Model,所有的数据处理都在这里，CalculatorViewController取到数据后，作简单的转换以符合Model的要求，再传给Model，由Model处理完返回处理结果给Controller,再由Controller更新View.&lt;/p&gt;
&lt;p&gt;CalculatorBrain.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CalculatorBrain.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CalculatorBrain&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//存储执行结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//存储操作符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempOperateString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;operate:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;) number&lt;span style="color:#f92672"&gt;:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) operateString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;caculate:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;) number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CalculatorBrain.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CalculatorBrain.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CalculatorBrain.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CalculatorBrain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; tempOperateString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;operate:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;)number &lt;span style="color:#f92672"&gt;:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)operateString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tempOperateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; operateString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;) caculate:(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;)number
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//根据操作符执行相关操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.tempOperateString isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;+&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.tempOperateString isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;-&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.tempOperateString isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;*&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.tempOperateString isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;/&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(number &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.result &lt;span style="color:#f92672"&gt;/=&lt;/span&gt; number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self.result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于我这里没有使用xib这种东西，所以下面就感觉比较复杂，不过您如果有更好的方法，请提示我一下，谢谢&lt;/p&gt;
&lt;p&gt;CaculateUIViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUIViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-29.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CalculatorBrain&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FUIButton&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CaculateUIViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;One;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Two;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Three;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Four;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Five;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Six;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Seven;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Eight;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Nine;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Ten;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Zero;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//小数点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Decimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//等号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Equal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//加号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Plus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//减号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Minus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//乘号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Multiply;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//除号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Division;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;display;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isEntering;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) CalculatorBrain &lt;span style="color:#f92672"&gt;*&lt;/span&gt;brain;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数字键按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;digitalPressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//操作符按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;operatePressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//等于号按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;enterPressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CaculateUIViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUIViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CaculateUI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-29.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CaculateUIViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CalculatorBrain.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;FUIButton.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UIColor+FlatUI.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UIFont+FlatUI.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UINavigationBar+FlatUI.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CaculateUIViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CaculateUIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; One;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Two;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Three;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Four;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Five;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Six;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Seven;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Eight;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Nine;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Ten;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Zero;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Decimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Equal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Plus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Minus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Multiply;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; Division;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; display;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; brain;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; isEntering;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CGFloat btnWidth = 70.0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat btnXInterval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat btnWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;迷你计算器&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;310.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;90.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentRight;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:display];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.brain)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.brain &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CalculatorBrain alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第一个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; One &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [One setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [One setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [One addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:One];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:One];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第二个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Two &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Two setFrame:CGRectMake(btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Two setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;2&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Two addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Two];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第三个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Three &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Three setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Three setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;3&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Three addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Three];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//加号按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Plus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Plus setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Plus setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;+&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Plus addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(operatePressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Plus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第四个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Four &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Four setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;135.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Four setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;4&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Four addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Four];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第五个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Five &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Five setFrame:CGRectMake(btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;135.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Five setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;5&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Five addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Five];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第六个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Six &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Six setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;135.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Six setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;6&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Six addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Six];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//减号按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Minus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Minus setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;135.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Minus setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;-&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Minus addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(operatePressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Minus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第七个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Seven &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Seven setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;170.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Seven setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;7&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Seven addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Seven];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第八个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Eight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Eight setFrame:CGRectMake(btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;170.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Eight setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;8&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Eight addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Eight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第九个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Nine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Nine setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;170.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Nine setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;9&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Nine addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Nine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//乘号按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Multiply &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Multiply setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;170.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Multiply setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;*&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Multiply addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(operatePressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Multiply];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//小数点按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Decimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Decimal setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;205.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Decimal setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;.&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Decimal addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Decimal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第十个按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ten &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Ten setFrame:CGRectMake(btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;205.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Ten setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Ten addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(digitalPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Ten];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//等号按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Equal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Equal setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;205.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Equal setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;=&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Equal addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(enterPressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Equal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//除号按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Division &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [FUIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Division setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnWidth &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btnXInterval,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;205.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Division setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;/&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [Division addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(operatePressed:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:Division];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:One];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Two];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Three];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Four];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Five];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Six];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Seven];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Eight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Nine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Ten];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Zero];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Equal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Decimal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Plus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Minus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Multiply];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self decorationButton:Division];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewDidAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController.navigationBar configureFlatNavigationBarWithColor:[UIColor midnightBlueColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;decorationButton:&lt;/span&gt;(FUIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)btn{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.buttonColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor turquoiseColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.shadowColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenSeaColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.shadowHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont boldFlatFontOfSize:&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btn setTitleColor:[UIColor cloudsColor] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btn setTitleColor:[UIColor cloudsColor] forState:UIControlStateHighlighted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(CalculatorBrain *) brain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if(!self.brain)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// self.brain = [[CalculatorBrain alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return self.brain;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数字键按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;digitalPressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.isEntering &lt;span style="color:#f92672"&gt;==&lt;/span&gt; YES)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//如果之前输入的数字少于12位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.display.text length] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把按到的数字转换成字符串加到原来显示的字符串的末尾，并更新显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.display.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.display.text stringByAppendingString:[sender currentTitle]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&lt;span style="color:#75715e"&gt;//如果就输入的数字大于等于12位，不操作，直接返回
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&lt;span style="color:#75715e"&gt;//如果之前不是输入状态，即现在输入的是数字的第一位（最高位）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//显示输入的数字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.display.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [sender currentTitle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把输入的状态改为YES
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.isEntering &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//操作符按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;operatePressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//输入状态改为NO
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.isEntering &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取到显示的数字。转换为double
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.display.text doubleValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把数字和操作符发送给CalculatorBrain的operate接收器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.brain operate:num :[sender currentTitle]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//等于号按下操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;enterPressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把输入状态改为NO
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.isEntering &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取到显示的数字，转换为double
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.display.text doubleValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把数字发送给CalculateBrain的calcute接收器，并接受返回的结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.brain caculate:num];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把结果显示在屏幕上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.display.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%g&amp;#34;&lt;/span&gt;,result];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (toInterfaceOrientation &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; UIDeviceOrientationPortraitUpsideDown);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(BOOL) shouldAutorotate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return YES;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(NSUInteger) supportedInterfaceOrientations
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return UIInterfaceOrientationMaskLandscape;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面使用到了FlatUI，可以自行google搜索然后下载。&lt;/p&gt;</description></item><item><title>iOS 6的Rotation</title><link>https://zhangdapeng.dev/p/ios-6-de-rotation/</link><pubDate>Mon, 23 Jun 2025 15:27:25 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-6-de-rotation/</guid><description>&lt;p&gt;UIViewController的shouldAutorotateToInterfaceOrientation方法被deprecated。在ios6里，是使用supportedInterfaceOrientations and shouldAutorotate 2个方法来代替shouldAutorotateToInterfaceOrientation。注意：为了向后兼容iOS 4 and 5，还是需要在你的app里保留shouldAutorotateToInterfaceOrientation。&lt;/p&gt;
&lt;p&gt;ios 4 and 5, 如果没有重写shouldAutorotateToInterfaceOrientation，那么对于iphone来讲，by default是只支持portrait，不能旋转。&lt;/p&gt;
&lt;p&gt;ios 6, 如果没有重写shouldAutorotate and supportedInterfaceOrientations,by default, iphone则是&amp;quot;可以旋转，支持非upside down的方向&amp;quot;，而ipad是&amp;quot;可以选择，支持所有方向&amp;quot;&lt;/p&gt;
&lt;p&gt;举个例子;&lt;/p&gt;
&lt;p&gt;ios 4 and 5, iphone device, 若要&amp;quot;可以旋转，支持非upside down的方向&amp;quot;，则可以在view controller里&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)interfaceOrientation 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (interfaceOrientation &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; UIDeviceOrientationPortraitUpsideDown);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ios 6, iphone device, 若要“不能旋转，只支持portait&amp;quot;，则可以在view controller里&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ios 6, ipad device, 若要“可以旋转，只支持landscape&amp;quot;，则可以在view controller里&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskLandscape;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在iOS 4 and 5，都是由具体的view controller来决定对应的view的orientation设置。而在iOS 6,则是由top-most controller来决定view的orientation设置。&lt;/p&gt;
&lt;p&gt;举个例子：你的app的rootViewController是navigation controller &amp;ldquo;nav&amp;rdquo;, 在”nav&amp;quot;里的stack依次是：main view -&amp;gt; sub view &amp;gt; sub sub view，而main view里有一个button会present modal view &amp;ldquo;modal view&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;那么ios 4 and 5，在ipad里，如果你要上述view都仅支持横屏orientation，你需要在上面的main view, sub view, sub sub view, model view里都添加&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)interfaceOrientation 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (interfaceOrientation &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIInterfaceOrientationLandscapeLeft &lt;span style="color:#f92672"&gt;||&lt;/span&gt; interfaceOrientation&lt;span style="color:#f92672"&gt;==&lt;/span&gt;UIInterfaceOrientationLandscapeRight);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而对于iOS6, 由于是由top-most controller来设置orientation，因此你在main view, sub view, sub sub view里添加下面的代码是没有任何效果的，而应该是在nav controller里添加下列代码。而modal view则不是在nav container里，因此你也需要在modal view里也添加下列代码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskLandscape;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意几点：&lt;/p&gt;
&lt;p&gt;1，你需要自定义一个UINavigationController的子类for &amp;ldquo;nav controller&amp;rdquo;，这样才可以添加上述代码。&lt;/p&gt;
&lt;p&gt;2，和navigation controller类似，tab controller里的各个view的orientation设置应该放在tab controller里&lt;/p&gt;
&lt;p&gt;ios6的top-most controller决定orientation设置，导致这样一个问题：在 top-most controller里的views无法拥有不相同的orientation设置。例如：for iphone, 在nav controller里，你有main view, sub view and sub sub view，前2个都只能打竖，而sub sub view是用来播放video，可以打横打竖。那么在ios 4 and 5里可以通过在main view and sub view的shouldAutorotateToInterfaceOrientation里设置只能打竖，而在sub sub view的shouldAutorotateToInterfaceOrientation设置打竖打横即可。而在ios 6里则无法实现这种效果，因为在main view, sub view and sub sub view的orientation设置是无效的，只能够在nav controller里设置。那么你可能想着用下列代码在nav controller里控制哪个view打竖，哪个view打横&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[self topViewController] isKindOfClass:[SubSubView &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskAllButUpsideDown;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskPortrait;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是的，这样可以使得在main view and sub view里无法打横，而sub sub view横竖都行。但问题来了，如果在sub sub view时打横，然后back to sub view，那么sub view是打横显示的！&lt;/p&gt;
&lt;p&gt;目前想到的解决方法只能是把sub sub view脱离nav controller，以modal view方式来显示。这样就可以在modal view里设置打横打竖，而在nav controller里设置只打竖。&lt;/p&gt;
&lt;p&gt;1，说了那么多，其实如果你的app的所有view的orientation的设置是统一的，那么你可以简单的在plist file里设置即可，不用添加上面的代码。而如果你添加了上面的代码，就会覆盖plist里orientation的设置。&lt;/p&gt;
&lt;p&gt;2，iOS 6, 当view controller present时，不会call willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, and didRotateFromInterfaceOrientation: methods，只有在发生rotate的时候才会call&lt;/p&gt;</description></item><item><title>iOS中使用QLPreviewController来预览文件</title><link>https://zhangdapeng.dev/p/ios-zhong-shi-yong-qlpreviewcontroller-lai-yu-lan-wen-jian/</link><pubDate>Fri, 20 Jun 2025 14:34:11 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-shi-yong-qlpreviewcontroller-lai-yu-lan-wen-jian/</guid><description>&lt;p&gt;Mac OS系统有一个很方便的功能就是文件预览，在Finder中选中一个文件，按下空格键就能够预览其中的内容。支持图片、文档、视频等类型。在iOS4.0系统中，官方SDK提供了一个QLPreviewController，使用它就可以让我们的App在iPhone/iPad中直接预览各个文件了。官方的开发文档中说明其支持的文件类型有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;iWork文档&lt;/li&gt;
&lt;li&gt;微软Office97以上版本的文档&lt;/li&gt;
&lt;li&gt;RTF文档&lt;/li&gt;
&lt;li&gt;PDF文件&lt;/li&gt;
&lt;li&gt;图片文件&lt;/li&gt;
&lt;li&gt;文本文件和CSV文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用方法也很简单，直接alloc出一个QLPreviewController对象，用presentModalViewController方法把它调出来即可。要指定QLPreviewController预览那个文件，只要直接实现它的代理方法previewItemAtIndex，返回一个NSURL对象即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;previewController:&lt;/span&gt;(QLPreviewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)previewController &lt;span style="color:#a6e22e"&gt;previewItemAtIndex:&lt;/span&gt;(NSInteger)idx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSURL fileURLWithPath:[NSString stringWithFormat:@&lt;span style="color:#960050;background-color:#1e0010"&gt;“&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;@&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Documents&lt;span style="color:#f92672"&gt;/&lt;/span&gt;files&lt;span style="color:#f92672"&gt;/%&lt;/span&gt;@&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;, NSHomeDirectory(), [fileList objectAtIndex:currentIndex]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>GameKit 发送复杂的数据</title><link>https://zhangdapeng.dev/p/gamekit-fa-song-fu-za-de-shu-ju/</link><pubDate>Fri, 20 Jun 2025 14:34:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/gamekit-fa-song-fu-za-de-shu-ju/</guid><description>&lt;p&gt;使用GameKit 发送复杂的数据，&lt;/p&gt;
&lt;p&gt;通过GameKit以字符串的形式发送颜色信息，这里涉及到一个知识点就是序列化数据和反序列化数据&lt;/p&gt;
&lt;p&gt;关于复杂数据的发送有两个方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;stringFromColor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; CGFloat &lt;span style="color:#f92672"&gt;*&lt;/span&gt;c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGColorGetComponents(self.CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorSpaceModel csm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGColorSpaceGetModel(CGColorGetColorSpace(self.CGColor));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (csm &lt;span style="color:#f92672"&gt;==&lt;/span&gt; kCGColorSpaceModelRGB) &lt;span style="color:#f92672"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%0.2f %0.2f %0.2f %0.2f&amp;#34;&lt;/span&gt;, c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%0.2f %0.2f %0.2f %0.2f&amp;#34;&lt;/span&gt;, c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], c[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;colorWithString:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) colorString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; CGFloat c[&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sscanf([colorString cStringUsingEncoding:NSUTF8StringEncoding], &lt;span style="color:#e6db74"&gt;&amp;#34;%f %f %f %f&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;c[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;c[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;c[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [UIColor colorWithRed:c[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] green:c[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] blue:c[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] alpha:c[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这就是颜色转字符串，字符串转颜色的方法，这里实现支持ios5&lt;/p&gt;
&lt;p&gt;这点代码放在了&lt;a class="link" href="https://github.com/zhangda89/DrawView" target="_blank" rel="noopener"
 &gt;DrawView&lt;/a&gt;文件中&lt;/p&gt;
&lt;p&gt;整个发送复杂数据的流程如下&lt;/p&gt;
&lt;p&gt;ComplexObjectsViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ComplexObjectsViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SendingComplexObjects
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-6.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameKitHelper.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;DrawView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) 	[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COLOR_ARRAY [NSArray arrayWithObjects:[UIColor whiteColor], [UIColor lightGrayColor], [UIColor darkGrayColor], [UIColor redColor], [UIColor orangeColor], [UIColor yellowColor], [UIColor greenColor], [UIColor blueColor], [UIColor purpleColor], nil]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BASE_TINT	[UIColor darkGrayColor]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define DATAPATH [NSString stringWithFormat:@&amp;#34;%@/Documents/drawing.archive&amp;#34;, NSHomeDirectory()]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ComplexObjectsViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;archiveInterface&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ComplexObjectsViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ComplexObjectsViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SendingComplexObjects
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-6.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ComplexObjectsViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ComplexObjectsViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ComplexObjectsViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.view.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BASE_TINT;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Retrieve (or create) the drawing surface
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self unarchiveInterface];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Set up the color picking segmented controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray array];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;color &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; COLOR_ARRAY)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [items addObject:[self swatchWithColor:color]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;seg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:items];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;102&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(&lt;span style="color:#ae81ff"&gt;160.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;416.0f&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BASE_TINT;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [seg addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(colorChange:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:seg];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;清除&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(doClear));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sharedInstance].dataDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sharedInstance].sessionID &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Drawing Together&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper assignViewController:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;swatchWithColor:&lt;/span&gt;(UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)color
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; side &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsBeginImageContext(CGSizeMake(side, side));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [color setFill];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextFillRect(context, CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, side, side));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;img &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetImageFromCurrentImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsEndImageContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; img;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Transmit a clear request to the draw view
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;doClear&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [(DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[self.view viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;] clear];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Transmit a color change request to the draw view
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;colorChange:&lt;/span&gt;(UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)seg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [COLOR_ARRAY objectAtIndex:seg.selectedSegmentIndex];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dv &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[self.view viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dv.currentColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; color;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Save the interface to file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;archiveInterface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dv &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[self.view viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSKeyedArchiver archiveRootObject:dv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toFile:DATAPATH];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;unarchiveInterface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DrawView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dv &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSKeyedUnarchiver unarchiveObjectWithFile:DATAPATH];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;dv)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dv &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[DrawView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;416.0f&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dv.userInteractionEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dv.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:dv];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的GameKitHelper.h和GameKitHelper.m文件可以到这里下载&lt;a class="link" href="https://github.com/zhangda89/GameKitHelper" target="_blank" rel="noopener"
 &gt;GameKitHelper&lt;/a&gt;&lt;/p&gt;</description></item><item><title>后台监控 GameKit监控 监控文件输出的重定向</title><link>https://zhangdapeng.dev/p/hou-tai-jian-kong-gamekit-jian-kong-jian-kong-wen-jian-shu-chu-de-zhong-ding-xiang/</link><pubDate>Fri, 20 Jun 2025 14:33:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/hou-tai-jian-kong-gamekit-jian-kong-jian-kong-wen-jian-shu-chu-de-zhong-ding-xiang/</guid><description>&lt;p&gt;在了解GameKit这一块的时候，有个是关于监控的，就是监控错误的输出，然后显示，在项目中我们可以巧妙的使用这个技巧来完成错误日志的输出然后提交的给我们，然后我们进行错误日志的分析，来改善我们的项目&lt;/p&gt;
&lt;p&gt;这里是选自cookbook的示例&lt;/p&gt;
&lt;p&gt;MonitorGameKitViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MonitorGameKitViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MonitorGameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-4.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameKitHelper.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR	[UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) 	[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define STDERR_OUT [NSHomeDirectory() stringByAppendingPathComponent:@&amp;#34;tmp/stderr.txt&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MonitorGameKitViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;textView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MonitorGameKitViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MonitorGameKitViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MonitorGameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-9-4.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;MonitorGameKitViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MonitorGameKitViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MonitorGameKitViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; textView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;listenForStderr:&lt;/span&gt; (NSTimer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) timer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;contents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithContentsOfFile:STDERR_OUT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoding:NSUTF8StringEncoding
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:NULL];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [contents stringByReplacingOccurrencesOfString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([contents isEqualToString:textView.text])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [textView setText:contents];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textView.contentOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, MAX(textView.contentSize.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; textView.frame.size.height, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sharedInstance].sessionID &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Peeking at GameKit&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper assignViewController:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; freopen([STDERR_OUT fileSystemRepresentation], &lt;span style="color:#e6db74"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;, stderr);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSTimer scheduledTimerWithTimeInterval:&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(listenForStderr:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userInfo:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repeats:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关于GameKitHelper的文件，可以到这里下载&lt;a class="link" href="https://github.com/zhangda89/iphone-3.0-cookbook-/blob/master/C12-GameKit/02-Monitoring%20GameKit/main.m" target="_blank" rel="noopener"
 &gt;GameKitHelper&lt;/a&gt;，如果想支持IOS5的话可以到这里&lt;a class="link" href="https://github.com/zhangda89/GameKitHelper" target="_blank" rel="noopener"
 &gt;GameKitHelper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里重要的一点是利用了错误日志重定向到文件。&lt;/p&gt;</description></item><item><title>iOS GameKit聊天 文本聊天 简单示例</title><link>https://zhangdapeng.dev/p/ios-gamekit-liao-tian-wen-ben-liao-tian-jian-dan-shi-li/</link><pubDate>Fri, 20 Jun 2025 11:50:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-gamekit-liao-tian-wen-ben-liao-tian-jian-dan-shi-li/</guid><description>&lt;p&gt;最近看了一下关于手机蓝牙的相关东西，涉及到了GameKit这个东西，不知道干嘛用的，一眼望过去以为是游戏的东西，不过看过文档后，其实也可以用在游戏中的。不过这里主要是蓝牙这方面的&lt;/p&gt;
&lt;p&gt;关于聊天，其实就是就几个过程1，连接；2，传输数据和处理数据&lt;/p&gt;
&lt;p&gt;关于这个过程其实我们可以直接自己写一个辅助类来解决就好了&lt;/p&gt;
&lt;p&gt;我这边摘录了以为大牛的帮助类&lt;/p&gt;
&lt;p&gt;GameKitHelper.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GameKitHelper.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Simple GameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;GameKit/GameKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define DO_DATA_CALLBACK(X, Y) if (self.dataDelegate &amp;amp;&amp;amp; [self.dataDelegate respondsToSelector:@selector(X)]) [self.dataDelegate performSelector:@selector(X) withObject:Y];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define showAlert(format, ...) myShowAlert(__LINE__, (char *)__FUNCTION__, format, ##__VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) [[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@protocol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelperDataDelegate&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NSObject&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@optional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) connectionEstablished;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connectionLost&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sentData:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) errorMessage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;receivedData:&lt;/span&gt; (NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelper&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;GKPeerPickerControllerDelegate, GKSessionDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sessionID;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;GameKitHelperDataDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; dataDelegate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;viewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;session;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isConnected;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; dataDelegate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;viewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sessionID;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;session;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isConnected;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connect&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;disconnect&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sendData:&lt;/span&gt; (NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;assignViewController:&lt;/span&gt; (UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(GameKitHelper &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sharedInstance&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GameKitHelper.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GameKitHelper.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Simple GameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameKitHelper.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; dataDelegate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; viewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; session;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; sessionID;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; isConnected;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Simple Alert Utility
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;myShowAlert&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; line, &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;functname, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; formatstring, ...)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; va_list arglist;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;formatstring)&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; va_start(arglist, formatstring);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; outstring &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc] initWithFormat:formatstring
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arguments:arglist];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; va_end(arglist);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;av &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:outstring
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles: nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [av show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Shared Instance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; GameKitHelper &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sharedInstance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(GameKitHelper &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sharedInstance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;sharedInstance)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sharedInstance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sharedInstance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Data Sharing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sendDataToPeers:&lt;/span&gt; (NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; didSend &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.session sendDataToAllPeers:data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withDataMode:GKSendDataReliable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;didSend)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Error sending data to peers: %@&amp;#34;&lt;/span&gt;, [error localizedDescription]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DO_DATA_CALLBACK(sentData:, (didSend &lt;span style="color:#f92672"&gt;?&lt;/span&gt; nil &lt;span style="color:#f92672"&gt;:&lt;/span&gt; [error localizedDescription]));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;receiveData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data &lt;span style="color:#a6e22e"&gt;fromPeer:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)peer &lt;span style="color:#a6e22e"&gt;inSession:&lt;/span&gt;(GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)session &lt;span style="color:#a6e22e"&gt;context:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)context
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DO_DATA_CALLBACK(receivedData:, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Connections
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;startConnection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.isConnected)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GKPeerPickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;picker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[GKPeerPickerController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.connectionTypesMask &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GKPeerPickerConnectionTypeNearby;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.viewController)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Dismiss the peeer picker on cancel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;peerPickerControllerDidCancel:&lt;/span&gt;(GKPeerPickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)picker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.viewController)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;Connect&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(startConnection));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;peerPickerController:&lt;/span&gt;(GKPeerPickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)picker &lt;span style="color:#a6e22e"&gt;didConnectPeer:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)peerID &lt;span style="color:#a6e22e"&gt;toSession:&lt;/span&gt;(GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)session
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker dismiss];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.session setDataReceiveHandler:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withContext:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isConnected &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DO_DATA_CALLBACK(connectionEstablished, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;peerPickerController:&lt;/span&gt;(GKPeerPickerController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)picker &lt;span style="color:#a6e22e"&gt;sessionForConnectionType:&lt;/span&gt;(GKPeerPickerConnectionType)type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.session)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.session &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[GKSession alloc] initWithSessionID:(self.sessionID &lt;span style="color:#f92672"&gt;?&lt;/span&gt; self.sessionID : &lt;span style="color:#e6db74"&gt;@&amp;#34;Sample Session&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; displayName:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sessionMode:GKSessionModePeer];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.session.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self.session;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Session Handling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;disconnect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.session disconnectFromAllPeers];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.session &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;session:&lt;/span&gt;(GKSession &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)session &lt;span style="color:#a6e22e"&gt;peer:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)peerID &lt;span style="color:#a6e22e"&gt;didChangeState:&lt;/span&gt;(GKPeerConnectionState)state
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* STATES: GKPeerStateAvailable, = 0, GKPeerStateUnavailable, = 1, GKPeerStateConnected, = 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; GKPeerStateDisconnected, = 3, GKPeerStateConnecting = 4 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;states &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;Available&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;Unavailable&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;Connected&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;Disconnected&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;Connecting&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Peer state is now %@&amp;#34;&lt;/span&gt;,[states objectAtIndex:state]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; GKPeerStateConnected)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.viewController)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;Disconnect&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(disconnect));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; GKPeerStateDisconnected)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.isConnected &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showAlert(&lt;span style="color:#e6db74"&gt;@&amp;#34;Lost connection with peer. You are no longer connected to another device.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self disconnect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.viewController)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;Connect&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(startConnection));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DO_DATA_CALLBACK(connectionLost, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;assignViewController:&lt;/span&gt; (UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; aViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.viewController.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;Connect&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(startConnection));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Class utility methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self sharedInstance] startConnection];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;disconnect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self sharedInstance] disconnect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;sendData:&lt;/span&gt; (NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self sharedInstance] sendDataToPeers:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;assignViewController:&lt;/span&gt; (UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self sharedInstance] assignViewController:aViewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后使用这里类，做了一个简单的示例，我因为就一个iphone，真实的两个手机之间的连接与信息通讯我没有测试过，这个在项目中是不可取的，不过这里我们就是做一个如何来使用这个GameKit的工具，如何实现这个过程，先感受一下，看下面的代码吧：&lt;/p&gt;
&lt;p&gt;GameKitHelperViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GameKitHelperViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Simple GameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameKitHelper.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelperViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;GameKitHelperDataDelegate,UITextViewDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sendView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receviceView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GameKitHelperViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GameKitHelperViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Simple GameKit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GameKitHelperViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelperViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GameKitHelperViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; sendView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; receviceView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;Clear&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(clear));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sharedInstance].sessionID &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Typing Together&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sharedInstance].dataDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper assignViewController:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sendView becomeFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesBegan:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - methods of textview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;textViewDidChange:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[GameKitHelper sharedInstance].isConnected)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.sendView.text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;text &lt;span style="color:#f92672"&gt;||&lt;/span&gt; (text.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;clear&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;textData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [text dataUsingEncoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [GameKitHelper sendData:textData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;receivedData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc] initWithData:data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; receviceView.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [text isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;clear&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sendView.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我是使用了storyboard，然后里面加了两个UITextView&lt;/p&gt;</description></item><item><title>苹果官方 Crash文件分析方法 （iOS系统Crash文件分析方法）</title><link>https://zhangdapeng.dev/p/ping-guo-guan-fang-crash-wen-jian-fen-xi-fang-fa-ios-xi-tong-crash-wen-jian-fen-xi-fang-fa/</link><pubDate>Fri, 20 Jun 2025 11:50:43 +0000</pubDate><guid>https://zhangdapeng.dev/p/ping-guo-guan-fang-crash-wen-jian-fen-xi-fang-fa-ios-xi-tong-crash-wen-jian-fen-xi-fang-fa/</guid><description>&lt;p&gt;对于提交的苹果官方的app，在审核的时候会给我们一些crash文件，对于这些有用的文件，里面是关于我们的bug的一些信息，那么该如何去调试呢&lt;br&gt;
第一步：在任意目录创建一个目录，用来调试crash，我这里创建一个crash目录&lt;br&gt;
第二步：将之前Archive的文件copy到crash目录里面&lt;/p&gt;
&lt;p&gt;其中包括两个文件.app和.app.dSYM&lt;/p&gt;
&lt;p&gt;如果找不到的话可以按照下面的步骤进行&lt;/p&gt;
&lt;p&gt;先到Organizer&lt;/p&gt;
&lt;p&gt;1，找到提交那个时刻的Archive文件，选中，show in Finder&lt;/p&gt;
&lt;p&gt;2，然后到达这里，然后再选中红色区域，会出现3中所示的提示&lt;/p&gt;
&lt;p&gt;3，ok显示包内容，然后自己找找吧，肯定会有的&lt;/p&gt;
&lt;p&gt;copy就好了&lt;/p&gt;
&lt;p&gt;第三步：将symbolicatecrash工具copy到crash目录&lt;/p&gt;
&lt;p&gt;找不到这个文件可以去&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里看看，应该就会有了。&lt;/p&gt;
&lt;p&gt;第四步：将要调试的crash文件copy到crash目录&lt;/p&gt;
&lt;p&gt;这个crash文件，这里是来自苹果官方的，其实有时候也是来自其他的用户的电脑上的。&lt;br&gt;
第五步：通过命令进行测试&lt;br&gt;
打开终端，转到crash目录&lt;br&gt;
执行如下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./symbolicatecrash ./2013-08-16-035933_DLiPad.crash ./appname.app.dSYM &amp;gt; symbol.crash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ./symbol.crash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Incident Identifier: 5434D911-E207-4D79-9139-40EA4EA76B45
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CrashReporter Key: d11ed3a4adbb0d9ca4d6016e73e439640f95f289
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hardware Model: xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Process: appname &lt;span style="color:#f92672"&gt;[&lt;/span&gt;8158&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Path: /var/mobile/Applications/2AB1E8EB-6ECE-44F4-8195-4042339DD359/appname.app/appname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Identifier: appname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Version: ??? &lt;span style="color:#f92672"&gt;(&lt;/span&gt;???&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Code Type: ARM &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Native&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Parent Process: launchd &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Date/Time: 2013-08-16 03:59:33.513 +0800
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OS Version: iOS 6.1.3 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;10B329&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Report Version: &lt;span style="color:#ae81ff"&gt;104&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exception Type: EXC_CRASH &lt;span style="color:#f92672"&gt;(&lt;/span&gt;SIGABRT&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exception Codes: 0x0000000000000000, 0x0000000000000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Crashed Thread: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Last Exception Backtrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; CoreFoundation 0x3126029e 0x3119e000 + &lt;span style="color:#ae81ff"&gt;795294&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libobjc.A.dylib 0x3910497a 0x390fc000 + &lt;span style="color:#ae81ff"&gt;35194&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; UIKit 0x333f537c 0x33065000 + &lt;span style="color:#ae81ff"&gt;3736444&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; UIKit 0x3323758e 0x33065000 + &lt;span style="color:#ae81ff"&gt;1910158&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; UIKit 0x330c079c 0x33065000 + &lt;span style="color:#ae81ff"&gt;374684&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; UIKit 0x33068c34 0x33065000 + &lt;span style="color:#ae81ff"&gt;15412&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; UIKit 0x330686c8 0x33065000 + &lt;span style="color:#ae81ff"&gt;14024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; UIKit 0x33068116 0x33065000 + &lt;span style="color:#ae81ff"&gt;12566&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; GraphicsServices 0x34d5c59e 0x34d56000 + &lt;span style="color:#ae81ff"&gt;26014&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; GraphicsServices 0x34d5c1ce 0x34d56000 + &lt;span style="color:#ae81ff"&gt;25038&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; CoreFoundation 0x3123516e 0x3119e000 + &lt;span style="color:#ae81ff"&gt;618862&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; CoreFoundation 0x31235112 0x3119e000 + &lt;span style="color:#ae81ff"&gt;618770&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; CoreFoundation 0x31233f94 0x3119e000 + &lt;span style="color:#ae81ff"&gt;614292&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; CoreFoundation 0x311a6eb8 0x3119e000 + &lt;span style="color:#ae81ff"&gt;36536&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; CoreFoundation 0x311a6d44 0x3119e000 + &lt;span style="color:#ae81ff"&gt;36164&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; UIKit 0x330bf480 0x33065000 + &lt;span style="color:#ae81ff"&gt;369792&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt; UIKit 0x330bc2fc 0x33065000 + &lt;span style="color:#ae81ff"&gt;357116&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;17&lt;/span&gt; appname 0x000cf358 0xce000 + &lt;span style="color:#ae81ff"&gt;4952&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt; libdyld.dylib 0x3953bb1c 0x3953a000 + &lt;span style="color:#ae81ff"&gt;6940&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; name: Dispatch queue: com.apple.main-thread
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; Crashed:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x39602350 __pthread_kill + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libsystem_c.dylib 0x3957911e pthread_kill + &lt;span style="color:#ae81ff"&gt;54&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; libsystem_c.dylib 0x395b596e abort + &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; libc++abi.dylib 0x38b53d4a abort_message + &lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; libc++abi.dylib 0x38b50ff4 default_terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; libobjc.A.dylib 0x39104a74 _objc_terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;144&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; libc++abi.dylib 0x38b51078 safe_handler_caller&lt;span style="color:#f92672"&gt;(&lt;/span&gt;void &lt;span style="color:#f92672"&gt;(&lt;/span&gt;*&lt;span style="color:#f92672"&gt;)())&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;76&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; libc++abi.dylib 0x38b51110 std::terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; libc++abi.dylib 0x38b52594 __cxa_rethrow + &lt;span style="color:#ae81ff"&gt;84&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; libobjc.A.dylib 0x391049cc objc_exception_rethrow + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; CoreFoundation 0x311a6f1c CFRunLoopRunSpecific + &lt;span style="color:#ae81ff"&gt;452&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; CoreFoundation 0x311a6d44 CFRunLoopRunInMode + &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; UIKit 0x330bf480 -&lt;span style="color:#f92672"&gt;[&lt;/span&gt;UIApplication _run&lt;span style="color:#f92672"&gt;]&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;664&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; UIKit 0x330bc2fc UIApplicationMain + &lt;span style="color:#ae81ff"&gt;1116&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; appname 0x000cf358 0xce000 + &lt;span style="color:#ae81ff"&gt;4952&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; libdyld.dylib 0x3953bb1c start + &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread 1:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x39602d98 __workq_kernreturn + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libsystem_c.dylib 0x39550cf6 _pthread_workq_return + &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; libsystem_c.dylib 0x39550a12 _pthread_wqthread + &lt;span style="color:#ae81ff"&gt;362&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; libsystem_c.dylib 0x395508a0 start_wqthread + &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; name: Dispatch queue: com.apple.libdispatch-manager
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread 2:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x395f2648 kevent64 + &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libdispatch.dylib 0x39522974 _dispatch_mgr_invoke + &lt;span style="color:#ae81ff"&gt;792&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; libdispatch.dylib 0x39522654 _dispatch_mgr_thread$VARIANT$mp + &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread 3:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x39602d98 __workq_kernreturn + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libsystem_c.dylib 0x39550cf6 _pthread_workq_return + &lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; libsystem_c.dylib 0x39550a12 _pthread_wqthread + &lt;span style="color:#ae81ff"&gt;362&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; libsystem_c.dylib 0x395508a0 start_wqthread + &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; name: WebThread
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread 4:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x395f1eb4 mach_msg_trap + &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libsystem_kernel.dylib 0x395f2048 mach_msg + &lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; CoreFoundation 0x31235040 __CFRunLoopServiceMachPort + &lt;span style="color:#ae81ff"&gt;124&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; CoreFoundation 0x31233d9e __CFRunLoopRun + &lt;span style="color:#ae81ff"&gt;878&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; CoreFoundation 0x311a6eb8 CFRunLoopRunSpecific + &lt;span style="color:#ae81ff"&gt;352&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; CoreFoundation 0x311a6d44 CFRunLoopRunInMode + &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; WebCore 0x37196500 RunWebThread&lt;span style="color:#f92672"&gt;(&lt;/span&gt;void*&lt;span style="color:#f92672"&gt;)&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;440&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; libsystem_c.dylib 0x3955b30e _pthread_start + &lt;span style="color:#ae81ff"&gt;306&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; libsystem_c.dylib 0x3955b1d4 thread_start + &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thread &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; crashed with ARM Thread State &lt;span style="color:#f92672"&gt;(&lt;/span&gt;32-bit&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r0: 0x00000000 r1: 0x00000000 r2: 0x00000000 r3: 0x3b0f8534
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r4: 0x00000006 r5: 0x3b0f8b88 r6: 0x1d844f24 r7: 0x2fd329f4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r8: 0x1d844f00 r9: 0x00000300 r10: 0x334de04b r11: 0x1c535350
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip: 0x00000148 sp: 0x2fd329e8 lr: 0x39579123 pc: 0x39602350
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cpsr: 0x00000010
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;......
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再执行如下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dwarfdump --lookup 0x000cf358 --arch armv7 appname.app.dSYM/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键是在这里&lt;code&gt;0x000cf358&lt;/code&gt;，他是来自这里的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; libsystem_kernel.dylib 0x39602350 __pthread_kill + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; libsystem_c.dylib 0x3957911e pthread_kill + &lt;span style="color:#ae81ff"&gt;54&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; libsystem_c.dylib 0x395b596e abort + &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; libc++abi.dylib 0x38b53d4a abort_message + &lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; libc++abi.dylib 0x38b50ff4 default_terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; libobjc.A.dylib 0x39104a74 _objc_terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;144&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; libc++abi.dylib 0x38b51078 safe_handler_caller&lt;span style="color:#f92672"&gt;(&lt;/span&gt;void &lt;span style="color:#f92672"&gt;(&lt;/span&gt;*&lt;span style="color:#f92672"&gt;)())&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;76&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; libc++abi.dylib 0x38b51110 std::terminate&lt;span style="color:#f92672"&gt;()&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; libc++abi.dylib 0x38b52594 __cxa_rethrow + &lt;span style="color:#ae81ff"&gt;84&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; libobjc.A.dylib 0x391049cc objc_exception_rethrow + &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; CoreFoundation 0x311a6f1c CFRunLoopRunSpecific + &lt;span style="color:#ae81ff"&gt;452&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; CoreFoundation 0x311a6d44 CFRunLoopRunInMode + &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; UIKit 0x330bf480 -&lt;span style="color:#f92672"&gt;[&lt;/span&gt;UIApplication _run&lt;span style="color:#f92672"&gt;]&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;664&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt; UIKit 0x330bc2fc UIApplicationMain + &lt;span style="color:#ae81ff"&gt;1116&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt; 应用的名称 0x000cf358 0xce000 + &lt;span style="color:#ae81ff"&gt;4952&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; libdyld.dylib 0x3953bb1c start + &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; File: appname.app.dSYM&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Contents&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Resources&lt;span style="color:#f92672"&gt;/&lt;/span&gt;DWARF&lt;span style="color:#f92672"&gt;/&lt;/span&gt;appname (armv7)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Looking up address: &lt;span style="color:#ae81ff"&gt;0x00000000000cf358&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; .debug_info... found&lt;span style="color:#f92672"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x0015d390&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Compile Unit: length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x00001fc6&lt;/span&gt; version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x0002&lt;/span&gt; abbr_offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x00000000&lt;/span&gt; addr_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x04&lt;/span&gt; (next CU at &lt;span style="color:#ae81ff"&gt;0x0015f35a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x0015d39b&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; TAG_compile_unit [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_producer( &lt;span style="color:#e6db74"&gt;&amp;#34;Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_language( DW_LANG_ObjC )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_name( &lt;span style="color:#e6db74"&gt;&amp;#34;/Users/zhy/Downloads/ios/xxx/xxx/library/ASIHttpRequest/ASIDownloadCache.m&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_low_pc( &lt;span style="color:#ae81ff"&gt;0x000ccfc0&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_stmt_list( &lt;span style="color:#ae81ff"&gt;0x0002cf0b&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_comp_dir( &lt;span style="color:#e6db74"&gt;&amp;#34;/Users/zhy/Downloads/ios/vlink_app_xunyi&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_APPLE_major_runtime_vers( &lt;span style="color:#ae81ff"&gt;0x02&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x0015dd38&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; TAG_subprogram [&lt;span style="color:#ae81ff"&gt;53&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_name( &lt;span style="color:#e6db74"&gt;&amp;#34;-[ASIDownloadCache isCachedDataCurrentForRequest:]&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_decl_file( &lt;span style="color:#e6db74"&gt;&amp;#34;/Users/zhy/Downloads/ios/xxx/xxx/library/ASIHttpRequest/ASIDownloadCache.m&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_decl_line( &lt;span style="color:#ae81ff"&gt;315&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_prototyped( &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_type( {&lt;span style="color:#ae81ff"&gt;0x0015d490&lt;/span&gt;} ( &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; ) )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_APPLE_isa( &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_low_pc( &lt;span style="color:#ae81ff"&gt;0x000cf278&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_high_pc( &lt;span style="color:#ae81ff"&gt;0x000cf9e2&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_frame_base( r7 )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_object_pointer( {&lt;span style="color:#ae81ff"&gt;0x0015dd54&lt;/span&gt;} )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x0015dd86&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; TAG_lexical_block [&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_low_pc( &lt;span style="color:#ae81ff"&gt;0x000cf2ca&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AT_high_pc( &lt;span style="color:#ae81ff"&gt;0x000cf9de&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Line table dir : &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Users&lt;span style="color:#f92672"&gt;/&lt;/span&gt;zhy&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Downloads&lt;span style="color:#f92672"&gt;/&lt;/span&gt;ios&lt;span style="color:#f92672"&gt;/&lt;/span&gt;xxx&lt;span style="color:#f92672"&gt;/&lt;/span&gt;xxx&lt;span style="color:#f92672"&gt;/&lt;/span&gt;library&lt;span style="color:#f92672"&gt;/&lt;/span&gt;ASIHttpRequest&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Line table file: &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;ASIDownloadCache.m&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt; line &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, column &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; with start address &lt;span style="color:#ae81ff"&gt;0x00000000000cf340&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Looking up address: &lt;span style="color:#ae81ff"&gt;0x00000000000cf358&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; .debug_frame... found&lt;span style="color:#f92672"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x00007290&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; FDE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; length: &lt;span style="color:#ae81ff"&gt;0x0000000c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CIE_pointer: &lt;span style="color:#ae81ff"&gt;0x00000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start_addr: &lt;span style="color:#ae81ff"&gt;0x000cf278&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;[ASIDownloadCache isCachedDataCurrentForRequest:]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; range_size: &lt;span style="color:#ae81ff"&gt;0x0000076a&lt;/span&gt; (end_addr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x000cf9e2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Instructions: &lt;span style="color:#ae81ff"&gt;0x000cf278&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; CFA&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4294967295&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4294967295&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里就知道问题所在了吧&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Line table dir : &lt;span style="color:#e6db74"&gt;&amp;#39;/Users/zhy/Downloads/ios/xxx/xxx/library/ASIHttpRequest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Line table file: &lt;span style="color:#e6db74"&gt;&amp;#39;ASIDownloadCache.m&amp;#39;&lt;/span&gt; line 320, column &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; with start address 0x00000000000cf340
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果有多个crash文件的话，可以重复操作一遍就好了。&lt;/p&gt;</description></item><item><title>iOS 项目开发 Application failed codesign verification.警告</title><link>https://zhangdapeng.dev/p/ios-xiang-mu-kai-fa-application-failed-codesign-verification-jing-gao/</link><pubDate>Fri, 20 Jun 2025 11:50:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-xiang-mu-kai-fa-application-failed-codesign-verification-jing-gao/</guid><description>&lt;p&gt;关于这个问题，在项目中可以这样进行解决，其实很简单，&lt;/p&gt;
&lt;p&gt;第一步：选中Target&lt;/p&gt;
&lt;p&gt;第二步：找到Build Settings&lt;/p&gt;
&lt;p&gt;第三步：搜索Validate&lt;/p&gt;
&lt;p&gt;第四步：找到Validate Build Product&lt;/p&gt;
&lt;p&gt;第五步：将所有项设置为No&lt;/p&gt;
&lt;p&gt;解决。&lt;/p&gt;</description></item><item><title>app被Rejected 的各种原因翻译</title><link>https://zhangdapeng.dev/p/app-bei-rejected-de-ge-zhong-yuan-yin-fan-yi/</link><pubDate>Fri, 20 Jun 2025 11:33:41 +0000</pubDate><guid>https://zhangdapeng.dev/p/app-bei-rejected-de-ge-zhong-yuan-yin-fan-yi/</guid><description>&lt;ol&gt;
&lt;li&gt;Terms and conditions（法律与条款）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1.1&lt;br&gt;
As a developer of applications for the App Store you are bound by the terms of the Program License Agreement (PLA), Human Interface Guidelines (HIG), and any other licenses or contracts between you and Apple. The following rules and examples are intended to assist you in gaining acceptance for your App in the App Store, not to amend or remove provisions from any other agreement.（作为App Store的应用开发者，你必须接受如下条款：Program License Agreement (PLA)，Human Interface Guidelines (HIG)，以及任何你与apple签订的许可和合同。以下规则和示例是为了协助你的应用更快通过审核上架，而不是修正或取代之前的条款。）&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Functionality（功能）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.1&lt;br&gt;
Apps that crash will be rejected（存在Crash（崩溃，死机）的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.2&lt;br&gt;
Apps that exhibit bugs will be rejected（存在明显bug的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.3&lt;br&gt;
Apps that do not perform as advertised by the developer will be rejected（不符合开发者描述的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.4&lt;br&gt;
Apps that include undocumented or hidden features inconsistent with the description of the App will be rejected（有未说明或隐藏特性或有悖描述的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.5&lt;br&gt;
Apps that use non-public APIs will be rejected（使用非公开API的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.6&lt;br&gt;
Apps that read or write data outside its designated container area will be rejected（试图读写非允许范围内的数据的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.7&lt;br&gt;
Apps that download code in any way or form will be rejected（试图以任何方式方法下载代码的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.8&lt;br&gt;
Apps that install or launch other executable code will be rejected（安装或运行其他可执行代码的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.9&lt;br&gt;
Apps that are &amp;ldquo;beta&amp;rdquo;, &amp;ldquo;demo&amp;rdquo;, &amp;ldquo;trial&amp;rdquo;, or &amp;ldquo;test&amp;rdquo; versions will be rejected（任何“beta”，“演示（demo）”，“试用（trial）”或“测试（test）”版本的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.10&lt;br&gt;
iPhone Apps must also run on iPad without modification, at iPhone resolution, and at 2X iPhone 3GS resolution（iPhone应用必须可以无条件运行在iPad上，支持普通iPhone分辨率和2倍iPhone 3GS分辨率。）&lt;/p&gt;
&lt;p&gt;2.11&lt;br&gt;
Apps that duplicate Apps already in the App Store may be rejected, particularly if there are many of them, such as fart, burp, flashlight, and Kama Sutra Apps.（任何与App Store中上架应用重复的应用会被拒，尤其是已经有了很多的：如放屁，打嗝，手电照明和爱经。）&lt;/p&gt;
&lt;p&gt;2.12&lt;br&gt;
Apps that are not very useful, unique, are simply web sites bundled as Apps, or do not provide any lasting entertainment value may be rejected（没有用处的应用，web页面简单组合的应用，或任何哗众取宠，不能提供娱乐价值的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.13&lt;br&gt;
Apps that are primarily marketing materials or advertisements will be rejected（纯粹用于市场推广或广告的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.14&lt;br&gt;
Apps that are intended to provide trick or fake functionality that are not clearly marked as such will be rejected（有意提供隐蔽或虚假功能，却又不能明显标示的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.15&lt;br&gt;
Apps larger than 50MB in size will not download over cellular networks (this is automatically prohibited by the App Store)（大于20MB的应用无法通过蜂窝网络下载安装（App Store自动处理）。）&lt;/p&gt;
&lt;p&gt;2.16&lt;br&gt;
Multitasking Apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.（多任务应用只允许在后台运行如下相应的服务：VoIP，音频播放，地理位置，任务记录，本地提醒等。）&lt;/p&gt;
&lt;p&gt;2.17&lt;br&gt;
Apps that browse the web must use the iOS WebKit framework and WebKit Javascript（应用只允许通过iOS WebKit框架和WebKit Javascript访问web页面。）&lt;/p&gt;
&lt;p&gt;2.18&lt;br&gt;
Apps that encourage excessive consumption of alcohol or illegal substances, or encourage minors to consume alcohol or smoke cigarettes, will be rejected（鼓励酗酒，使用违法药物，或诱导未成年人饮酒，吸烟的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.19&lt;br&gt;
Apps that provide incorrect diagnostic or other inaccurate device data will be rejected（提供错误的系统信息或设备数据的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.20&lt;br&gt;
Developers &amp;ldquo;spamming&amp;rdquo; the App Store with many versions of similar Apps will be removed from the iOS Developer Program（通过许多版本的类似应用对App Store造成干扰的开发者会被取消IDP身份。）&lt;/p&gt;
&lt;p&gt;2.21&lt;br&gt;
Apps that are simply a song or movie should be submitted to the iTunes store. Apps that are simply a book should be submitted to the iBookstore.（歌曲和电影应该提交到iTunes store。书籍应该提交到iBookstore。）&lt;/p&gt;
&lt;p&gt;2.22&lt;br&gt;
Apps that arbitrarily restrict which users may use the App, such as by location or carrier, may be rejected（随意通过位置或运营商来限制用户使用的应用会被拒。）&lt;/p&gt;
&lt;p&gt;2.23&lt;br&gt;
Apps must follow the iOS Data Storage Guidelines or they will be rejected（加入iCloud支持后，应用必须遵守iOS数据存储指南（ iOS Data Storage Guidelines）否则将被拒。）&lt;/p&gt;
&lt;p&gt;2.24&lt;br&gt;
Apps that are offered in Newsstand must comply with schedules 1, 2 and 3 of the Developer Program License Agreement or they will be rejected（在Newsstand里提交的应用必须遵守Developer Program License Agreement的第1,2和3条，否则将被拒。）&lt;/p&gt;
&lt;p&gt;2.25&lt;br&gt;
Apps that display Apps other than your own for purchase or promotion in a manner similar to or confusing with the App Store will be rejected（与App Store类似的推荐或为其他应用做广告的应用将无法通过App Store审核。）&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Metadata (name, descriptions, ratings, rankings, etc)（描述数据（名称，描述，评级，分类等））&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3.1&lt;br&gt;
Apps or metadata that mentions the name of any other mobile platform will be rejected（应用或者元数据中提到其他任意移动平台会被拒。）&lt;/p&gt;
&lt;p&gt;3.2&lt;br&gt;
Apps with placeholder text will be rejected（描述数据有未填写项，存留占位符文本会被拒。）&lt;/p&gt;
&lt;p&gt;3.3&lt;br&gt;
Apps with descriptions not relevant to the application content and functionality will be rejected（描述中提到与应用内容和功能无关信息会被拒。）&lt;/p&gt;
&lt;p&gt;3.4&lt;br&gt;
App names in iTunes Connect and as displayed on a device should be similar, so as not to cause confusion（应用在iTunes Connect与设备上显示的名称应该类似，否则会造成混淆。）&lt;/p&gt;
&lt;p&gt;3.5&lt;br&gt;
Small and large App icons should be similar, so as to not to cause confusion（不同尺寸的icon要一致，否则会造成混淆。）&lt;/p&gt;
&lt;p&gt;3.6&lt;br&gt;
Apps with App icons and screenshots that do not adhere to the 4+ age rating will be rejected（图标与截屏不符合4+年龄评级的应用会被拒。）&lt;/p&gt;
&lt;p&gt;3.7&lt;br&gt;
Apps with Category and Genre selections that are not appropriate for the App content will be rejected（应用的内容与所选分类和风格不符会被拒。）&lt;/p&gt;
&lt;p&gt;3.8&lt;br&gt;
Developers are responsible for assigning appropriate ratings to their Apps. Inappropriate ratings may be changed/deleted by Apple（开发者有责任把应用放到恰当的分级（Rating）。不恰当的评级可能会被Apple修改，甚至删除。）&lt;/p&gt;
&lt;p&gt;3.9&lt;br&gt;
Developers are responsible for assigning appropriate keywords for their Apps. Inappropriate keywords may be changed/deleted by Apple（开发者有责任给应用撰写恰当的关键词。不恰当的关键词可能会被Apple修改，甚至删除。）&lt;/p&gt;
&lt;p&gt;3.10&lt;br&gt;
Developers who attempt to manipulate or cheat the user reviews or chart ranking in the App Store with fake or paid reviews, or any other inappropriate methods will be removed from the iOS Developer Program（通过伪造，付费评价或其他非正规手段，获取App Store中较好的评价与星级的开发者会被取消IDP身份。）&lt;/p&gt;
&lt;p&gt;3.11&lt;br&gt;
Apps which recommend that users restart their iOS device prior to installation or launch may be rejected（任何提示需要用户重启iOS设备来安装或运行的应用会被拒。）&lt;/p&gt;
&lt;p&gt;3.12&lt;br&gt;
Apps should have all included URLs fully functional when you submit it for review, such as support and privacy policy URLs（应用在提交审核过程中，所有涉及到的URL都要处于正常运行状态，例如保密协议，相关支持页面等。）&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Location（位置）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;4.1&lt;br&gt;
Apps that do not notify and obtain user consent before collecting, transmitting, or using location data will be rejected（未提示用户且获得用户允许之前收集，传输或使用位置数据的应用会被拒。）&lt;/p&gt;
&lt;p&gt;4.2&lt;br&gt;
Apps that use location-based APIs for automatic or autonomous control of vehicles, aircraft, or other devices will be rejected（使用location-based API来自动控制车辆，飞行器或其他设备的应用会被拒。）&lt;/p&gt;
&lt;p&gt;4.3&lt;br&gt;
Apps that use location-based APIs for dispatch, fleet management, or emergency services will be rejected（使用location-based API进行调度，队伍管理或应急服务的而应用会被拒。）&lt;/p&gt;
&lt;p&gt;4.4&lt;br&gt;
Location data can only be used when directly relevant to the features and services provided by the App to the user or to support approved advertising uses（位置数据只能用于应用提供的直接相关功能或服务，或者有授权的广告。）&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;
&lt;p&gt;Push notifications（提醒推送）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;5.1 
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Apps that provide Push Notifications without using the Apple Push Notification (APN) API will be rejected（不使用Apple Push Notification（APN） API提供消息推送的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.2&lt;br&gt;
Apps that use the APN service without obtaining a Push Application ID from Apple will be rejected（使用APN服务却没从Apple获取一个Push Application ID的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.3&lt;br&gt;
Apps that send Push Notifications without first obtaining user consent will be rejected（在首次推送消息之前未取得的用户允许的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.4&lt;br&gt;
Apps that send sensitive personal or confidential information using Push Notifications will be rejected（使用提醒推送服务推送敏感的个人或机密信息的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.5&lt;br&gt;
Apps that use Push Notifications to send unsolicited messages, or for the purpose of phishing or spamming will be rejected（使用提醒推送发送主动消息，欺骗或干扰信息的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.6&lt;br&gt;
Apps cannot use Push Notifications to send advertising, promotions, or direct marketing of any kind（应用不可以使用提醒推送发送广告，活动或任何形式的直接推广信息。）&lt;/p&gt;
&lt;p&gt;5.7&lt;br&gt;
Apps cannot charge users for use of Push Notifications（应用不可以提供收费的提醒推送服务。）&lt;/p&gt;
&lt;p&gt;5.8&lt;br&gt;
Apps that excessively use the network capacity or bandwidth of the APN service or unduly burden a device with Push Notifications will be rejected（使用APN服务过度占用网络带宽或容量或通过提醒推送大量占用系统资源的应用会被拒。）&lt;/p&gt;
&lt;p&gt;5.9&lt;br&gt;
Apps that transmit viruses, files, computer code, or programs that may harm or disrupt the normal opera tion of the APN service will be rejected（传输病毒，文件，代码或程序，导致破坏或扰乱正常的APN服务操作的应用会被拒。）&lt;/p&gt;
&lt;ol start="6"&gt;
&lt;li&gt;Game Center（游戏中心）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;6.1&lt;br&gt;
Apps that display any Player ID to end users or any third party will be rejected（向终端用户或第三方展示Player ID的应用会被拒。）&lt;/p&gt;
&lt;p&gt;6.2&lt;br&gt;
Apps that use Player IDs for any use other than as approved by the Game Center terms will be rejected（Player ID被用于Game Center条款款意外的用途的应用会被拒。）&lt;/p&gt;
&lt;p&gt;6.3&lt;br&gt;
Developers that attempt to reverse lookup, trace, relate, associate, mine, harvest, or otherwise exploit Player IDs, alias, or other information obtained through the Game Center will be removed from the iOS Developer Program（试图通过Game Center反查，跟踪，描述，关联，发掘，收割，或利用Player ID，别名或其他信息的开发者会被取消IDP身份。）&lt;/p&gt;
&lt;p&gt;6.4&lt;br&gt;
Game Center information, such as Leaderboard scores, may only be used in Apps approved for use with the Game Center（Game Center信息，例如Leaderboard得分，只能通过Game Center用于应用中。）&lt;/p&gt;
&lt;p&gt;6.5&lt;br&gt;
Apps that use Game Center service to send unsolicited messages, or for the purpose of phishing or spamming will be rejected（使用Game Center发送主动消息，欺骗或干扰信息的应用会被拒。）&lt;/p&gt;
&lt;p&gt;6.6&lt;br&gt;
Apps that excessively use the network capacity or bandwidth of the Game Center will be rejected（使用Game Center过度占用网络带宽或容量的应用会被拒。）&lt;/p&gt;
&lt;p&gt;6.7&lt;br&gt;
Apps that transmit viruses, files, computer code, or programs that may harm or disrupt the normal operation of the Game Center service will be rejected（传输病毒，文件，代码或程序，导致破坏或扰乱正常的Game Center操作的应用会被拒。）&lt;/p&gt;
&lt;ol start="7"&gt;
&lt;li&gt;Advertising（广告）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;7.1&lt;br&gt;
Apps that artificially increase the number of impressions or click-throughs of ads will be rejected（人工刷广告浏览或点击率的应用会被拒。）&lt;/p&gt;
&lt;p&gt;7.2&lt;br&gt;
Apps that contain empty iAd banners will be rejected（带有空iAd banner广告的应用会被拒。）&lt;/p&gt;
&lt;p&gt;7.3&lt;br&gt;
Apps that are designed predominantly for the display of ads will be rejected（设计主要用来展示广告的应用会被拒。）&lt;/p&gt;
&lt;ol start="8"&gt;
&lt;li&gt;Trademarks and trade dress（商标权与商标外观）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;8.1&lt;br&gt;
Apps must comply with all terms and conditions explained in the Guidelines for Using Apple Trademarks and Copyrights and the Apple Trademark List（应用必须遵守Guidelines for Using Apple Trademarks and Copyrights 和Apple Trademark List中描述的所有条款和条件。）&lt;/p&gt;
&lt;p&gt;8.2&lt;br&gt;
Apps that suggest or infer that Apple is a source or supplier of the App, or that Apple endorses any particular representation regarding quality or functionality will be rejected（任何误导或暗示Apple为该应用来源或提供商，或Apple以任何形式认可其质量或功能的应用会被拒。）&lt;/p&gt;
&lt;p&gt;8.3&lt;br&gt;
Apps which appear confusingly similar to an existing Apple product or advertising theme will be rejected（外观与现有Apple产品或广告主题类似或混淆的应用会被拒）&lt;/p&gt;
&lt;p&gt;8.4&lt;br&gt;
Apps that misspell Apple product names in their App name (i.e., GPS for Iphone, iTunz) will be rejected（应用名称中出现错误的Apple产品拼写（如，GPS for IPhone， iTunz）的应用会被拒。）&lt;/p&gt;
&lt;p&gt;8.5&lt;br&gt;
Apps may not use protected third party material such as trademarks, copyrights, patents or violate 3rd party terms of use. Authorization to use such material must be provided upon request.（使用受保护的第三方资源（商标，版权，商业机密，以及其他私有内容），如果要求请提供一份文本形式的使用授权。）&lt;/p&gt;
&lt;ol start="9"&gt;
&lt;li&gt;Media content（媒体内容）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;9.1&lt;br&gt;
Apps that do not use the MediaPlayer framework to access media in the Music Library will be rejected（使用MediaPlayer框架以外的方法访问Music Library中媒体数据的应用会被拒。）&lt;/p&gt;
&lt;p&gt;9.2&lt;br&gt;
App user interfaces that mimic any iPod interface will be rejected（用户界面模仿任何iPod界面的应用会被拒。）&lt;/p&gt;
&lt;p&gt;9.3&lt;br&gt;
Audio streaming content over a cellular network may not use more than 5MB over 5 minutes（通过蜂窝网络传输的流媒体音频内容不得超过5MB或多余5分钟。）&lt;/p&gt;
&lt;p&gt;9.4&lt;br&gt;
Video streaming content over a cellular network longer than 10 minutes must use HTTP Live Streaming and include a baseline 64 kbps audio-only HTTP Live stream（通过蜂窝网络传输超过10分钟流媒体视频内容，必须使用HTTP Live Streaming，并包含一条基线64kbps的音频HTTP Live流。）&lt;/p&gt;
&lt;ol start="10"&gt;
&lt;li&gt;User interface（用户界面）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;10.1&lt;br&gt;
Apps must comply with all terms and conditions explained in the Apple iOS Human Interface Guidelines（应用必须遵守Apple iOS Human Interface Guidelines中的所有条款和条件。）&lt;/p&gt;
&lt;p&gt;10.2&lt;br&gt;
Apps that look similar to Apps bundled on the iPhone, including the App Store, iTunes Store, and iBookstore, will be rejected（ 外观与iPhone自带应用（如：App Store，iTunes Store和iBookstore）相似的应用会被拒。）&lt;/p&gt;
&lt;p&gt;10.3&lt;br&gt;
Apps that do not use system provided items, such as buttons and icons, correctly and as described in the Apple iOS Human Interface Guidelines may be rejected（不按照Apple iOS Human Interface Guidelines中的描述正确使用系统控件比如按钮，图标等的应用会被拒。）&lt;/p&gt;
&lt;p&gt;10.4&lt;br&gt;
Apps that create alternate desktop/home screen environments or simulate multi-App widget experiences will be rejected（试图创建多桌面/主屏环境或模拟多Widget应用工具的应用会被拒。）&lt;/p&gt;
&lt;p&gt;10.5&lt;br&gt;
Apps that alter the functions of standard switches, such as the Volume Up/Down and Ring/Silent switches, will be rejected（ 修改标准开关标准功能例如：音量增加／减少，响铃／震动的应用会被拒。）&lt;/p&gt;
&lt;p&gt;10.6&lt;br&gt;
Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good, it may be rejected（Apple和我们的用户都界面报以很高期望，希望他设计的超级简洁，精致，充满创造力，深思熟虑。做到这些确实会消耗很多精力，但是值 得。Apple在这方面要求非常高。如果你的用户界面过于复杂，甚至仅仅是不够好，都可能被拒。）&lt;/p&gt;
&lt;ol start="11"&gt;
&lt;li&gt;Purchasing and currencies（购买与流通货币）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;11.1&lt;br&gt;
Apps that unlock or enable additional features or functionality with mechanisms other than the App Store will be rejected（通过App Store以外的渠道解锁或开启附加属性或功能的应用会被拒。）&lt;/p&gt;
&lt;p&gt;11.2&lt;br&gt;
Apps utilizing a system other than the In-App Purchase API (IAP) to purchase content, functionality, or services in an App will be rejected（ 使用In App Purchase API (IAP)以外的系统提供购买内容，功能或服务的应用会被拒。）&lt;/p&gt;
&lt;p&gt;11.3&lt;br&gt;
Apps using IAP to purchase physical goods or goods and services used outside of the application will be rejected（使用IAP为与应用无关的实体商品或商品服务收费的应用会被拒。）&lt;/p&gt;
&lt;p&gt;11.4&lt;br&gt;
Apps that use IAP to purchase credits or other currencies must consume those credits within the application（应用使用IAP购买积分（Credit）或其他货币，必须在应用中消费。）&lt;/p&gt;
&lt;p&gt;11.5&lt;br&gt;
Apps that use IAP to purchase credits or other currencies that expire will be rejected（使用IAP购买的积分（Credit）或货币会过期的应用会被拒）&lt;/p&gt;
&lt;p&gt;11.6&lt;br&gt;
Content subscriptions using IAP must last a minimum of 7 days and be available to the user from all of their iOS devices（ 使用IAP收费订阅的内容至少要在7天内有效，而且允许在所有iOS设备间共享。）&lt;/p&gt;
&lt;p&gt;11.7&lt;br&gt;
Apps that use IAP to purchase items must assign the correct Purchasability type（用到IAP收费项目的应用必须分派到正确的收费类目中。）&lt;/p&gt;
&lt;p&gt;11.8&lt;br&gt;
Apps that use IAP to purchase access to built-in capabilities provided by iOS, such as the camera or the gyroscope, will be rejected（ 使用IAP向用户收费以获取iOS内建功能（如摄像头，陀螺仪）的应用会被拒。）&lt;/p&gt;
&lt;p&gt;11.9&lt;br&gt;
Apps containing &amp;ldquo;rental&amp;rdquo; content or services that expire after a limited time will be rejected（ 包含“出租”内容或服务的应用，在一段时间实效的会被拒。）&lt;/p&gt;
&lt;p&gt;11.10&lt;br&gt;
Insurance applications must be free, in legal-compliance in the regions distributed, and cannot use IAP（保险类应用必须免费，遵守发布地区的法律，并且不允许使用IAP。）&lt;/p&gt;
&lt;p&gt;11.11&lt;br&gt;
In general, the more expensive your App, the more thoroughly we will review it（一般来说，越贵的应用审核就越仔细彻底。）&lt;/p&gt;
&lt;p&gt;11.12&lt;br&gt;
Apps offering subscriptions must do so using IAP, Apple will share the same 70/30 revenue split with developers for these purchases, as set forth in the Developer Program License Agreement.（提供收费订阅的应用必须使用IAP，Apple将会按照Developer Program License Agreement中约定的70/30的比例与开发者分账。）&lt;/p&gt;
&lt;p&gt;11.13&lt;br&gt;
Apps that link to external mechanisms for purchases or subscriptions to be used in the App, such as a “buy” button that goes to a web site to purchase a digital book, will be rejected（应用中如果提供了IAP以外的收费或订阅机制，如：“buy”按钮，跳转到一个购买电子书的web页面，会被拒。）&lt;/p&gt;
&lt;p&gt;11.14&lt;br&gt;
Apps can read or play approved content (specifically magazines, newspapers, books, audio, music, and video) that is subscribed to or purchased outside of the App, as long as there is no button or external link in the App to purchase the approved content. Apple will not receive any portion of the revenues for approved content that is subscribed to or purchased outside of the App（ 应用可以阅读或播放任何在应用以外取得授权的内容（包括指定的杂志，报纸，书籍，音频，音乐和视频），只要在应用中不允许出现获取授权的收费链接或按钮。Apple不会对在应用外订阅或购买授权项目收取任何费用。）&lt;/p&gt;
&lt;p&gt;11.15&lt;br&gt;
Apps may only use auto renewing subscriptions for periodicals (newspapers, magazines), business Apps (enterprise, productivity, professional creative, cloud storage) and media Apps (video, audio, voice), or the App will be rejected.（应用只能自动更新订阅的期刊（报纸、杂志），自动更新商业应用（企业、生产力、专业创意、云存储）和媒体应用（视频、音频，声音）将 被拒绝。）&lt;/p&gt;
&lt;ol start="12"&gt;
&lt;li&gt;Scraping and aggregation（抓去与整合）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;12.1&lt;br&gt;
Applications that scrape any information from Apple sites (for example from apple.com, iTunes Store, App Store, iTunes Connect, Apple Developer Programs, etc) or create rankings using content from Apple sites and services will be rejected（从Apple的页面（如：apple.com, iTunes Store, App Store, iTunes Connect, Apple Developer Programs, 等）抓取内容，或利用Apple页面和服务中的内容进行排名的应用会被拒。）&lt;/p&gt;
&lt;p&gt;12.2&lt;br&gt;
Applications may use approved Apple RSS feeds such as the iTunes Store RSS feed（ 应用可以使用授权的Apple RSS，例如iTunes Store RSS。）&lt;/p&gt;
&lt;p&gt;12.3&lt;br&gt;
Apps that are simply web clippings, content aggregators, or a collection of links, may be rejected（简单的web页面裁剪，内容整合或链接收集应用会被拒。）&lt;/p&gt;
&lt;ol start="13"&gt;
&lt;li&gt;Damage to device（损害设备）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;13.1&lt;br&gt;
Apps that encourage users to use an Apple Device in a way that may cause damage to the device will be rejected（任何怂恿用户做出可能损坏Apple设备的行为的应用会被拒。）&lt;/p&gt;
&lt;p&gt;13.2&lt;br&gt;
Apps that rapidly drain the device&amp;rsquo;s battery or generate excessive heat will be rejected（快速耗光设备电量或产生大量热量的应用会被拒。）&lt;/p&gt;
&lt;ol start="14"&gt;
&lt;li&gt;Personal attacks（人身攻击）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;14.1&lt;br&gt;
Any App that is defamatory, offensive, mean-spirited, or likely to place the targeted individual or group in harms way will be rejected（ 任何涉嫌诽谤，侮辱，狭隘内容或打击个人或团体的应用会被拒。）&lt;/p&gt;
&lt;p&gt;14.2&lt;br&gt;
Professional political satirists and humorists are exempt from the ban on offensive or mean-spirited commentary（职业政治讽刺家和幽默作家不受该诽谤和狭隘条款约束。）&lt;/p&gt;
&lt;ol start="15"&gt;
&lt;li&gt;
&lt;p&gt;Violence（暴力）&lt;/p&gt;
&lt;p&gt;15.1&lt;br&gt;
Apps portraying realistic images of people or animals being killed or maimed, shot, stabbed, tortured or injured will be rejected（展示人或动物被杀戮，致残，枪击，针刺或其他伤害的真实图片的应用会被拒）&lt;/p&gt;
&lt;p&gt;15.2&lt;br&gt;
Apps that depict violence or abuse of children will be rejected（描述暴力或虐待儿童的应用会被拒。）&lt;/p&gt;
&lt;p&gt;15.3&lt;br&gt;
&amp;ldquo;Enemies&amp;rdquo; within the context of a game cannot solely target a specific race, culture, a real government or corporation, or any other real entity（游戏中的“敌人”不能单独的设定为某特定比赛，文化，真实的政府或组织，或者任何现实事物。）&lt;/p&gt;
&lt;p&gt;15.4&lt;br&gt;
Apps involving realistic depictions of weapons in such a way as to encourage illegal or reckless use of such weapons will be rejected（含有以鼓励非法或鲁莽使用的方式描述真实武器的应用会被拒。）&lt;/p&gt;
&lt;p&gt;15.5&lt;br&gt;
Apps that include games of Russian roulette will be rejected（ 带有俄罗斯轮盘游戏的应用会被拒。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Objectionable content（负面内容）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;16.1&lt;br&gt;
Apps that present excessively objectionable or crude content will be rejected（介绍过度三俗和粗鲁内容的应用会被拒。）&lt;/p&gt;
&lt;p&gt;16.2&lt;br&gt;
Apps that are primarily designed to upset or disgust users will be rejected（设计来惹怒或恶心用户的应用会被拒。）&lt;/p&gt;
&lt;ol start="17"&gt;
&lt;li&gt;Privacy（隐私）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;17.1&lt;br&gt;
Apps cannot transmit data about a user without obtaining the user&amp;rsquo;s prior permission and providing the user with access to information about how and where the data will be used（在未获得用户事先允许，或未告知用户信息将被如何，在哪里使用的情况下，应用不可以传输用户数据。）&lt;/p&gt;
&lt;p&gt;17.2&lt;br&gt;
Apps that require users to share personal information, such as email address and date of birth, in order to function will be rejected（要求用户提供个人信息，如邮箱地址，生日等，才能使用其功能的应用会被拒。）&lt;/p&gt;
&lt;p&gt;17.3&lt;br&gt;
Apps that target minors for data collection will be rejected（专门收集未成年人数据的应用会被拒。）&lt;/p&gt;
&lt;ol start="18"&gt;
&lt;li&gt;Pornography（色情）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;18.1&lt;br&gt;
Apps containing pornographic material, defined by Webster&amp;rsquo;s Dictionary as &amp;ldquo;explicit descriptions or displays of sexual organs or activities intended to stimulate erotic rather than aesthetic or emotional feelings&amp;rdquo;, will be rejected（含有韦氏词典中定义的色情素材（explicit descriptions or displays of sexual organs or activities intended to stimulate erotic rather than aesthetic or emotional feelings）的应用会被拒。）&lt;/p&gt;
&lt;p&gt;18.2&lt;br&gt;
Apps that contain user generated content that is frequently pornographic (ex &amp;ldquo;Chat Roulette&amp;rdquo; Apps) will be rejected（经常有用户提供色情内容（例如：Chat Roulette &lt;a class="link" href="http://en.wikipedia.org/wiki/Chatroulette" target="_blank" rel="noopener"
 &gt;http://en.wikipedia.org/wiki/Chatroulette&lt;/a&gt; ）的应用会被拒。）&lt;/p&gt;
&lt;ol start="19"&gt;
&lt;li&gt;Religion, culture, and ethnicity（信仰，文化和种族）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;19.1&lt;br&gt;
Apps containing references or commentary about a religious, cultural or ethnic group that are defamatory, offensive, mean-spirited or likely to expose the targeted group to harm or violence will be rejected（带有对一种信仰，文化或种族进行诽谤，侮辱，狭隘，或以他们为目标的暴力或伤害内容的应用会被拒。）&lt;/p&gt;
&lt;p&gt;19.2&lt;br&gt;
Apps may contain or quote religious text provided the quotes or translations are accurate and not misleading. Commentary should be educational or informative rather than inflammatory（ 应用若带有或应用对一种信仰的文字描述，那么这个引用或翻译必须是精确，无歧义的。注释内容可以具有教育性，信息性，但不可以为煽动性。）&lt;/p&gt;
&lt;ol start="20"&gt;
&lt;li&gt;Contests, sweepstakes, lotteries, and raffles（竞赛，赌博，彩票和抽奖）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;20.1&lt;br&gt;
Sweepstakes and contests must be sponsored by the developer/company of the App（赌博和竞赛必须是由应用开发者或所有公司发起资助的。）&lt;/p&gt;
&lt;p&gt;20.2&lt;br&gt;
Official rules for sweepstakes and contests, must be presented in the App and make it clear that Apple is not a sponsor or involved in the activity in any manner（ 应用中必须展示赌博和竞赛的官方条款，并声明Apple不是资助者，并且在任何情况下与此事无关。）&lt;/p&gt;
&lt;p&gt;20.3&lt;br&gt;
It must be permissible by law for the developer to run a lottery App, and a lottery App must have all of the following characteristics: consideration, chance, and a prize（开发者必须经过法律允许才能上线一款抽奖应用，而且抽奖应用必须具备以下要素：报酬，机会，和奖金。)&lt;/p&gt;
&lt;p&gt;20.4&lt;br&gt;
Apps that allow a user to directly purchase a lottery or raffle ticket in the App will be rejected（直接允许用户在应用中购买彩票或抽奖的应用会被拒。）&lt;/p&gt;
&lt;ol start="21"&gt;
&lt;li&gt;Charities and contributions（慈善与捐助）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;21.1&lt;br&gt;
Apps that include the ability to make donations to recognized charitable organizations must be free（含有向已认证的慈善机构捐助功能的应用必须是免费的。）&lt;/p&gt;
&lt;p&gt;21.2&lt;br&gt;
The collection of donations must be done via a web site in Safari or an SMS（慈善募捐必须通过短信息或通过Safari访问web页面完成。）&lt;/p&gt;
&lt;ol start="22"&gt;
&lt;li&gt;Legal requirements（法律要求）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;22.1&lt;br&gt;
Apps must comply with all legal requirements in any location where they are made available to users. It is the developer&amp;rsquo;s obligation to understand and conform to all local laws（应用必须遵守所有发布地区当地法律。开发者有义务了解和遵守各地的法律。）&lt;/p&gt;
&lt;p&gt;22.2&lt;br&gt;
Apps that contain false, fraudulent or misleading representations or use names or icons similar to other Apps will be rejected（ 任何带有虚假，欺诈和带有歧义的内容的应用会被拒。）&lt;/p&gt;
&lt;p&gt;22.3&lt;br&gt;
Apps that solicit, promote, or encourage criminal or clearly reckless behavior will be rejected（ 任何召集，推销和股东犯罪和鲁莽行为的应用会被拒。）&lt;/p&gt;
&lt;p&gt;22.4&lt;br&gt;
Apps that enable illegal file sharing will be rejected（非法文件共享应用会被拒。）&lt;/p&gt;
&lt;p&gt;22.5&lt;br&gt;
Apps that are designed for use as illegal gambling aids, including card counters, will be rejected（任何设计用来非法赌博工具，包括算牌的应用会被拒。）&lt;/p&gt;
&lt;p&gt;22.6&lt;br&gt;
Apps that enable anonymous or prank phone calls or SMS/MMS messaging will be rejected（ 提供知识拨打电话或知识发送短消息/彩信功能的应用会被拒。）&lt;/p&gt;
&lt;p&gt;22.7&lt;br&gt;
Developers who create Apps that surreptitiously attempt to discover user passwords or other private user data will be removed from the iOS Developer Program（任何开发暗中获取用户密码和私有数据的开发者会被取消IDP身份。）&lt;/p&gt;
&lt;p&gt;22.8&lt;br&gt;
Apps which contain DUI checkpoints that are not published by law enforcement agencies, or encourage and enable drunk driving, will be rejected（任何非法律执行部门发布的带有DUI检查点信息，或鼓励且协助酒后驾车的应用会被拒。）&lt;/p&gt;</description></item><item><title>UIDatePickerView的完美使用 日期选取器</title><link>https://zhangdapeng.dev/p/uidatepickerview-de-wan-mei-shi-yong-ri-qi-xuan-qu-qi/</link><pubDate>Fri, 20 Jun 2025 11:33:34 +0000</pubDate><guid>https://zhangdapeng.dev/p/uidatepickerview-de-wan-mei-shi-yong-ri-qi-xuan-qu-qi/</guid><description>&lt;p&gt;在ios的开发中，日期选择器是个用的还是蛮多的一个部分，填写用户的出生日期，填写自己的计划，填写自己的约会安排，都是会有用到日期选择的地方的。&lt;/p&gt;
&lt;p&gt;我认为这里面的关键点是设置日期的格式（datePickerMode），还有选择日期后去如何处理(这里我没有做)，&lt;/p&gt;
&lt;p&gt;浏览一下代码吧&lt;/p&gt;
&lt;p&gt;UIDatePickerDemoViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIDatePickerDemoViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIDatePickerDemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UIDatePickerDemoViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIDatePickerDemoViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIDatePickerDemoViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;操作&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action:));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;seg&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:[&lt;span style="color:#e6db74"&gt;@&amp;#34;Time Date DC Count&amp;#34;&lt;/span&gt; componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34; &amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.titleView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; seg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - method of UIActionSheet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;actionSheet:&lt;/span&gt;(UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)actionSheet &lt;span style="color:#a6e22e"&gt;clickedButtonAtIndex:&lt;/span&gt;(NSInteger)buttonIndex{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDatePicker &lt;span style="color:#f92672"&gt;*&lt;/span&gt;datePicker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIDatePicker &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[actionSheet viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;formattor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; ([(UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) self.navigationItem.titleView selectedSegmentIndex]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; formattor.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;h:mm a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; formattor.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;dd MMMM yy&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; formattor.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;MM/dd/YY h:mm a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; formattor.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;HH:mm&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timestamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [formattor stringFromDate:datePicker.date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [(UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[self.view viewWithTag:&lt;span style="color:#ae81ff"&gt;103&lt;/span&gt;] setText:timestamp];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - method of self
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;action:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;actionsheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] initWithTitle:title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destructiveButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:&lt;span style="color:#e6db74"&gt;@&amp;#34;请选择日期&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIDatePicker &lt;span style="color:#f92672"&gt;*&lt;/span&gt;datepicker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDatePicker alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; datepicker.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; datepicker.datePickerMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [(UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)self.navigationItem.titleView selectedSegmentIndex];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet addSubview:datepicker];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UIDatePickerDemoViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIDatePickerDemoViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIDatePickerDemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) [[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIDatePickerDemoViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIActionSheetDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UIPickerView的完美使用 基于视图的选取器</title><link>https://zhangdapeng.dev/p/uipickerview-de-wan-mei-shi-yong-ji-yu-shi-tu-de-xuan-qu-qi/</link><pubDate>Fri, 20 Jun 2025 11:33:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/uipickerview-de-wan-mei-shi-yong-ji-yu-shi-tu-de-xuan-qu-qi/</guid><description>&lt;p&gt;UIPickerView的完美使用 基于视图的选取器&lt;/p&gt;
&lt;p&gt;关于这个，其实在许多的项目开发中，还是有很多必要的，因为，你要实现一个图片说明，而不需要文字的话，这个就是个关键点，使用图标来做选择项。&lt;/p&gt;
&lt;p&gt;原理其实也是很简单的，只要在&lt;code&gt;-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;实现对每个Component中的row进行uiview的操作就好了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;viewForRow:&lt;/span&gt;(NSInteger)row &lt;span style="color:#a6e22e"&gt;forComponent:&lt;/span&gt;(NSInteger)component &lt;span style="color:#a6e22e"&gt;reusingView:&lt;/span&gt;(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; view &lt;span style="color:#f92672"&gt;?&lt;/span&gt; (UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view : [[UIImageView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;60.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;60.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;names &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;club.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;diamond.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;heart.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;spade.png&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:[names objectAtIndex:(row &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CFShow((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CFTypeRef)(imageView.image));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是不是很简单，其实UIPickerView里面已经自己的设置了这个方法，很是方便。&lt;/p&gt;
&lt;p&gt;代码呈现如下：&lt;/p&gt;
&lt;p&gt;ViewBasedPickerViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ViewBasedPickerViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// View based Picker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ViewBasedPickerViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ViewBasedPickerViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ViewBasedPickerViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; srandom([NSDate timeIntervalSinceReferenceDate]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;操作&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action:));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - method of uipickerview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;numberOfComponentsInPickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;numberOfRowsInComponent:&lt;/span&gt;(NSInteger)component{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(CGFloat) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;rowHeightForComponent:&lt;/span&gt;(NSInteger)component{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;viewForRow:&lt;/span&gt;(NSInteger)row &lt;span style="color:#a6e22e"&gt;forComponent:&lt;/span&gt;(NSInteger)component &lt;span style="color:#a6e22e"&gt;reusingView:&lt;/span&gt;(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; view &lt;span style="color:#f92672"&gt;?&lt;/span&gt; (UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view : [[UIImageView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;60.0f&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;60.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;names &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;club.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;diamond.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;heart.png&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;spade.png&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:[names objectAtIndex:(row &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CFShow((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CFTypeRef)(imageView.image));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - method of uiactionsheet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;actionSheet:&lt;/span&gt;(UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)actionSheet &lt;span style="color:#a6e22e"&gt;clickedButtonAtIndex:&lt;/span&gt;(NSInteger)buttonIndex{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pickerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[actionSheet viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;names &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;C&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;D&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;H&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;S&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@•%@•%@&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [names objectAtIndex:([pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [names objectAtIndex:([pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [names objectAtIndex:([pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - method of self
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;action:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) sender{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;actionsheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] initWithTitle:title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destructiveButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:&lt;span style="color:#e6db74"&gt;@&amp;#34;请选择&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pickerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIPickerView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.showsSelectionIndicator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet addSubview:pickerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Pick a random item in the middle of the table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [pickerView selectRow:&lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;) inComponent:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [pickerView selectRow:&lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;) inComponent:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [pickerView selectRow:&lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;) inComponent:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CFShow((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CFTypeRef)(NSStringFromCGRect(pickerView.frame)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ViewBasedPickerViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ViewBasedPickerViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// View based Picker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) [[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ViewBasedPickerViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIPickerViewDelegate, UIPickerViewDataSource, UIActionSheetDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此例子中使用的是storyboard&lt;/p&gt;</description></item><item><title>iOS开发之Objective-C与JavaScript的交互</title><link>https://zhangdapeng.dev/p/ios-kai-fa-zhi-objective-c-yu-javascript-de-jiao-hu/</link><pubDate>Fri, 20 Jun 2025 11:33:16 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-zhi-objective-c-yu-javascript-de-jiao-hu/</guid><description>&lt;p&gt;UIWebView是iOS最常用的SDK之一，它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中，通过这个方法我们可以在iOS中与UIWebView中的网页元素交互。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;stringByEvaluatingJavaScriptFromString&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用stringByEvaluatingJavaScriptFromString方法，需要等UIWebView中的页面加载完成之后去调用。我们在界面上拖放一个UIWebView控件。在Load中将google mobile加载到这个控件中，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webView.scalesPageToFit &lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://www.google.com.hk/m?gl=CN&amp;amp;hl=zh_CN&amp;amp;source=ihp&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [webView loadRequest:request]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们在webViewDidFinishLoad方法中就可以通过javascript操作界面元素了。&lt;br&gt;
下面实现一个关于如何进行google关键字搜索的操作&lt;br&gt;
示例1:获取当前页面的url&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;document.location.href&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例2:获取页面title&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [webview stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;document.title&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例3:修改界面元素的值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;js_result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.webView 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;document.getElementsByName(&amp;#39;q&amp;#39;)[0].value=&amp;#39;GoWhich&amp;#39;;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例4:表单提交&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;js_result2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;document.forms[0].submit(); &amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例3跟示例4，就实现了在google搜索关键字：&amp;ldquo;Gowich&amp;quot;的功能。&lt;/p&gt;
&lt;p&gt;示例5：完整的表单提交&lt;br&gt;
上面的功能我们可以封装到一个js函数中，将这个函数插入到页面上执行，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;var script = document.createElement(&amp;#39;script&amp;#39;);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;script.type = &amp;#39;text/javascript&amp;#39;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;script.text = &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;function searchFunction() { &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;var field = document.getElementsByName(&amp;#39;q&amp;#39;)[0];&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;field.value=&amp;#39;GoWhich&amp;#39;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;document.forms[0].submit();&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;}&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;document.getElementsByTagName(&amp;#39;head&amp;#39;)[0].appendChild(script);&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;searchFunction();&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一步、首先通过js创建一个script的标签，type为&amp;rsquo;text/javascript&amp;rsquo;。&lt;/p&gt;
&lt;p&gt;第二步、然后在这个标签中插入一段字符串，这段字符串就是一个函数：searchFunction，这个函数实现google自动搜索关键字的功能。&lt;/p&gt;
&lt;p&gt;第三步、然后使用stringByEvaluatingJavaScriptFromString执行searchFunction函数。&lt;/p&gt;
&lt;p&gt;stringByEvaluatingJavaScriptFromString的用法，它的功能非常的强大，用起来非常简单，通过它我们可以很方便的操作uiwebview中的页面元素。&lt;br&gt;
详细代码如下：&lt;/p&gt;
&lt;p&gt;GoogleSearchViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GoogleSearchViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// JavascriptAndIOS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-15.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GoogleSearchViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GoogleSearchViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GoogleSearchViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; webView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect webFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webFrame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webFrame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWebView alloc] initWithFrame:webFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.webView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.webView.scalesPageToFit &lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.webView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://www.google.com.hk/m?gl=CN&amp;amp;hl=zh_CN&amp;amp;source=ihp&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView loadRequest:request];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.webView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;var script = document.createElement(&amp;#39;script&amp;#39;);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;script.type = &amp;#39;text/javascript&amp;#39;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;script.text = &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;function searchFunction() { &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;var field = document.getElementsByName(&amp;#39;q&amp;#39;)[0];&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;field.value=&amp;#39;GoWhich&amp;#39;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;document.forms[0].submit();&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;}&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;document.getElementsByTagName(&amp;#39;head&amp;#39;)[0].appendChild(script);&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.webView stringByEvaluatingJavaScriptFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;searchFunction();&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GoogleSearchViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// GoogleSearchViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// JavascriptAndIOS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-15.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GoogleSearchViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIWebViewDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;webView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UIWebView与js(JavaScript) 的交互 示例</title><link>https://zhangdapeng.dev/p/uiwebview-yu-jsjavascript-de-jiao-hu-shi-li/</link><pubDate>Fri, 20 Jun 2025 11:33:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/uiwebview-yu-jsjavascript-de-jiao-hu-shi-li/</guid><description>&lt;p&gt;关于这个的使用是源于我参看的一个图表表格的使用&lt;/p&gt;
&lt;p&gt;操作步骤是这样的&lt;/p&gt;
&lt;p&gt;第一步，自己写个页面，用来实现页面的某些效果的，比如这里的温度曲线图，是调用的highchart的js插件。外加一些css效果。&lt;/p&gt;
&lt;p&gt;第二步，在自己的app中将要使用的页面加载进来，这里调用的是index.html&lt;/p&gt;
&lt;p&gt;第三步，使用webview进行呈现，还要灵活的使用webview的一个方法【stringByEvaluatingJavaScriptFromString】&lt;/p&gt;
&lt;p&gt;这里只演示一下如何使用，具体的页面部分，可以自己写，我放在自己的&lt;a class="link" href="https://github.com/zhangda89/TemperatureCurve" target="_blank" rel="noopener"
 &gt;github&lt;/a&gt;上。&lt;/p&gt;
&lt;p&gt;TemperatureCurveViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// TemperatureCurveViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Real-time temperature curve
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-15.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TemperatureCurveViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIWebViewDelegate, UITextFieldDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;webViewForSelectDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSTimer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TemperatureCurveViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// TemperatureCurveViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Real-time temperature curve
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-15.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;TemperatureCurveViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TemperatureCurveViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TemperatureCurveViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; webViewForSelectDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; timer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if(UIDeviceOrientationIsPortrait(orientation) || orientation == UIDeviceOrientationUnknown){
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]){
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [[UIDevice currentDevice] performSelector:@selector(setOrientation:)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// withObject:(id)UIDeviceOrientationLandscapeRight];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect webFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webFrame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webFrame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWebView alloc] initWithFrame:webFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate.scalesPageToFit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate.opaque &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; webViewForSelectDate.autoresizingMask &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIViewAutoresizingFlexibleHeight &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleWidth);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:webViewForSelectDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;htmlPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;curve.bundle/index.html&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL fileURLWithPath:htmlPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURLRequest requestWithURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [webViewForSelectDate loadRequest:request];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;shouldAutorotate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;supportedInterfaceOrientations&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; UIInterfaceOrientationMaskAll;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;updateData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nowDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDate alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimeInterval nowTimeInterval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [nowDate timeIntervalSince1970] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; temperature &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self getRandomNumber:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; to:&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] initWithCapacity:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [jsStr appendFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;updateData(%f,%d)&amp;#34;&lt;/span&gt;,nowTimeInterval, temperature];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [webViewForSelectDate stringByEvaluatingJavaScriptFromString:jsStr];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getRandomNumber:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)from &lt;span style="color:#a6e22e"&gt;to:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)to{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)(from &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (arc4random() &lt;span style="color:#f92672"&gt;%&lt;/span&gt; (to &lt;span style="color:#f92672"&gt;-&lt;/span&gt; from &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - delegate o webview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;webView:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView &lt;span style="color:#a6e22e"&gt;shouldStartLoadWithRequest:&lt;/span&gt;(NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;navigationType:&lt;/span&gt;(UIWebViewNavigationType)navigationType{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;webView:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView &lt;span style="color:#a6e22e"&gt;didFailLoadWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSTimer scheduledTimerWithTimeInterval:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(updateData)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userInfo:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repeats:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其主要的一点就是使用&lt;code&gt;stringByEvaluatingJavaScriptFromString&lt;/code&gt;这个方法，他可以灵活的将js嵌入页面中，进行操作，而且一定是要在webview加载完后进行调用。&lt;/p&gt;</description></item><item><title>UIPickerView的完美使用 多轮表格的使用</title><link>https://zhangdapeng.dev/p/uipickerview-de-wan-mei-shi-yong-duo-lun-biao-ge-de-shi-yong/</link><pubDate>Fri, 20 Jun 2025 11:33:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/uipickerview-de-wan-mei-shi-yong-duo-lun-biao-ge-de-shi-yong/</guid><description>&lt;p&gt;之前自己也使用过，但是感觉很是别扭，还要调试什么尺寸的这个问题，今天看了cookbook的方法，明白了，该如何使用，来个例子好了。&lt;/p&gt;
&lt;p&gt;UIPickerViewDemoViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIPickerViewDemoViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIPickerViewDemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-14.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) [[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIPickerViewDemoViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIPickerViewDataSource,UIPickerViewDelegate,UIActionSheetDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UIPickerViewDemoViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIPickerViewDemoViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIPickerViewDemo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-14.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UIPickerViewDemoViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIPickerViewDemoViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UIPickerViewDemoViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; BARBUTTON(&lt;span style="color:#e6db74"&gt;@&amp;#34;操作&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action:));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - UIPickerView Method
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;numberOfComponentsInPickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;numberOfRowsInComponent:&lt;/span&gt;(NSInteger)component{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pickerView:&lt;/span&gt;(UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)pickerView &lt;span style="color:#a6e22e"&gt;titleForRow:&lt;/span&gt;(NSInteger)row &lt;span style="color:#a6e22e"&gt;forComponent:&lt;/span&gt;(NSInteger)component{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-%d&amp;#34;&lt;/span&gt;, (component &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;R&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;L&amp;#34;&lt;/span&gt;), row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;actionSheet:&lt;/span&gt;(UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)actionSheet &lt;span style="color:#a6e22e"&gt;clickedButtonAtIndex:&lt;/span&gt;(NSInteger)buttonIndex{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pickerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[actionSheet viewWithTag:&lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;L%d-R%d-L%d&amp;#34;&lt;/span&gt;,[pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], [pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], [pickerView selectedRowInComponent:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;action:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n\n\n\n\n\n\n\n\n\n\n\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIActionSheet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;actionsheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] initWithTitle:title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destructiveButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:&lt;span style="color:#e6db74"&gt;@&amp;#34;选择此项&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIPickerView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pickerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIPickerView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerView.showsSelectionIndicator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [actionsheet addSubview:pickerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CFShow((&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CFTypeRef)(NSStringFromCGRect(pickerView.frame)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在自己的项目中，没有任何强制要求的前提下，完全是可以做出很华丽的应用的，要掌握正确的使用方式。&lt;/p&gt;
&lt;p&gt;这里面其实重点是要使用代理方法UIPickerViewDataSource,UIPickerViewDelegate,UIActionSheetDelegate这个三个在这里是不能少的。&lt;/p&gt;</description></item><item><title>NSPredicate使用小总结</title><link>https://zhangdapeng.dev/p/nspredicate-shi-yong-xiao-zong-jie/</link><pubDate>Fri, 20 Jun 2025 11:07:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/nspredicate-shi-yong-xiao-zong-jie/</guid><description>&lt;p&gt;一般来说这种情况还是蛮多的，比如你从文件中读入了一个array1，然后想把程序中的一个array2中符合array1中内容的元素过滤出来。&lt;/p&gt;
&lt;p&gt;正 常傻瓜一点就是两个for循环，一个一个进行比较，这样效率不高，而且代码也不好看。&lt;/p&gt;
&lt;p&gt;其实一个循环或者无需循环就可以搞定了，那就需要用到NSPredicate这个类&lt;/p&gt;
&lt;p&gt;1）例子一，循环过滤&lt;/p&gt;
&lt;p&gt;我想过滤arrayContents的话只要循环 arrayFilter就好了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayFilter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;pict&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;blackrain&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;ip&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;I am a picture.&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;@&amp;#34;I am a guy&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;I am gagaga&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;ipad&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;iphone&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)[arrayFilter count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; count; i &lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[arrayFilter objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filterPredicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF CONTAINS %@&amp;#34;&lt;/span&gt;, arrayItem];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Filtered array with filter %@, %@&amp;#34;&lt;/span&gt;, arrayItem, [arrayContents filteredArrayUsingPredicate:filterPredicate]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:35:06.642 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90135:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Filtered array with filter pict, &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;I am a picture.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:35:06.644 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90135:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Filtered array with filter blackrain, &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:35:06.645 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90135:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Filtered array with filter ip, &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ipad,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iphone
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然以上代码中arrayContent最好用mutable 的，这样就可以直接filter了，NSArray是不可修改的。&lt;/p&gt;
&lt;p&gt;2）例子二，无需循环&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayFilter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;abc1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc3&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrayContent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;a1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc1&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc4&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;abc2&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;thePredicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;NOT (SELF in %@)&amp;#34;&lt;/span&gt;, arrayFilter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arrayContent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [arrayContent filteredArrayUsingPredicate:thePredicate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;arrayContent = %@&amp;#34;&lt;/span&gt;,arrayContent);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:34:36.653 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90122:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; arrayContent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a1,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abc4,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abc2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样arrayContent过滤出来的就是不包含 arrayFilter中的所有item了。&lt;/p&gt;
&lt;p&gt;3）生成文件路径下文件集合列表&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;directoryContents = %@&amp;#34;&lt;/span&gt;,directoryContents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:33:11.844 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90093:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4）match的用法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;简单比较&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;directoryContents = %@&amp;#34;&lt;/span&gt;,directoryContents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz-999.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF == %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;results = %@&amp;#34;&lt;/span&gt;,results);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:41:50.130 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90258:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:41:50.132 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90258:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;match里like的用法（类似Sql中的用法）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;directoryContents = %@&amp;#34;&lt;/span&gt;,directoryContents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz*.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF like %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;results = %@&amp;#34;&lt;/span&gt;,results);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:45:15.239 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90312:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:45:15.245 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90312:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;大小写比较&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;［c］表示忽略大小写，［d］表示忽略重音，可以在一起使用，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;directoryContents = %@&amp;#34;&lt;/span&gt;,directoryContents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz*.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF like [cd] %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;results = %@&amp;#34;&lt;/span&gt;,results);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:46:29.758 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90336:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:46:29.764 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90336:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.使用正则&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-12.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;defaultPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsOfDirectoryAtPath:defaultPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;directoryContents = %@&amp;#34;&lt;/span&gt;,directoryContents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;imagexyz-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;d{3}&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.png&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF matches %@&amp;#34;&lt;/span&gt;, match];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [directoryContents filteredArrayUsingPredicate:predicate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;results = %@&amp;#34;&lt;/span&gt;,results);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:47:30.005 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90358:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; directoryContents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-08-12 23:47:30.015 test&lt;span style="color:#f92672"&gt;[&lt;/span&gt;90358:303&lt;span style="color:#f92672"&gt;]&lt;/span&gt; results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS开发之表格排序（UITableView排序）</title><link>https://zhangdapeng.dev/p/ios-kai-fa-zhi-biao-ge-pai-xu-uitableview-pai-xu/</link><pubDate>Fri, 20 Jun 2025 11:07:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-zhi-biao-ge-pai-xu-uitableview-pai-xu/</guid><description>&lt;p&gt;关于表格的排序是使用了NSComparisonResult这个方法，很简单的，只要自己定义几个方法，就可以了&lt;/p&gt;
&lt;p&gt;代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSString&lt;/span&gt; (sortingExtension)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSString&lt;/span&gt; (sortingExtension)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSComparisonResult) &lt;span style="color:#a6e22e"&gt;reverseCompare:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; [self caseInsensitiveCompare:aString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSComparisonResult) &lt;span style="color:#a6e22e"&gt;lengthCompare:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; aString.length) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.length &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; aString.length) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自己写个方法，然后封装到里面就好了,关于NSString (sortingExtension)这个名字，没研究出啥道道来，只是觉得奇怪&lt;/p&gt;
&lt;p&gt;我迫于喜欢IOS5的storyboard，于是此篇也是用了storyboard&lt;/p&gt;
&lt;p&gt;SortTableViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SortTableViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SortTable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-7.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define COOKBOOK_PURPLE_COLOR	[UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define BARBUTTON(TITLE, SELECTOR) 	[[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR] autorelease]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define SYSBARBUTTON(ITEM, SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:ITEM target:self action:SELECTOR] autorelease]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define CRAYON_NAME(CRAYON)	[[CRAYON componentsSeparatedByString:@&amp;#34;#&amp;#34;] objectAtIndex:0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define CRAYON_COLOR(CRAYON) [self getColor:[[CRAYON componentsSeparatedByString:@&amp;#34;#&amp;#34;] lastObject]]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSString&lt;/span&gt; (sortingExtensionFF)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSString&lt;/span&gt; (sortingExtensionFF)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSComparisonResult) &lt;span style="color:#a6e22e"&gt;reverseCompare:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; [self caseInsensitiveCompare:aString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSComparisonResult) &lt;span style="color:#a6e22e"&gt;lengthCompare:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) aString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; aString.length) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.length &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; aString.length) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SortTableViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDataSource, UITableViewDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;items;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SortTableViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SortTableViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// SortTable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-7.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SortTableViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SortTableViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SortTableViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; items;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; COOKBOOK_PURPLE_COLOR;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tableView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tableView.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pathname &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;content&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;text&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString stringWithContentsOfFile:pathname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoding:NSUTF8StringEncoding
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error] componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;seg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:[&lt;span style="color:#e6db74"&gt;@&amp;#34;Ascending Descending Length&amp;#34;&lt;/span&gt; componentsSeparatedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34; &amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	seg.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[seg addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(updateSort:) forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.navigationItem.titleView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; seg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - UITableViewCell Method
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSInteger)&lt;span style="color:#a6e22e"&gt;numberOfSectionsInTableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aTableView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSInteger)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aTableView &lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; items.count;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITableViewCellStyle style &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellStyleDefault;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tView dequeueReusableCellWithIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;BaseCell&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;cell) cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;BaseCell&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;crayon &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [items objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CRAYON_NAME(crayon);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[CRAYON_NAME(crayon) hasPrefix:&lt;span style="color:#e6db74"&gt;@&amp;#34;White&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		cell.textLabel.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CRAYON_COLOR(crayon);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		cell.textLabel.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;didSelectRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;crayon &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.items objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CRAYON_COLOR(crayon);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;updateSort:&lt;/span&gt; (UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) seg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.items sortedArrayUsingSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(caseInsensitiveCompare:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.items sortedArrayUsingSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(reverseCompare:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (seg.selectedSegmentIndex &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.items sortedArrayUsingSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(lengthCompare:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.tableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getColor:&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) hexColor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; red, green, blue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSRange range;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	range.length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	range.location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;red];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	range.location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;green];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	range.location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;blue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [UIColor colorWithRed:(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;)(red&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;) green:(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;)(green&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;) blue:(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;)(blue&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;) alpha:&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上代码绝对支持ARC,时代是新的，代码的创新，跟着创新走吧，别烦恼更新太快，为了项目的最新，为了能够展示更好的项目，更新并不是什么坏事。&lt;/p&gt;</description></item><item><title>How to Add Those @2x iOS5 Resources to SVN</title><link>https://zhangdapeng.dev/p/how-to-add-those-2x-ios5-resources-to-svn/</link><pubDate>Fri, 20 Jun 2025 10:36:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/how-to-add-those-2x-ios5-resources-to-svn/</guid><description>&lt;p&gt;In order for your app to take full advantage of the iPhone 4 Retina Display, you&amp;rsquo;ll need to add 2x resources to your iPhone project.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using SVN to manage your files, you&amp;rsquo;ll be faced with something pretty annoying:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn add xunYi7/library/images/blackArrow@2x.png
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn: warning: &lt;span style="color:#e6db74"&gt;&amp;#39;xunYi7/library/images/blackArrow&amp;#39;&lt;/span&gt; not found
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This was incredibly frustrating for me, no matter how I tried to escape it: single quotes, double quotes, backslashes, etc. SVN refused to add.&lt;/p&gt;
&lt;p&gt;This is due to internal path recognizers in SVN. It expects the last at symbol to specify a revision. This is easily corrected by adding an at symbol to the end of your file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn add xunYi7/library/images/blackArrow@2x.png@
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bin&lt;span style="color:#f92672"&gt;)&lt;/span&gt; xunYi7/library/images/blackArrow@2x.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll still need to manually add each resource, but it&amp;rsquo;s better than nothing. You could also use an IDE like Cornerstone, but I prefer the SVN CLI way of managing SVN.&lt;/p&gt;
&lt;p&gt;这种项目中，svn也是有对应的解决方案的&lt;/p&gt;</description></item><item><title>浏览器实现 app 跳转 输入url跳转到app</title><link>https://zhangdapeng.dev/p/liu-lan-qi-shi-xian-app-tiao-zhuan-shu-ru-url-tiao-zhuan-dao-app/</link><pubDate>Fri, 20 Jun 2025 10:36:32 +0000</pubDate><guid>https://zhangdapeng.dev/p/liu-lan-qi-shi-xian-app-tiao-zhuan-shu-ru-url-tiao-zhuan-dao-app/</guid><description>&lt;p&gt;最近想实现一个功能，就是在浏览器中输入url地址，实现app的跳转，实现这样的功能并不麻烦，通过将网上一些相关教程汇总以后就写了下面的教程分享。&lt;/p&gt;
&lt;p&gt;实现效果如下，在浏览器中输入“Lover://”之后就会打开这个程序，打开后程序中会显示跳转过来的链接地址。&lt;/p&gt;
&lt;p&gt;第一步：配置info.plist&lt;/p&gt;
&lt;p&gt;其中URL identifier 可以随便取，URL Schemes 就是实现跳转URL协议的名称（可以多个）&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="706" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1588986500/gowhich/846340-f29f11eb0c1a39e1.png.webp" srcset="https://zhangdapeng.dev/846340-f29f11eb0c1a39e1.png_7724355636223479473_hu_6e31f8b4c3458f57.webp 800w, https://res.cloudinary.com/dy5dvcuc1/image/upload/v1588986500/gowhich/846340-f29f11eb0c1a39e1.png.webp 1200w" width="1200"&gt;&lt;br&gt;
然后，在视图控制器中加入代码，用于显示跳转过来的地址：&lt;/p&gt;
&lt;p&gt;第二步：代码实现过程&lt;/p&gt;
&lt;p&gt;在viewController里面添加一个显示信息的函数&lt;code&gt;+(void) showMessage:(NSString *)message;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showMessage:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)message{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Message : %@&amp;#34;&lt;/span&gt;,message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在delegate里面调用一下&lt;/p&gt;
&lt;p&gt;首先需要实现一个方法：&lt;code&gt;-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;handleOpenURL:&lt;/span&gt;(NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)url{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;url){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;urlString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [url absoluteString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [SafariToAppViewController showMessage:urlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就完成了这个看似很酷的功能，至于参数传递的问题，我这里做了一个颜色的取值&lt;/p&gt;
&lt;p&gt;实现代码如下（在delegate中实现）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;openURL:&lt;/span&gt;(NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)url &lt;span style="color:#a6e22e"&gt;sourceApplication:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sourceApplication &lt;span style="color:#a6e22e"&gt;annotation:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)annotation{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// You should be extremely careful when handling URL requests.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Take steps to validate the URL before handling it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Check if the incoming URL is nil.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Invoke our helper method to parse the incoming URL and extact the color
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// to display.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;launchColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self extractColorFromLaunchURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Stop if the url could not be parsed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;launchColor)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [SafariToAppViewController showMessage:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,launchColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UIColor&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;extractColorFromLaunchURL:&lt;/span&gt;(NSURL&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Hexadecimal color codes begin with a number sign (#) followed by six
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// hexadecimal digits. Thus, a color in this format is represented by
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// three bytes (the number sign is ignored). The value of each byte
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// corresponds to the intensity of either the red, blue or green color
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// components, in that order from left to right.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Additionally, there is a shorthand notation with the number sign (#)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// followed by three hexadecimal digits. This notation is expanded to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// the six digit notation by doubling each digit: #123 becomes #112233.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Convert the incoming URL into a string. The &amp;#39;#&amp;#39; character will be percent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// escaped. That must be undone.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;urlString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[url absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Stop if the conversion failed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;urlString)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create a regular expression to locate hexadecimal color codes in the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// incoming URL.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Incoming URLs can be malicious. It is best to use vetted technology,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// such as NSRegularExpression, to handle the parsing instead of writing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// your own parser.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRegularExpression &lt;span style="color:#f92672"&gt;*&lt;/span&gt;regex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSRegularExpression regularExpressionWithPattern:&lt;span style="color:#e6db74"&gt;@&amp;#34;#[0-9a-f]{3}([0-9a-f]{3})?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSRegularExpressionCaseInsensitive
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Check for any error returned. This can be a result of incorrect regex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// syntax.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (error)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Extract all the matches from the incoming URL string. There must be at least
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// one for the URL to be valid (though matches beyond the first are ignored.)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;regexMatches &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [regex matchesInString:urlString options:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; range:NSMakeRange(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, urlString.length)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (regexMatches.count &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Extract the first matched string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;matchedString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [urlString substringWithRange:[regexMatches[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] range]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// At this point matchedString will look similar to either #FFF or #FFFFFF.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// The regular expression has guaranteed that matchedString will be no longer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// than seven characters.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Extract an ASCII c string from matchedString. The &amp;#39;#&amp;#39; character should not be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// included.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;matchedCString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[matchedString substringFromIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] cStringUsingEncoding:NSASCIIStringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Convert matchedCString into an integer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; hexColorCode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; strtoul(matchedCString, NULL, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat red, green, blue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (matchedString.length&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// If the color code is in six digit notation...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Extract each color component from the integer representation of the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// color code. Each component has a value of [0-255] which must be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// converted into a normalized float for consumption by UIColor.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x00FF0000&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x0000FF00&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x000000FF&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// The color code is in shorthand notation...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Extract each color component from the integer representation of the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// color code. Each component has a value of [0-255] which must be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// converted into a normalized float for consumption by UIColor.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x00000F00&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x00000F00&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x000000F0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; (hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x000000F0&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x0000000F&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ((hexColorCode &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x0000000F&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create and return a UIColor object with the extracted components.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [UIColor colorWithRed:red green:green blue:blue alpha:&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS开发 视图翻转效果的实现 transition</title><link>https://zhangdapeng.dev/p/ios-kai-fa-shi-tu-fan-zhuan-xiao-guo-de-shi-xian-transition/</link><pubDate>Fri, 20 Jun 2025 10:36:25 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-shi-tu-fan-zhuan-xiao-guo-de-shi-xian-transition/</guid><description>&lt;p&gt;关于视图的翻转效果，最近我稍微的做了一下研究&lt;/p&gt;
&lt;p&gt;主要的是使用了一个函数&lt;/p&gt;
&lt;p&gt;&lt;code&gt;+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;还是演示一下吧，我这里是使用的storyboard&lt;/p&gt;
&lt;p&gt;FlipViewViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FlipViewViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FlipView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-4.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FlipViewViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;frontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;backView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; goingToFrontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;FlipButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;FlipButtonAction:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FlipViewViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FlipViewViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// FlipView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-4.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;FlipViewViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FlipViewViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FlipViewViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; frontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; backView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; FlipButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; goingToFrontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.frontView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] initWithFrame:self.view.frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.backView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] initWithFrame:self.view.frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.FlipButton.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;前视图&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.goingToFrontView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self initFrontViewBackgroundColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self initBackViewBackGroundColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.frontView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.backView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;FlipButtonAction:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.goingToFrontView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.goingToFrontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fromView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.goingToFrontView &lt;span style="color:#f92672"&gt;?&lt;/span&gt; self.backView : self.frontView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;toView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.goingToFrontView &lt;span style="color:#f92672"&gt;?&lt;/span&gt; self.frontView : self.backView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewAnimationOptions transitionDirection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.goingToFrontView &lt;span style="color:#f92672"&gt;?&lt;/span&gt; UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView transitionFromView:fromView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toView:toView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; duration:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:transitionDirection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; finished) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showButtonTitle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;initFrontViewBackgroundColor&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.frontView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;initBackViewBackGroundColor&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.backView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showButtonTitle&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.goingToFrontView){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.FlipButton.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;前视图&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.FlipButton.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;后视图&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS开发 电子邮件的发送</title><link>https://zhangdapeng.dev/p/ios-kai-fa-dian-zi-you-jian-de-fa-song/</link><pubDate>Fri, 20 Jun 2025 10:36:11 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-dian-zi-you-jian-de-fa-song/</guid><description>&lt;p&gt;在ios开发中，电子邮件的发送，看起来是很简单的&lt;/p&gt;
&lt;p&gt;只要使用这个MFMailComposeViewControllerDelegate代理就好了&lt;/p&gt;
&lt;p&gt;同时还有调用#import &amp;lt;MessageUI/MessageUI.h&amp;gt;这个库&lt;/p&gt;
&lt;p&gt;演示一下吧&lt;/p&gt;
&lt;p&gt;MailViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MailViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Mail
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-2.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;MessageUI/MessageUI.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MailViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;MFMailComposeViewControllerDelegate, UINavigationBarDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)showMailPicker:(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MailViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MailViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Mail
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-8-2.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 WalkerFree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;MailViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MailViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MailViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showMailPicker:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([MFMailComposeViewController canSendMail]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self displayMailComposerSheet];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Device not configured to send SMS.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayMailComposerSheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MFMailComposeViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;picker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[MFMailComposeViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picker.mailComposeDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker setSubject:&lt;span style="color:#e6db74"&gt;@&amp;#34;Hello from California!&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set up recipients
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;toRecipients &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;xx@xx&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ccRecipients &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;xx@xx&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;xx@xx&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;bccRecipients &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;xx@xx&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker setToRecipients:toRecipients];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker setCcRecipients:ccRecipients];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker setBccRecipients:bccRecipients];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Attach an image to the email
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;rainy&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;jpg&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSData dataWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker addAttachmentData:myData mimeType:&lt;span style="color:#e6db74"&gt;@&amp;#34;image/jpeg&amp;#34;&lt;/span&gt; fileName:&lt;span style="color:#e6db74"&gt;@&amp;#34;rainy&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Fill out the email body text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;emailBody &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;It is raining in sunny California!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [picker setMessageBody:emailBody isHTML:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:picker animated:YES completion:NULL];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - delegate Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;mailComposeController:&lt;/span&gt;(MFMailComposeViewController&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;didFinishWithResult:&lt;/span&gt;(MFMailComposeResult)result &lt;span style="color:#a6e22e"&gt;error:&lt;/span&gt;(NSError&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Notifies users about errors associated with the interface
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (result)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MFMailComposeResultCancelled:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Result: Mail sending canceled&amp;#34;&lt;/span&gt;) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MFMailComposeResultSaved:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Result: Mail saved&amp;#34;&lt;/span&gt;) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MFMailComposeResultSent:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Result: Mail sent&amp;#34;&lt;/span&gt;) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; MFMailComposeResultFailed:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Result: Mail sending failed&amp;#34;&lt;/span&gt;) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Result: Mail not sent&amp;#34;&lt;/span&gt;) ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissViewControllerAnimated:YES completion:NULL];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)interfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (interfaceOrientation &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIInterfaceOrientationPortrait);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行一下就可以了。如果提示“Device not configured to send SMS.”&lt;/p&gt;
&lt;p&gt;那么请在设置中打开邮件那个选项吧&lt;/p&gt;</description></item><item><title>iOS 关闭键盘 退出键盘 的5种方式</title><link>https://zhangdapeng.dev/p/ios-guan-bi-jian-pan-tui-chu-jian-pan-de-5-zhong-fang-shi/</link><pubDate>Fri, 20 Jun 2025 09:52:17 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-guan-bi-jian-pan-tui-chu-jian-pan-de-5-zhong-fang-shi/</guid><description>&lt;h3 id="点击编辑区以外的地方uiview"&gt;&lt;a class="link" href="#1" &gt;点击编辑区以外的地方（UIView）&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;这是一种很直觉的方法，当不再需要使用虚拟键盘时，只要点击虚拟键盘和编辑区域外的地方，就可以将键盘收起，下面程式码是在 UIView 中内建的触碰事件方法函式，您可以参考 Touch Panel / 触碰萤幕 / 压力感应器的基本使用方式一文，找到更多关于触碰事件的方法函式。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;touchesEnded:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[myTextView isExclusiveTouch]) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [myTextView resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果要使用此方式请务必记得，你操作画面的 Custom Class 一定要是 UIView 才行。&lt;br&gt;
画面的 Custom Class 为 UIView&lt;/p&gt;
&lt;h3 id="点击编辑区域以外的地方uicontrol"&gt;&lt;a class="link" href="#2" &gt;点击编辑区域以外的地方（UIControl）&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;收起虚拟键盘的方式与前一种相同，但是如果你的触碰事件里已经且写满了程式码，那么就可以考虑使用，UIControl 的 Touch Up Inside 事件来收起键盘，方法是将以下程式码与 UIControl 的 Touch Up Inside 事件连结即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dismissKeyboard:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [myTextView resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果要使用此方式请务必记得，你操作画面的 Custom Class 一定要是 UIControl 才行。&lt;br&gt;
画面的 Custom Class 为 UIControl&lt;br&gt;
将收起键盘的方法与 UIControl 事件连结&lt;/p&gt;
&lt;h3 id="使用制作收起键盘的按钮"&gt;&lt;a class="link" href="#3" &gt;使用制作收起键盘的按钮&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;当没有编辑区域以外的地方可供点击来收起键盘，自己制作一个按钮来收起目前的虚拟键盘，也是一个不错的方法，由于按钮必须在虚拟键盘出现才能显示于画面上，因此必须借用 NSNotificationCenter 来帮助我们判断目前键盘的状态。&lt;br&gt;
首先在 viewDidLoad: 事件中，向 NSNotificationCenter 进行註册，告诉 NSNotificationCenter 我们的 doneButtonshow: 方法函式。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt; (doneButtonshow:) name: UIKeyboardDidShowNotification object:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在每当虚拟键盘出现时，就会自动呼叫我们自定义的 doneButtonshow: 方法函式，接下来只要在该方法函式里定义按钮出现的方法即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;doneButtonshow:&lt;/span&gt; (NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)notification { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doneButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType: UIButtonTypeRoundedRect]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doneButton.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;228&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [doneButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;完成编辑&amp;#34;&lt;/span&gt; forState: UIControlStateNormal]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [doneButton addTarget: self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(hideKeyboard) forControlEvents: UIControlEventTouchUpInside]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:doneButton]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后是实作按钮按下去时的 hideKeyboard: 方法函式，务必记得要在函式中移除该按钮。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;hideKeyboard&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [doneButton removeFromSuperview]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [myTextView resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="使用判断输入字元"&gt;&lt;a class="link" href="#4" &gt;使用判断输入字元&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果要使用输入特定字元（例如 return 换行字元）来收起键盘，必须先在类别内的 @interface 区段採用 协定，您可以参考 Protocol 协定的使用方式一文，获得更多关于协定的资讯。&lt;br&gt;
在采用 协定之后，接着实作出协定内的 textView:shouldChangeTextInRange:replacementText:方法函式，此方法函式会在字元输入时触发，而回传的 BOOL 值则代表该字元是否要作用，下列程式码就是在此方法函式中，使用判断输入字元的方式来收起虚拟键盘（判断字元为 return 换行字元）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textView:&lt;/span&gt;(UITextView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textView &lt;span style="color:#a6e22e"&gt;shouldChangeTextInRange:&lt;/span&gt;(NSRange)range &lt;span style="color:#a6e22e"&gt;replacementText:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)text { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([text isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;]) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [myTextView resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后别忘记在 viewDidLoad: 事件中，将 UITextView 的代理物件指向自己，这样程式才能正确找到实作 协定方法函式的类别。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; myTextView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="关于键盘遮蔽的问题"&gt;&lt;a class="link" href="#5" &gt;关于键盘遮蔽的问题&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果您在实作上有遭遇到键盘遮蔽编辑区域的问题，可以参考使用 Animation 解决小键盘挡住 UITextField 的问题一文，透过 Core Graphic 的 Animation 功能，在键盘出现时同时移动编辑区域来解决遮蔽的问题。&lt;/p&gt;</description></item><item><title>iPhone中，点击换行，键盘消失，键盘退出</title><link>https://zhangdapeng.dev/p/iphone-zhong-dian-ji-huan-hang-jian-pan-xiao-shi-jian-pan-tui-chu/</link><pubDate>Fri, 20 Jun 2025 09:52:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-zhong-dian-ji-huan-hang-jian-pan-xiao-shi-jian-pan-tui-chu/</guid><description>&lt;p&gt;实现的步骤一个都不能少&lt;/p&gt;
&lt;p&gt;1、要在声明文件中实现 UItextFieldDelegate 协议&lt;/p&gt;
&lt;p&gt;2、在实现文件中实现 UItextFieldDelegate 协议 中键盘消失的方法即：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldReturn:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [textField resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、在viewDidLoad方法中添加代理。例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置代理点击换行，键盘消失
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textSample.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>layoutSubviews何时调用的问题</title><link>https://zhangdapeng.dev/p/layoutsubviews-he-shi-diao-yong-de-wen-ti/</link><pubDate>Fri, 20 Jun 2025 09:52:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/layoutsubviews-he-shi-diao-yong-de-wen-ti/</guid><description>&lt;p&gt;layoutSubviews何时调用的问题，这个方法是当你需要在调整subview的大小的时候需要重写（我这个翻译不严谨，以下是原文：You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.），但有时候经常指望它被调用的时候没被调用，不希望它被调用的时候被调用了，搞的很上火。根据国外社区一个人帖子，做了总结性翻译。&lt;/p&gt;
&lt;p&gt;layoutSubviews在以下情况下会被调用：&lt;/p&gt;
&lt;p&gt;1、init初始化不会触发layoutSubviews&lt;br&gt;
2、addSubview会触发layoutSubviews&lt;br&gt;
3、设置view的Frame会触发layoutSubviews，当然前提是frame的值设置前后发生了变化&lt;br&gt;
4、滚动一个UIScrollView会触发layoutSubviews&lt;br&gt;
5、旋转Screen会触发父UIView上的layoutSubviews事件&lt;br&gt;
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件&lt;/p&gt;</description></item><item><title>关于app 的 icons的使用</title><link>https://zhangdapeng.dev/p/guan-yu-app-de-icons-de-shi-yong/</link><pubDate>Fri, 20 Jun 2025 09:52:05 +0000</pubDate><guid>https://zhangdapeng.dev/p/guan-yu-app-de-icons-de-shi-yong/</guid><description>&lt;p&gt;最近在官方中有一份关于，app icons的说明。简单 说了一些不同尺寸的app icons的使用&lt;/p&gt;
&lt;p&gt;尺寸的类型有&lt;/p&gt;
&lt;p&gt;57：这种型号的尺寸的图片主要用于（Homescreen icon on iPhone/iPod touch），在iPhone/iPod touch的主屏幕上&lt;/p&gt;
&lt;p&gt;72：这种型号的尺寸的图片主要用于（Homescreen icon on iPad），在iPad的主屏幕上&lt;/p&gt;
&lt;p&gt;114：上面的一倍，这种尺寸的图片用于（Homescreen icon on iPhone Retina），在iPhone Retina的主屏幕上&lt;/p&gt;
&lt;p&gt;65：这种型号的图片主要用于（Icon in Spotlight and Settings app on iPhone/iPod touch and icon in Settings app on iPad），说到Spotlight这个，大家都知道的，没错就是搜索时，出现的，如果不知道，说明你安装的应用还不够多，哈哈&lt;/p&gt;
&lt;p&gt;50：这个大小的图片，（Icon in Spotlight on iPad），是存在于iPad上的，说的跟上面那个型号差不多，就是小了点，但是这个很重要，尤其是在ios开发中&lt;/p&gt;
&lt;p&gt;58：这个尺寸的图片，用过iPhone5的或者有Retina屏都知道（Icon in Spotlight and Settings app on iPhone Retina），没错，就是在那里使用的。&lt;/p&gt;
&lt;p&gt;114：这个尺寸的介绍是这样的（Icon in iTunes for Ad Hoc distribution builds），估计是跟开发有关点的，但是事实上在iPunes里面也能看得到的，&lt;/p&gt;
&lt;p&gt;基于以上尺寸的图片，在自己项目开发中，显的很重要，不同尺寸出来的效果是不一样，尤其是对已苹果这个追求完美的产品，不容小视&lt;/p&gt;</description></item><item><title>自定义一个 UIScrollView ，能够实现横向滚动</title><link>https://zhangdapeng.dev/p/zi-ding-yi-yi-ge-uiscrollview-neng-gou-shi-xian-heng-xiang-gun-dong/</link><pubDate>Fri, 20 Jun 2025 09:52:02 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-yi-ge-uiscrollview-neng-gou-shi-xian-heng-xiang-gun-dong/</guid><description>&lt;p&gt;关于自定义UIScrollview的方式，其实很简单，但是如何做到横向滚动，我自己是第一次使用，&lt;/p&gt;
&lt;p&gt;先来定义一个类吧:customScrollView.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;customScrollView&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIScrollView&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIScrollViewDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面看customScrollView.m的定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;visibleLabels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelContainerView;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;定义两个属性，第一个是label数组，第二个是一个UIView&lt;/p&gt;
&lt;p&gt;然后实现一下初始化的代码操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aDecoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithCoder:aDecoder]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.contentSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;5000&lt;/span&gt;, self.frame.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _visibleLabels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _labelContainerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.labelContainerView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, self.contentSize.width, self.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.labelContainerView setUserInteractionEnabled:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// hide horizontal scroll indicator so our recentering trick is not revealed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setShowsHorizontalScrollIndicator:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;都是一些基本的初始化的操作&lt;/p&gt;
&lt;p&gt;下面看一下这个方法，这个方法，是在UIScrollView在滚动的时候进行调用的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;layoutSubviews&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super layoutSubviews];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self recenterIfNecessary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// tile content in visible bounds
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect visibleBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self convertRect:[self bounds] toView:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat minimumVisibleX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMinX(visibleBounds);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat maximumVisibleX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMaxX(visibleBounds);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self tileLabelsFromMinX:minimumVisibleX toMaxX:maximumVisibleX];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面有一个方法，我写下下面&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;recenterIfNecessary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint currentOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self contentOffset];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat contentWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self contentSize].width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat centerOffsetX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (contentWidth &lt;span style="color:#f92672"&gt;-&lt;/span&gt; [self bounds].size.width) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat distanceFromCenter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fabs(currentOffset.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; centerOffsetX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (distanceFromCenter &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; (contentWidth &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4.0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.contentOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(centerOffsetX, currentOffset.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// move content by the same amount so it appears to stay still
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.visibleLabels) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView convertPoint:label.center toView:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; center.x &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; (centerOffsetX &lt;span style="color:#f92672"&gt;-&lt;/span&gt; currentOffset.x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self convertPoint:center toView:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个方法是用来控制label的位置的。&lt;/p&gt;
&lt;p&gt;当UIScrollview在滚动的时候，我们需要做一些操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;insertLabel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setNumberOfLines:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:&lt;span style="color:#e6db74"&gt;@&amp;#34;1024 Block Street&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Shaffer, CA&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;95014&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.labelContainerView addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (CGFloat)&lt;span style="color:#a6e22e"&gt;placeNewLabelOnRight:&lt;/span&gt;(CGFloat)rightEdge
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self insertLabel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels addObject:label]; &lt;span style="color:#75715e"&gt;// add rightmost label at the end of the array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [label frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rightEdge;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView bounds].size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; CGRectGetMaxX(frame);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (CGFloat)&lt;span style="color:#a6e22e"&gt;placeNewLabelOnLeft:&lt;/span&gt;(CGFloat)leftEdge
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self insertLabel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels insertObject:label atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// add leftmost label at the beginning of the array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [label frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; leftEdge &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView bounds].size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; CGRectGetMinX(frame);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tileLabelsFromMinX:&lt;/span&gt;(CGFloat)minimumVisibleX &lt;span style="color:#a6e22e"&gt;toMaxX:&lt;/span&gt;(CGFloat)maximumVisibleX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// the upcoming tiling logic depends on there already being at least one label in the visibleLabels array, so
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// to kick off the tiling we need to make sure there&amp;#39;s at least one label
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self.visibleLabels count] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self placeNewLabelOnRight:minimumVisibleX];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// add labels that are missing on right side
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rightEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMaxX([lastLabel frame]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (rightEdge &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; maximumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rightEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self placeNewLabelOnRight:rightEdge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// add labels that are missing on left side
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat leftEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMinX([firstLabel frame]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (leftEdge &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; minimumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; leftEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self placeNewLabelOnLeft:leftEdge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// remove labels that have fallen off right edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ([lastLabel frame].origin.x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; maximumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [lastLabel removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels removeLastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// remove labels that have fallen off left edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (CGRectGetMaxX([firstLabel frame]) &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; minimumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [firstLabel removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels removeObjectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个是插入label的方法&lt;/p&gt;
&lt;p&gt;一个是从左侧到右侧滑动的操作&lt;/p&gt;
&lt;p&gt;一个是从右侧到左侧滑动的操作&lt;/p&gt;
&lt;p&gt;还有一个方法是用来控制label的&lt;/p&gt;
&lt;p&gt;好了。一些基本的操作就在这里面了，打击可以自己复制一份自己看看&lt;/p&gt;
&lt;p&gt;我来个完整版的,当然我这个调用的时候，是在自己的xib文件中调用的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;customScrollView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;InfiniteScrollView&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;visibleLabels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelContainerView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;InfiniteScrollView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aDecoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithCoder:aDecoder]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.contentSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;5000&lt;/span&gt;, self.frame.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _visibleLabels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _labelContainerView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.labelContainerView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, self.contentSize.width, self.contentSize.height&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.labelContainerView setUserInteractionEnabled:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// hide horizontal scroll indicator so our recentering trick is not revealed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setShowsHorizontalScrollIndicator:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Layout
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// recenter content periodically to achieve impression of infinite scrolling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;recenterIfNecessary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint currentOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self contentOffset];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat contentWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self contentSize].width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat centerOffsetX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (contentWidth &lt;span style="color:#f92672"&gt;-&lt;/span&gt; [self bounds].size.width) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat distanceFromCenter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fabs(currentOffset.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; centerOffsetX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (distanceFromCenter &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; (contentWidth &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4.0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.contentOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(centerOffsetX, currentOffset.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// move content by the same amount so it appears to stay still
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.visibleLabels) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView convertPoint:label.center toView:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; center.x &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; (centerOffsetX &lt;span style="color:#f92672"&gt;-&lt;/span&gt; currentOffset.x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self convertPoint:center toView:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;layoutSubviews&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super layoutSubviews];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self recenterIfNecessary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// tile content in visible bounds
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect visibleBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self convertRect:[self bounds] toView:self.labelContainerView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat minimumVisibleX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMinX(visibleBounds);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat maximumVisibleX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMaxX(visibleBounds);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self tileLabelsFromMinX:minimumVisibleX toMaxX:maximumVisibleX];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Label Tiling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;insertLabel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setNumberOfLines:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:&lt;span style="color:#e6db74"&gt;@&amp;#34;1024 Block Street&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Shaffer, CA&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;95014&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.labelContainerView addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; label;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (CGFloat)&lt;span style="color:#a6e22e"&gt;placeNewLabelOnRight:&lt;/span&gt;(CGFloat)rightEdge
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self insertLabel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels addObject:label]; &lt;span style="color:#75715e"&gt;// add rightmost label at the end of the array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [label frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rightEdge;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView bounds].size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; CGRectGetMaxX(frame);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (CGFloat)&lt;span style="color:#a6e22e"&gt;placeNewLabelOnLeft:&lt;/span&gt;(CGFloat)leftEdge
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self insertLabel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels insertObject:label atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// add leftmost label at the beginning of the array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [label frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; leftEdge &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.labelContainerView bounds].size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; CGRectGetMinX(frame);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tileLabelsFromMinX:&lt;/span&gt;(CGFloat)minimumVisibleX &lt;span style="color:#a6e22e"&gt;toMaxX:&lt;/span&gt;(CGFloat)maximumVisibleX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// the upcoming tiling logic depends on there already being at least one label in the visibleLabels array, so
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// to kick off the tiling we need to make sure there&amp;#39;s at least one label
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self.visibleLabels count] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self placeNewLabelOnRight:minimumVisibleX];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// add labels that are missing on right side
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rightEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMaxX([lastLabel frame]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (rightEdge &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; maximumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rightEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self placeNewLabelOnRight:rightEdge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// add labels that are missing on left side
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat leftEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectGetMinX([firstLabel frame]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (leftEdge &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; minimumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; leftEdge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self placeNewLabelOnLeft:leftEdge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// remove labels that have fallen off right edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ([lastLabel frame].origin.x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; maximumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [lastLabel removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels removeLastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lastLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.visibleLabels lastObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// remove labels that have fallen off left edge
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (CGRectGetMaxX([firstLabel frame]) &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; minimumVisibleX)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [firstLabel removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.visibleLabels removeObjectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.visibleLabels[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CFRunLoop 初次相识</title><link>https://zhangdapeng.dev/p/cfrunloop-chu-ci-xiang-shi/</link><pubDate>Thu, 19 Jun 2025 13:55:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/cfrunloop-chu-ci-xiang-shi/</guid><description>&lt;p&gt;CFRunLoop的初次相识,不了解他，也不认识她。&lt;/p&gt;
&lt;p&gt;我参考的文章中，有一处是这么说的&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环，用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作，没有的时候休眠。&lt;/p&gt;
&lt;p&gt;Run loop的管理并不完全是自动的。你仍必须设计你的线程代码以在适当的时候启动run loop并正确响应输入事件。Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的run loop。你创建的程序不需要显示的创建run loop；每个线程，包括程序的主线程（main thread）都有与之相应的run loop对象。但是，自己创建的次线程是需要手动运行run loop的。在carbon和cocoa程序中，程序启动时，主线程会自行创建并运行run loop。&lt;/p&gt;
&lt;p&gt;接下来的部分将会详细介绍run loop以及如何为你的程序管理run loop。关于run loop对象可以参阅sdk文档。&lt;/p&gt;
&lt;p&gt;解析Run Loop&lt;/p&gt;
&lt;p&gt;run loop，顾名思义，就是一个循环，你的线程在这里开始，并运行事件处理程序来响应输入事件。你的代码要有实现循环部分的控制语句，换言之就是要有while或for语句。在run loop中，使用run loop对象来运行事件处理代码：响应接收到的事件，启动已经安装的处理程序。&lt;/p&gt;
&lt;p&gt;Run loop处理的输入事件有两种不同的来源：输入源（input source）和定时源（timer source）。输入源传递异步消息，通常来自于其他线程或者程序。定时源则传递同步消息，在特定时间或者一定的时间间隔发生。两种源的处理都使用程序的某一特定处理路径。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;在苹果官方是这样解释的。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;A CFRunLoop object monitors sources of input to a task and dispatches control when they become ready for processing. Examples of input sources might include user input devices, network connections, periodic or time-delayed events, and asynchronous callbacks.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;无奈，找到了一个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// used by thread2 to force thread exit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;forceExit:&lt;/span&gt;(ThreadObj&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)obj {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; obj.nExitFlag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The current forceExit id = %@&amp;#34;&lt;/span&gt;, self);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// for thread1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nExitFlag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The current func1 id = %@&amp;#34;&lt;/span&gt;, self);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSAutoreleasePool &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSAutoreleasePool alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//A runloop with no sources returns immediately from runMode:beforeDate:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//That will wake up the loop and chew CPU. Add a dummy source to prevent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRunLoop &lt;span style="color:#f92672"&gt;*&lt;/span&gt;runLoop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSRunLoop currentRunLoop]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMachPort &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dummyPort &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMachPort alloc] init]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [runLoop addPort:dummyPort forMode:NSDefaultRunLoopMode];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dummyPort &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [pool &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;nExitFlag){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSAutoreleasePool &lt;span style="color:#f92672"&gt;*&lt;/span&gt;loopPool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSAutoreleasePool alloc] init]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [loopPool drain];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// for thread2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;func2:&lt;/span&gt;(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)args {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nExitFlag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;The current func2 id = %@&amp;#34;&lt;/span&gt;, self);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSThread&lt;span style="color:#f92672"&gt;*&lt;/span&gt; thread1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [args objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; id1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [args objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// force thread1 to exit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(forceExit:) onThread:thread1 withObject:id1 waitUntilDone:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面就是这样调用了一下，输出的结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-07-30 10:06:04.714 MyRunLoop&lt;span style="color:#f92672"&gt;[&lt;/span&gt;55395:1803&lt;span style="color:#f92672"&gt;]&lt;/span&gt; The current func1 id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &amp;lt;ThreadObj: 0x7132590&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-07-30 10:06:04.716 MyRunLoop&lt;span style="color:#f92672"&gt;[&lt;/span&gt;55395:2003&lt;span style="color:#f92672"&gt;]&lt;/span&gt; The current func2 id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &amp;lt;ThreadObj: 0x7132600&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-07-30 10:06:04.720 MyRunLoop&lt;span style="color:#f92672"&gt;[&lt;/span&gt;55395:1803&lt;span style="color:#f92672"&gt;]&lt;/span&gt; The current forceExit id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &amp;lt;ThreadObj: 0x7132600&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-07-30 10:06:05.135 MyRunLoop&lt;span style="color:#f92672"&gt;[&lt;/span&gt;55395:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Application windows are expected to have a root view controller at the end of application launch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是这样子的，你如果自己运行的话，估计会跟我有些区别的。&lt;/p&gt;
&lt;p&gt;具体干嘛用，有时间继续 研究，对了还有一个知识点就是：NSMachPort&lt;/p&gt;
&lt;p&gt;这个看起来也有大用处，好像跟传递文件有关系&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;NSMachPort is a subclass of NSPort that can be used as an endpoint for distributed object connections (or raw messaging). NSMachPort is an object wrapper for a Mach port, the fundamental communication port in OS X. NSMachPort allows for local (on the same machine) communication only. A companion class, NSSocketPort, allows for both local and remote distributed object communication, but may be more expensive than NSMachPort for the local case.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;好像越来越强大啦，呵呵&lt;/p&gt;
&lt;p&gt;参考的文章地址：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://developer.apple.com/library/ios/#DOCUMENTATION/CoreFoundation/Reference/CFRunLoopRef/Reference/reference.html" target="_blank" rel="noopener"
 &gt;参考链接1&lt;/a&gt; &lt;a class="link" href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMachPort_Class/Reference/Reference.html" target="_blank" rel="noopener"
 &gt;参考链接2&lt;/a&gt; &lt;a class="link" href="http://www.cnblogs.com/scorpiozj/archive/2011/05/26/2058167.html" target="_blank" rel="noopener"
 &gt;参考链接3&lt;/a&gt;&lt;/p&gt;</description></item><item><title>EKEventViewController 的小接触</title><link>https://zhangdapeng.dev/p/ekeventviewcontroller-de-xiao-jie-chu/</link><pubDate>Thu, 19 Jun 2025 13:53:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/ekeventviewcontroller-de-xiao-jie-chu/</guid><description>&lt;p&gt;apple官方对EKEventViewController是这么描述的&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;An EKEventViewController object displays the details of a calendar event. You can set whether users are allowed to edit the event. If the event is an invitation, where the organizer is not the user, you can set whether a calendar preview is shown.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;EKEventViewController其实就是一个展示日历事件详情的视图控制器&lt;/p&gt;
&lt;p&gt;官方的一段代码的实现是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark EKEventEditViewDelegate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Overriding EKEventEditViewDelegate method to update event store according to user actions.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;eventEditViewController:&lt;/span&gt;(EKEventEditViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;didCompleteWithAction:&lt;/span&gt;(EKEventEditViewAction)action
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RootViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;__weak&lt;/span&gt; weakSelf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dismiss the modal view controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self dismissViewControllerAnimated:YES completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (action &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; EKEventEditViewActionCanceled)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_async(dispatch_get_main_queue(), &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Re-fetch all events happening in the next 24 hours
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weakSelf.eventsList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fetchEvents];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Update the UI with the above events
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [weakSelf.tableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Set the calendar edited by EKEventEditViewController to our chosen calendar - the default calendar.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (EKCalendar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;eventEditViewControllerDefaultCalendarForNewEvents:&lt;/span&gt;(EKEventEditViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self.defaultCalendar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并且他的实现过程是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark Add a new event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Display an event edit view controller when the user taps the &amp;#34;+&amp;#34; button.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// A new event is added to Calendar when the user taps the &amp;#34;Done&amp;#34; button in the above view controller.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;addEvent:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Create an instance of EKEventEditViewController 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EKEventEditViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;addController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[EKEventEditViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set addController&amp;#39;s event store to the current event store
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addController.eventStore &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.eventStore;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addController.editViewDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self presentViewController:addController animated:YES completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实跟自己写一个viewcontroller的过程，然后自己再去调用是差不多的，少的是自己不用去写这个逻辑流程，还有就是，如果自己写的话是不是会有什么限制。我觉得应该不会有，不然也不会开放出来让大家使用。&lt;/p&gt;</description></item><item><title>scopeButtonTitles 的小测试</title><link>https://zhangdapeng.dev/p/scopebuttontitles-de-xiao-ce-shi/</link><pubDate>Thu, 19 Jun 2025 10:48:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/scopebuttontitles-de-xiao-ce-shi/</guid><description>&lt;p&gt;scopeButtonTitles的使用很简单，就像吃苹果一样。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// create a mutable array to contain products for the search results table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchResults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithCapacity:[self.products count]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// set up the search scope buttons with titles using products&amp;#39; localized display names
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scopeButtonTitles &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [scopeButtonTitles addObject:NSLocalizedString(&lt;span style="color:#e6db74"&gt;@&amp;#34;All&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;Title for the All button in the search display controller.&amp;#34;&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deviceType &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; [APLProduct deviceTypeNames])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;displayName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [APLProduct displayNameForType:deviceType];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [scopeButtonTitles addObject:displayName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchDisplayController.searchBar.scopeButtonTitles &lt;span style="color:#f92672"&gt;=&lt;/span&gt; scopeButtonTitles;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面的代码APLProduct这个类你可以在这篇文章中找到答案。&lt;a class="link" href="https://www.gowhich.com/blog/288" target="_blank" rel="noopener"
 &gt;NSCoding解释 initWithCoder: encodeWithCoder:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;更详细的可以看这里啦&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;昨天研究了UISearchBar，今天遇到了showsScopeBar问题， 还是继续说一下UISearchBar 吧&lt;/p&gt;
&lt;p&gt;UIBarStyle barStyle&lt;br&gt;
控件的样式&lt;/p&gt;
&lt;p&gt;id&lt;!-- raw HTML omitted --&gt; delegate&lt;br&gt;
设置控件的委托&lt;/p&gt;
&lt;p&gt;NSString *text&lt;br&gt;
控件上面的显示的文字&lt;/p&gt;
&lt;p&gt;NSString *prompt&lt;br&gt;
显示在顶部的单行文字，通常作为一个提示行&lt;/p&gt;
&lt;p&gt;NSString *placeholder&lt;br&gt;
半透明的提示文字，输入搜索内容消失&lt;/p&gt;
&lt;p&gt;BOOL showsBookmarkButton&lt;br&gt;
是否在控件的右端显示一个书的按钮(没有文字的时候)&lt;/p&gt;
&lt;p&gt;BOOL showsCancelButton&lt;br&gt;
是否显示cancel按钮&lt;/p&gt;
&lt;p&gt;BOOL showsSearchResultsButton&lt;br&gt;
是否在控件的右端显示搜索结果按钮(没有文字的时候)&lt;/p&gt;
&lt;p&gt;BOOL searchResultsButtonSelected&lt;br&gt;
搜索结果按钮是否被选中&lt;/p&gt;
&lt;p&gt;UIColor *tintColor&lt;br&gt;
bar的颜色(具有渐变效果)&lt;/p&gt;
&lt;p&gt;BOOL translucent&lt;br&gt;
指定控件是否会有透视效果&lt;/p&gt;
&lt;p&gt;UITextAutocapitalizationType&lt;br&gt;
autocapitalizationType&lt;br&gt;
设置在什么的情况下自动大写&lt;/p&gt;
&lt;p&gt;UITextAutocorrectionType&lt;br&gt;
autocorrectionType&lt;br&gt;
对于文本对象自动校正风格&lt;/p&gt;
&lt;p&gt;UIKeyboardType&lt;br&gt;
keyboardType&lt;br&gt;
键盘的样式&lt;/p&gt;
&lt;p&gt;NSArray *scopeButtonTitles&lt;br&gt;
搜索栏下部的选择栏，数组里面的内容是按钮的标题&lt;/p&gt;
&lt;p&gt;NSInteger selectedScopeButtonIndex&lt;br&gt;
搜索栏下部的选择栏按钮的个数&lt;/p&gt;
&lt;p&gt;BOOL showsScopeBar&lt;br&gt;
控制搜索栏下部的选择栏是否显示出来&lt;/p&gt;
&lt;p&gt;代理列表：&lt;/p&gt;
&lt;p&gt;编辑代理&lt;/p&gt;
&lt;p&gt;– searchBar:textDidChange:&lt;/p&gt;
&lt;p&gt;– searchBar:shouldChangeTextInRange:replacementText:&lt;/p&gt;
&lt;p&gt;– searchBarShouldBeginEditing:&lt;/p&gt;
&lt;p&gt;– searchBarTextDidBeginEditing:&lt;/p&gt;
&lt;p&gt;– searchBarShouldEndEditing:&lt;/p&gt;
&lt;p&gt;– searchBarTextDidEndEditing:&lt;/p&gt;
&lt;p&gt;点击按钮&lt;/p&gt;
&lt;p&gt;– searchBarBookmarkButtonClicked:&lt;/p&gt;
&lt;p&gt;– searchBarCancelButtonClicked:&lt;/p&gt;
&lt;p&gt;– searchBarSearchButtonClicked:&lt;/p&gt;
&lt;p&gt;– searchBarResultsListButtonClicked:&lt;/p&gt;
&lt;p&gt;范围代理&lt;/p&gt;
&lt;p&gt;– searchBar:selectedScopeButtonIndexDidChange:&lt;/p&gt;
&lt;p&gt;searchBar的范围控件showsScopeBar，官方学名叫Scope Buttons。&lt;br&gt;
首先就要设置这个属性：&lt;br&gt;
self.searchBar.showsScopeBar = YES;&lt;br&gt;
然后要给他添加按钮。比如说，这样：self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@&amp;ldquo;BOY&amp;rdquo;,@&amp;ldquo;GIRL&amp;rdquo;,@&amp;ldquo;ALL&amp;rdquo;,nil];&lt;br&gt;
还有一个很重要的事情就是我们要实现这个代理UISearchBarDelegate里的这个方法searchBar:selectedScopeButtonIndexDidChange:。告诉表格，你选择的范围是啥。&lt;br&gt;
还有要是设置默认选择哪个按钮的话，要设置这个属性,像这样就是默认选中第1个啦。&lt;br&gt;
self.searchBar.selectedScopeButtonIndex = 0;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;searchDisplayController:&lt;/span&gt;(UISearchDisplayController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;shouldReloadTableForSearchString:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;shouldReloadTableForSearchString: %@&amp;#34;&lt;/span&gt;, searchString); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((controller.searchBar.selectedScopeButtonIndex &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 第一个search条件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (searchString &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; [searchString length])) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self maybeBeginSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;searchDisplayController:&lt;/span&gt;(UISearchDisplayController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#a6e22e"&gt;shouldReloadTableForSearchScope:&lt;/span&gt;(NSInteger)searchOption
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;shouldReloadTableforSearchScope: %d&amp;#34;&lt;/span&gt;, searchOption);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((searchOption &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (controller.searchBar.text &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; [controller.searchBar.text length])) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self maybeBeginSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;searchDisplayController:&lt;/span&gt;(UISearchDisplayController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#a6e22e"&gt;didShowSearchResultsTableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// make the activity indicator a sibling of the tableView, so that it can 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// be displayed on top of it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[tableView superview] addSubview:_activityView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;maybeBeginSearch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cancel any existing timer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_searchTimer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Cancelling existing timer&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchTimer invalidate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchTimer &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建一个timer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _searchTimer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSTimer scheduledTimerWithTimeInterval:&lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(beginTimerSearch:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userInfo:nil 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repeats:NO] &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;beginTimerSearch:&lt;/span&gt;(NSTimer&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)timer 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (timer &lt;span style="color:#f92672"&gt;==&lt;/span&gt; _searchTimer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchTimer invalidate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchTimer &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _searchTimer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self beginSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;beginSearch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Begin search for %@ with scope %d&amp;#34;&lt;/span&gt;, self.searchDisplayController.searchBar.text,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchDisplayController.searchBar.selectedScopeButtonIndex);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// in case one is running already
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.currentRequest cancel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSInteger scopeIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.searchDisplayController.searchBar.selectedScopeButtonIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (scopeIndex &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.searchDisplayController.searchBar.text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (searchString &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; [searchString length]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([searchString length]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;[searchString hasSuffix:&lt;span style="color:#e6db74"&gt;@&amp;#34;*&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@*&amp;#34;&lt;/span&gt;, searchString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[FreebaseSession session] search:searchString 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;suggest&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; didFinishSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(searchFinished:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:[NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;/common/topic&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;No search string: %@&amp;#34;&lt;/span&gt;, searchString);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self beginGeosearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;beginGeosearch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;beginGeosearch&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Locating...&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// this is what I want to do:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// self.searchDisplayController.searchResultsTableView.hidden = NO;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// this is moronic, but it makes the table display :(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; searchString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[self.searchDisplayController.searchBar.text length])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchDisplayController.searchBar.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.searchDisplayController.searchBar.text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;_awaitingLocation) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Awaiting location, so queing up a search&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _awaitingLocationForSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _awaitingLocation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_locationManager startUpdatingLocation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;_currentLocation) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Not awaiting, but still missing _currentLocation&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// we&amp;#39;re awaiting a location, but haven&amp;#39;t yet started searching
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _awaitingLocationForSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Kicking off a geosearch...&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Loading...&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _awaitingLocationForSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ok, we have a location, lets search!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CLLocationDegrees latitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _currentLocation.coordinate.latitude;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CLLocationDegrees longtitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _currentLocation.coordinate.longitude;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt; geoJsonLocation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Point&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSArray arrayWithObjects:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNumber numberWithDouble:longtitude],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNumber numberWithDouble:latitude], nil],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;coordinates&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; locationString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [geoJsonLocation JSONRepresentation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mql_output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObject:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNull null], &lt;span style="color:#e6db74"&gt;@&amp;#34;id&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNull null], &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSArray arrayWithObject:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNull null], &lt;span style="color:#e6db74"&gt;@&amp;#34;id&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNull null], &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNumber numberWithBool:YES], &lt;span style="color:#e6db74"&gt;@&amp;#34;optional&amp;#34;&lt;/span&gt;, nil]], &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mql_output_string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[mql_output JSONRepresentation] &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[{&amp;#34;type&amp;#34;: {&amp;#34;optional&amp;#34;: &amp;#34;forbidden&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// &amp;#34;id|=&amp;#34;: [&amp;#34;/location/country&amp;#34;, &amp;#34;/location/us_state&amp;#34;, &amp;#34;/location/continent&amp;#34;, &amp;#34;/location/us_county&amp;#34;]}}]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; distance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%f&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DISTANCES[self.searchDisplayController.searchBar.selectedScopeButtonIndex]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.searchDisplayController.searchBar.text 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stringByTrimmingCharactersInSet:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSCharacterSet whitespaceAndNewlineCharacterSet]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (searchString &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; [searchString length]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;geo_filter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; distance, &lt;span style="color:#e6db74"&gt;@&amp;#34;within&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locationString, &lt;span style="color:#e6db74"&gt;@&amp;#34;location&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;relevance&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;order_by&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;/common/topic&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;point&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;geometry_type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil] JSONRepresentation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; geo_filter, &lt;span style="color:#e6db74"&gt;@&amp;#34;geo_filter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;/common/topic&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.mqlFilter)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [options setObject:self.mqlFilter forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;mql_filter&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Search with geo_filter for %@ using %@&amp;#34;&lt;/span&gt;, searchString, options);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([searchString length]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;[searchString hasSuffix:&lt;span style="color:#e6db74"&gt;@&amp;#34;*&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@*&amp;#34;&lt;/span&gt;, searchString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[FreebaseSession session] search:searchString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;geo_relevance&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; didFinishSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(searchFinished:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:options];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; distance, &lt;span style="color:#e6db74"&gt;@&amp;#34;within&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;relevance&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;order_by&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mql_output_string, &lt;span style="color:#e6db74"&gt;@&amp;#34;mql_output&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;/common/topic&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;point&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;geometry_type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.mqlFilter)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [options setObject:self.mqlFilter forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;mql_filter&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Searching geo-only&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[FreebaseSession session] geosearch:locationString
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;suggest&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; didFinishSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(geoSearchFinished:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:options];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [mql_output_string &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;locationManager:&lt;/span&gt;(CLLocationManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)manager 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;didUpdateToLocation:&lt;/span&gt;(CLLocation &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)newLocation &lt;span style="color:#a6e22e"&gt;fromLocation:&lt;/span&gt;(CLLocation 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)oldLocation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentLocation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; newLocation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;New location! %@&amp;#34;&lt;/span&gt;, [newLocation description]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_awaitingLocationForSearch) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _awaitingLocationForSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self beginGeosearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ok, we can simply stop at this point - 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// it means we&amp;#39;ve gotten a second location marker, 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// possibly more accurate than before - no sense in 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// burning the battery. We don&amp;#39;t set _awaitingLocation now,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// because the one we&amp;#39;ve got is good enough
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Got a second location, that&amp;#39;s good enough for now.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [manager stopUpdatingLocation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)searchFinished:(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Search complete, %d items&amp;#34;&lt;/span&gt;, [result count]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchDisplayController.searchResultsTableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)geoSearchFinished:(NSDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [result valueForKeyPath:&lt;span style="color:#e6db74"&gt;@&amp;#34;features.properties&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Geosearch complete, %d items&amp;#34;&lt;/span&gt;, [self.currentResult count]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchDisplayController.searchResultsTableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)errorDidOccur:(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)result name:(NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;oops...search error: %@&amp;#34;&lt;/span&gt;, result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _activityView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.currentResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObject:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSNull null], &lt;span style="color:#e6db74"&gt;@&amp;#34;id&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSArray array], &lt;span style="color:#e6db74"&gt;@&amp;#34;type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;Error: %@&amp;#34;&lt;/span&gt;, result], &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchDisplayController.searchResultsTableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;- (void)viewWillAppear:(BOOL)animated {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [super viewWillAppear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)viewDidAppear:(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidAppear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchDisplayController setActive:YES animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchDisplayController.searchBar becomeFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;- (void)viewWillDisappear:(BOOL)animated {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;	[super viewWillDisappear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;- (void)viewDidDisappear:(BOOL)animated {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;	[super viewDidDisappear:animated];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NSCoding解释 initWithCoder: encodeWithCoder:</title><link>https://zhangdapeng.dev/p/nscoding-jie-shi-initwithcoder-encodewithcoder/</link><pubDate>Thu, 19 Jun 2025 10:48:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/nscoding-jie-shi-initwithcoder-encodewithcoder/</guid><description>&lt;p&gt;1、为了将应用数据存储到硬盘中，iOS提供基本的文件API、Property List序列化、SQLite、CoreData以及NSCoding。对于轻量级的数据要求，NSCoding因其简单而成为一种比较合适的方式。 NSCoding是一个你需要在数据类上要实现的协议以支持数据类和数据流间的编码和解码。数据流可以持久化到硬盘。&lt;/p&gt;
&lt;p&gt;2、是类对象本身数据的写入到本地文件。&lt;/p&gt;
&lt;p&gt;我们需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码，initWithCoder就是解码。 encodeWithCoder方法传入的是一个NSCoder对象，实现的时候我们就可以调用encodeObject、encodeFloat、 encodeInt等各种方法并通过指定键值进行编码。&lt;/p&gt;
&lt;p&gt;APLProduct.m的代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;APLProduct.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypeDevice &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Device&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypeDesktop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Desktop&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypePortable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Portable&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;APLProduct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;instancetype&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;productWithType:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)type &lt;span style="color:#a6e22e"&gt;name:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)name &lt;span style="color:#a6e22e"&gt;year:&lt;/span&gt;(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)year &lt;span style="color:#a6e22e"&gt;price:&lt;/span&gt;(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)price
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; APLProduct &lt;span style="color:#f92672"&gt;*&lt;/span&gt;newProduct &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newProduct.type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; type;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newProduct.name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newProduct.yearIntroduced &lt;span style="color:#f92672"&gt;=&lt;/span&gt; year;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newProduct.introPrice &lt;span style="color:#f92672"&gt;=&lt;/span&gt; price;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; newProduct;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;deviceTypeNames&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deviceTypeNames &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; dispatch_once_t once;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_once(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;once, &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deviceTypeNames &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;@[&lt;/span&gt;ProductTypeDevice, ProductTypePortable, ProductTypeDesktop&lt;span style="color:#ae81ff"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; deviceTypeNames;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayNameForType:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deviceTypeDisplayNamesDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; dispatch_once_t once;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_once(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;once, &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deviceTypeDisplayNamesDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deviceType &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; [self deviceTypeNames])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;displayName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSLocalizedString(deviceType, &lt;span style="color:#e6db74"&gt;@&amp;#34;dynamic&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deviceTypeDisplayNamesDictionary[deviceType] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; displayName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; deviceTypeDisplayNamesDictionary[type];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Archiving
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;NameKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;NameKey&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;TypeKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;TypeKey&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;YearKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;YearKey&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;PriceKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;PriceKey&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aDecoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [aDecoder decodeObjectForKey:NameKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [aDecoder decodeObjectForKey:TypeKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _yearIntroduced &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [aDecoder decodeObjectForKey:YearKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _introPrice &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [aDecoder decodeObjectForKey:PriceKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;encodeWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aCoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [aCoder encodeObject:self.name forKey:NameKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [aCoder encodeObject:self.type forKey:TypeKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [aCoder encodeObject:self.yearIntroduced forKey:YearKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [aCoder encodeObject:self.introPrice forKey:PriceKey];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;APLProduct.h的代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypeDevice;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypeDesktop;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;ProductTypePortable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;APLProduct&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NSCoding&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;type;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;) NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yearIntroduced;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;introPrice;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;instancetype&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;productWithType:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)type &lt;span style="color:#a6e22e"&gt;name:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)name &lt;span style="color:#a6e22e"&gt;year:&lt;/span&gt;(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)year &lt;span style="color:#a6e22e"&gt;price:&lt;/span&gt;(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)price;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;deviceTypeNames&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayNameForType:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)type;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>探讨 NSLocalizedString 的使用</title><link>https://zhangdapeng.dev/p/tan-tao-nslocalizedstring-de-shi-yong/</link><pubDate>Thu, 19 Jun 2025 10:48:38 +0000</pubDate><guid>https://zhangdapeng.dev/p/tan-tao-nslocalizedstring-de-shi-yong/</guid><description>&lt;p&gt;程序本地化是扩展应用市场的重要砝码.iOS提供了简便的方法来实现本地化,其中用的最多的就是NSLocalizedString.&lt;/p&gt;
&lt;p&gt;首先查看下NSLocalizedString是什么:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define NSLocalizedString(key, comment) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [[NSBundle mainBundle] localizedStringForKey:(key) value:@&amp;#34;&amp;#34; table:nil]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define NSLocalizedStringFromTable(key, tbl, comment) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [[NSBundle mainBundle] localizedStringForKey:(key) value:@&amp;#34;&amp;#34; table:(tbl)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [bundle localizedStringForKey:(key) value:@&amp;#34;&amp;#34; table:(tbl)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我们只看第一个&lt;/p&gt;
&lt;p&gt;这是一个宏,本质上是调用了函数 locakizedStrigForKey:.这样,这个宏做的其实就是在当前bundle中查找资源文件名Localizable.strings&lt;/p&gt;
&lt;p&gt;中键值key所指向的字符串.这样就不难理解还有诸如:NSLocalizedStringFromTable的宏了.&lt;/p&gt;
&lt;p&gt;下面我们就来具体实现一下.&lt;/p&gt;
&lt;p&gt;新建任一工程,然后添加新文件Localizable.strings&lt;/p&gt;
&lt;p&gt;然后选择文件属性中的&amp;quot;Make File Localizable&amp;quot;,页面自然跳转,再选择&amp;quot;General&amp;quot;选项卡时就会发现&amp;quot;Add Localization&amp;quot;了.&lt;/p&gt;
&lt;p&gt;默认有English,我们可以添加zh-hans ,然后在相应的文件中输入: &amp;ldquo;NAME&amp;rdquo; = &amp;ldquo;你好&amp;rdquo;,这样在代码中只需要简单的调用:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nameLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSLocalizedString(&lt;span style="color:#e6db74"&gt;@&amp;#34;NAME&amp;#34;&lt;/span&gt;,nil);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时在工程文件下出现了 *.lpjo的文件夹,下面安置了相应的本地化文件.由此可以判断,对于其他资源文件如图片,xib文件都可以进行本地化.&lt;/p&gt;
&lt;p&gt;最后,我们再实现对程序名称的本地化.&lt;/p&gt;
&lt;p&gt;在工程的info.plist文件的属性中选择&amp;quot;Make File Localizable&amp;quot;,然后会发现工程下出现InfoPlist.strings的文件,如法炮制,添加zh-hans,并在&lt;/p&gt;
&lt;p&gt;相应的文件中添加&amp;quot;CFBundleDisplayName&amp;quot; = &amp;ldquo;中文名称&amp;rdquo; 即可.这样,你会发现你的机器上程序名称变成了中文.&lt;/p&gt;
&lt;p&gt;PS:我还遇到一个问题,就是在本地化的时候语言代码是需要手工添加的,apple的文档上说所有的语言代码可以从ISO639( &lt;a class="link" href="http://www.loc.gov/standards/iso639-2/php/English" target="_blank" rel="noopener"
 &gt;http://www.loc.gov/standards/iso639-2/php/English&lt;/a&gt;_list.php)查询,可这个列表上中文对应的是chi/zho.而这显然没有区分简体和繁体中文.&lt;/p&gt;</description></item><item><title>关于 dispatch_once 探讨</title><link>https://zhangdapeng.dev/p/guan-yu-dispatch-once-tan-tao/</link><pubDate>Thu, 19 Jun 2025 10:48:34 +0000</pubDate><guid>https://zhangdapeng.dev/p/guan-yu-dispatch-once-tan-tao/</guid><description>&lt;p&gt;&lt;code&gt;dispatch_once&lt;/code&gt; 在ios中是用来创建单例的，具体为什么要创建单例，咱先不讨论，咱先看看，这个要怎么使用。&lt;/p&gt;
&lt;p&gt;利用dispatch_once创建单例&lt;/p&gt;
&lt;p&gt;在开发中我们会用到NSNotificationCenter、NSFileManager等，获取他们的实例通过&lt;code&gt;[NSNotificationCenter defaultCenter]&lt;/code&gt;和&lt;code&gt;[NSFileManager defaultManager]&lt;/code&gt;来获取，其实这就是单例。&lt;/p&gt;
&lt;p&gt;我们先看下函数&lt;code&gt;void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);&lt;/code&gt;其中第一个参数predicate，该参数是检查后面第二个参数所代表的代码块是否被调用的谓词，第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次，而且还是线程安全的。&lt;/p&gt;
&lt;p&gt;接下来我们来实现自己的单例，这里有一个TestManager类，为这个类实现单例&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(TestManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sharedInstance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; TestManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sharedManager;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; dispatch_once_t once;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_once(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;once, &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sharedManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[TestManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sharedManager;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到目前为止，我们就实现了一个单例，一切就搞定了，是不是很简单！&lt;/p&gt;
&lt;p&gt;使用就按照如下方式获取唯一实例即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TestManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;testManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [TestManager sharedInstance];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;讨论dispatch_once函数实现单例的方法就这样结束啦，呵呵&lt;/p&gt;</description></item><item><title>iOS6 UI状态保持和恢复</title><link>https://zhangdapeng.dev/p/ios6-ui-zhuang-tai-bao-chi-he-hui-fu/</link><pubDate>Thu, 19 Jun 2025 10:48:24 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios6-ui-zhuang-tai-bao-chi-he-hui-fu/</guid><description>&lt;p&gt;关于iOS6 UI状态保持和恢复，是最近看到几个例子，里面有这个方法&lt;code&gt;encodeRestorableStateWithCoder&lt;/code&gt;和&lt;code&gt;decodeRestorableStateWithCoder&lt;/code&gt;，感觉很奇怪，都怪自己知识浅薄啊&lt;/p&gt;
&lt;p&gt;其实呢使用这个是有原因的.&lt;/p&gt;
&lt;p&gt;iOS设计规范中要求，当应用退出的时候（包括被终止运行时候），画面中UI元素状态需要保持的，当再次进来的时候看状态与退出是一样的。iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了。&lt;br&gt;
在iOS6中我们可以在3地方实现状态保持和恢复：&lt;/p&gt;
&lt;p&gt;1,应用程序委托对象&lt;/p&gt;
&lt;p&gt;2,视图控制器&lt;/p&gt;
&lt;p&gt;3,自定义视图&lt;/p&gt;
&lt;p&gt;恢复标识是iOS6为了实现UI状态保持和恢复添加的设置项目。我们需要在应用程序委托对象AppDelegate代码部分做一些修改，添加的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;shouldSaveApplicationState:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;shouldRestoreApplicationState:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;willEncodeRestorableStateWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [coder encodeFloat:&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;Version&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didDecodeRestorableStateWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; lastVer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [coder decodeFloatForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;Version&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(@&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;lastVer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;f&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;,lastVer); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&lt;code&gt;application:shouldSaveApplicationState:&lt;/code&gt;在应用退出的时候调用，负责控制是否允许保存状态，返回YES情况是可以保存，NO是不保存。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;application:shouldRestoreApplicationState:&lt;/code&gt;是应用启动时候调用，负责控制是否恢复上次退出的时候的状态，返回YES情况是可以恢复，NO是不恢复。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;application:willEncodeRestorableStateWithCoder:&lt;/code&gt;方法是保存时候调用，在这个方法中实现UI状态或数据的保存，其中&lt;code&gt;[coder encodeFloat:2.0 forKey:@&amp;quot;Version&amp;quot;]&lt;/code&gt;是保存简单数据。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;application:didDecodeRestorableStateWithCoder:&lt;/code&gt;方法是恢复时候调用，在这个方法中实现UI状态或数据的恢复，其中&lt;code&gt;[coder decodeFloatForKey:@&amp;quot;Version&amp;quot;]&lt;/code&gt;语句是恢复上次保存的数据。&lt;/p&gt;
&lt;p&gt;要想实现具体画面中控件的保持和恢复，还需要在它视图控制器中添加一些代码，ViewController.m中添加的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;encodeRestorableStateWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super encodeRestorableStateWithCoder:coder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [coder encodeObject:self.txtField.text forKey:kSaveKey]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;decodeRestorableStateWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)coder 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super decodeRestorableStateWithCoder:coder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.txtField.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [coder decodeObjectForKey:kSaveKey]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在iOS6之后视图控制器都添加了两个：&lt;code&gt;encodeRestorableStateWithCoder:&lt;/code&gt;和&lt;code&gt;decodeRestorableStateWithCoder:&lt;/code&gt;用来实现该控制器中的控件或数据的保存和恢复。其中&lt;code&gt;encodeRestorableStateWithCoder:&lt;/code&gt; 方法是在保存时候调用，&lt;code&gt;[coder encodeObject:self.txtField.text forKey:kSaveKey]&lt;/code&gt;语句是按照指定的键保存文本框的内容，&lt;code&gt;decodeRestorableStateWithCoder:&lt;/code&gt;方法是在恢复时候调用，&lt;code&gt;[coder decodeObjectForKey:kSaveKey]&lt;/code&gt;是恢复文本框内容时候调用，保存和恢复事实上就是向一个归档文件中编码和解码的过程。&lt;/p&gt;</description></item><item><title>使用NSString 去掉前后空格或回车符</title><link>https://zhangdapeng.dev/p/shi-yong-nsstring-qu-diao-qian-hou-kong-ge-huo-hui-che-fu/</link><pubDate>Thu, 19 Jun 2025 10:29:24 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-yong-nsstring-qu-diao-qian-hou-kong-ge-huo-hui-che-fu/</guid><description>&lt;p&gt;想要去掉字符串的前后空格和回车符，很简单，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34; spaces in front and at the end &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;trimmedString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [string stringByTrimmingCharactersInSet:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(trimmedString);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>根据条件判断使用哪个Storyboard</title><link>https://zhangdapeng.dev/p/gen-ju-tiao-jian-pan-duan-shi-yong-na-ge-storyboard/</link><pubDate>Thu, 19 Jun 2025 10:29:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/gen-ju-tiao-jian-pan-duan-shi-yong-na-ge-storyboard/</guid><description>&lt;p&gt;关于根据条件选择Storyboard，我之前的一篇文章，今天使用的时候，不起作用了，悲剧，今天又自己写了一个。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//主要的storyboard - xunYi7TabBarViewController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//login的storyboard - login
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rootViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSUserDefaults standardUserDefaults] boolForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;logged_in&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIStoryboard 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storyboardWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;MainStoryboard&amp;#34;&lt;/span&gt; bundle:nil] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;instantiateViewControllerWithIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;xunYi7TabBarViewController&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIStoryboard 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storyboardWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;LoginStoryboard&amp;#34;&lt;/span&gt; bundle:nil] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;instantiateViewControllerWithIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;login&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.window.rootViewController&lt;span style="color:#f92672"&gt;=&lt;/span&gt;rootViewController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; yes;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个例子不起作用，也可以尝试我之前的那篇文章&lt;a class="link" href="https://www.gowhich.com/blog/268" target="_blank" rel="noopener"
 &gt;iOS启动 判断使用不同的 storyboard&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS 字符串比较 日期比较</title><link>https://zhangdapeng.dev/p/ios-zi-fu-chuan-bi-jiao-ri-qi-bi-jiao/</link><pubDate>Thu, 19 Jun 2025 10:29:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-fu-chuan-bi-jiao-ri-qi-bi-jiao/</guid><description>&lt;p&gt;字符串比较&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//字符串比较
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;hello nihao&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;otherString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;hello niyeyao&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([string compare:otherString] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NSOrderedAscending){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我比你大&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我是小三&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日期比较&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//日期比较
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nowDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDate alloc] initWithTimeIntervalSinceNow:&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([nowDate compare:yesterdayDate] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NSOrderedAscending){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我是今天&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我是我昨天&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然这里也可以，将指定的字符串转换为时间进行比较，字符串的时间格式要跟自己设定的时间格式相对应&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//日期比较
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nowDateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;2013/7/13&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;2013/7/12&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFromatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[dateFromatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yy/MM/dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nowDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFromatter dateFromString:nowDateString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFromatter dateFromString:yesterdayDateString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([nowDate compare:yesterdayDate] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NSOrderedAscending){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我是今天&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;我是我昨天&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果他的表现就是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2013&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;07&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;03.165&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;寻艺&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;90532&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;c07] &lt;span style="color:#960050;background-color:#1e0010"&gt;我比你大&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2013&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;07&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;03.168&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;寻艺&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;90532&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;c07] &lt;span style="color:#960050;background-color:#1e0010"&gt;我是我昨天&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里需要注意的就是&lt;/p&gt;
&lt;p&gt;NSOrderedAscending&lt;/p&gt;
&lt;p&gt;我们在Xcode定位的话&lt;/p&gt;
&lt;p&gt;会找到这样的代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NS_ENUM&lt;/span&gt;(NSInteger, NSComparisonResult) {NSOrderedAscending &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1L&lt;/span&gt;, NSOrderedSame, NSOrderedDescending};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果 跟 -1 0 1应该是一样的。&lt;/p&gt;</description></item><item><title>iOS 根据内容计算高度</title><link>https://zhangdapeng.dev/p/ios-gen-ju-nei-rong-ji-suan-gao-du/</link><pubDate>Thu, 19 Jun 2025 10:29:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-gen-ju-nei-rong-ji-suan-gao-du/</guid><description>&lt;p&gt;iOS 根据内容计算高度,网络上搜索到的，自己记录下，看到的就看到了&lt;/p&gt;
&lt;p&gt;第一步属性声明&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personProfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步属性赋值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.personProfile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;xxxxxxxxxxxxxxxx x x x x x xx x &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步求出高度&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//根据内容计算高度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGSize lineSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.personProfile sizeWithFont:[UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constrainedToSize:CGSizeMake(&lt;span style="color:#ae81ff"&gt;240&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineBreakMode:UILineBreakModeWordWrap];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34; lineSize.height = %f&amp;#34;&lt;/span&gt;, lineSize.height);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>XCode下的iOS单元测试 GHUnit</title><link>https://zhangdapeng.dev/p/xcode-xia-de-ios-dan-yuan-ce-shi-ghunit/</link><pubDate>Thu, 19 Jun 2025 10:24:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/xcode-xia-de-ios-dan-yuan-ce-shi-ghunit/</guid><description>&lt;p&gt;关于GHUnit的使用，我是摘自一篇比较不错的文章，里面即讲到了Xcode本身自带的测试工具OCUnit，同时也介绍了GHUnit，看完后很是受益呀。&lt;/p&gt;
&lt;p&gt;XCode 内置了 OCUnit 单元测试框架，但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合，我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit， GHUnit 和 OCMock 进行单元测试。&lt;/p&gt;
&lt;h3 id="ocunit"&gt;&lt;a class="link" href="#1" &gt;OCUnit&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在 XCode 下新建一个 OCUnitProject 工程，选中 Include Unit Tests 选择框，&lt;/p&gt;
&lt;p&gt;OCUnit 框架则会为我们自动添加 Unit Test 框架代码：&lt;/p&gt;
&lt;p&gt;XCode 在 OCUnitProjectTests.m 中为我们自动生成了一个 Fail 的测试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;testExample&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; STFail(&lt;span style="color:#e6db74"&gt;@&amp;#34;Unit tests are not implemented yet in OCUnitProjectTests&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;让我们来运行 Test，看看效果：&lt;/p&gt;
&lt;p&gt;从图中的红色下划线部分可以看出，测试没有通过，符合预期。我们只要像类 OCUnitProjectTests 一样编写继承自 SenTestCase 类的子类，在其中添加形式如：- (void) testXXX(); 的测试函数既可，注意必须是一个无参无返回类型且名称是以 test 为前缀的函数。&lt;/p&gt;
&lt;p&gt;OCUnit 的有点是官方支持，于 XCode 集成的比较好。&lt;/p&gt;
&lt;h3 id="ghunit"&gt;&lt;a class="link" href="#2" &gt;GHUnit&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;GHUnit 是一个开源的单元测试框架，具有可视化界面，功能亦相当强大。Mark 写了一篇 OCUnit vs GHUnit 的文章，有兴趣的童鞋可以看一看。OCMock 是由 Mulle Kybernetik 为 OS X 和 iOS 平台编写的遵循 mock object 理念的单元测试框架。&lt;/p&gt;
&lt;p&gt;下面来介绍如何配置 GHUnit 和 OCMock&lt;/p&gt;
&lt;p&gt;1，首先，创建一个名为 GHUnitProject 的单视图应用程序，注意：不要选中 Include Unit Tests 选择框。然后运行，应该出现白屏。&lt;/p&gt;
&lt;p&gt;2，添加新的 test target，选中左边的工程名，点击右侧的 Add Target，新增一个名为 Tests 的 Empty Application 应用程序，让其附属于 GHUnitProject注意：不要选中 Include Unit Tests 选择框。&lt;/p&gt;
&lt;p&gt;3，向 Tests 工程中（注意是 Tests 工程）添加 GHUnitIOS Framework。首先下载与 XCode 版本对应的 GHUnitIOS Framework。英文好的可以直接查看官方 iOS 版的安装文档：点此查看，跳过此第 3 节；否则请接着看。&lt;/p&gt;
&lt;p&gt;3.1，解压 GHUnitIOS 框架到 GHUnitProject 下，让 GHUnitIOS.framework 与 Tests 在同一目录下。&lt;/p&gt;
&lt;p&gt;3.2，回到 XCode，右击工程中的 Frameworks group，选中 Add Files to&amp;hellip;菜单，选取 GHUnitIOS.framework ，注意 targets 要选择 Tests。&lt;/p&gt;
&lt;p&gt;3.3，设置 Tests 的 Build Settings：在 Other Linker Flags 中增加两个 flag： -ObjC 和 -all_load。&lt;/p&gt;
&lt;p&gt;3.4，删除 Tests 工程中的 UTSAppDelegate.h 和 UTSAppDelegate.m 两个文件；&lt;/p&gt;
&lt;p&gt;3.5，修改 Tests 工程中的 main.m 为:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;

#import &amp;lt;GHUnitIOS/GHUnitIOSAppDelegate.h&amp;gt;

int main(int argc, char *argv[])
{
 @autoreleasepool {
 return UIApplicationMain(argc, argv, nil, NSStringFromClass([GHUnitIOSAppDelegate class]));
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.6，选择编译目标 Tests&amp;gt;iPhone 5.0 Simulator，编译运行，应该能得到如下效果。目前我们还没有编写任何实际测试，所以列表为空。&lt;/p&gt;
&lt;p&gt;4，编写 GHUnit 测试。向 Tests 工程中添加名为 GHUnitSampleTest 的 Objective C class。其内容如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;GHUnitIOS/GHUnit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GHUnitSampleTest&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;GHTestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;GHUnitSampleTest.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GHUnitSampleTest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;testStrings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;a string&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GHTestLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;I can log to the GHUnit test console: %@&amp;#34;&lt;/span&gt;, string1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Assert string1 is not NULL, with no custom error description
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GHAssertNotNULL(string1, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Assert equal objects, add custom error description
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;a string&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GHAssertEqualObjects(string1, string2, &lt;span style="color:#e6db74"&gt;@&amp;#34;A custom error message. string1 should be equal to: %@.&amp;#34;&lt;/span&gt;, string2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后编译运行，点击 Run，效果如下：&lt;/p&gt;
&lt;p&gt;图中的 All 栏显示所以的测试，Failed 栏显示没有通过的测试。强大吧，GHUnit。你可以向 GHUnitSampleTest 添加新的测试，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;testSimpleFail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GHAssertTrue(NO, nil);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们可以向 Tests 添加更多测试类，只要该类是继承自 GHTestCase，且其中的测试方法都是无参无返回值且方法名字是以 test 为前缀即可&lt;/p&gt;
&lt;p&gt;是不是有种感觉就是，以后再多的bug都不怕啦。哦也&lt;/p&gt;</description></item><item><title>iOS启动 判断使用不同的 storyboard</title><link>https://zhangdapeng.dev/p/ios-qi-dong-pan-duan-shi-yong-bu-tong-de-storyboard/</link><pubDate>Thu, 19 Jun 2025 09:58:40 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-qi-dong-pan-duan-shi-yong-bu-tong-de-storyboard/</guid><description>&lt;p&gt;关于这个问题，也是一直困扰我很久的问题了，一直记恨于心啊，终于今天让我知道了，如何解决这个问题啦，哈哈，大笑江湖呀。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rootVC;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[[NSUserDefaults standardUserDefaults] boolForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;logged_in&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rootVC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[self.storyboard instantiateViewControllerWithIdentifier: &lt;span style="color:#e6db74"&gt;@&amp;#34;vc1&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rootVC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[self.storyboard instantiateViewControllerWithIdentifier: &lt;span style="color:#e6db74"&gt;@&amp;#34;vc2&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.rootViewConroller&lt;span style="color:#f92672"&gt;=&lt;/span&gt;rootVC;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里面的“vc1”和“vc2”，其实就是storyboard的表示符，自己在创建storyboard的时候一般都会看到的，如果自己还不知道的话，多创建几个自己就知道了。&lt;/p&gt;</description></item><item><title>'iOS Application tried to push a nil view controller on target'错误处理</title><link>https://zhangdapeng.dev/p/ios-application-tried-to-push-a-nil-view-controller-on-target-cuo-wu-chu-li/</link><pubDate>Thu, 19 Jun 2025 09:58:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-application-tried-to-push-a-nil-view-controller-on-target-cuo-wu-chu-li/</guid><description>&lt;p&gt;关于“ios Application tried to push a nil view controller on target”这个错误，原因其实很简单，问题都是找到了才觉得简单，处理的时候不知道有多烦恼。呵呵，本来就应该是这样吧。&lt;/p&gt;
&lt;p&gt;没有错误的作法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[WalkerUITestViewController alloc] initWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;WalkerUITestViewController&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navigationController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationController alloc] initWithRootViewController:rootViewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; navigationController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有错误的作法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navigationController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationController alloc] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWithRootViewController:rootViewController];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; navigationController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然在这两个例子里面，属性的声明是一样的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; navigationController;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; rootViewController;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实就是在使用之前，自己有木有初始化的问题。ok。&lt;/p&gt;</description></item><item><title>iOS单元测试</title><link>https://zhangdapeng.dev/p/ios-dan-yuan-ce-shi/</link><pubDate>Thu, 19 Jun 2025 09:58:33 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-dan-yuan-ce-shi/</guid><description>&lt;p&gt;关于这篇文章，要源于自己的一个测试，因为在一边学ios开发和学习的过程中，遇到一个问题就是做测试，但是测试的时候不知道为什么老是提示，没有test单元什么的错误，回到家，好好的琢磨了一下，发现了，这个是测试单元是可以自己创建的，我这里转载的一篇文章，来csdn，里面说的很详细，是如何进行测试单元的创建，的同时也解决了我的一个问题，就是“Unit tests are not implemented yet in WalkerUITests”这个问题，呵呵，笑死我啦，其实这个是一个测试单元建立成功的提示，接下来，做这个测试就很容易啦。&lt;/p&gt;
&lt;p&gt;1、创建单元测试的target&lt;/p&gt;
&lt;p&gt;选择工程，点击Add Target，添加ios-Other下的Cocoa Touch Unit Testing Bundle类型target。（网上一些资料说，target后缀必须是Tests，但实际测试同名字无关系，可能是Xcode版本原因）。&lt;/p&gt;
&lt;p&gt;此时工程目录下会多一个Unistest8文件夹，Unistest8类是一个测试用例类Test8的一个实例。&lt;/p&gt;
&lt;p&gt;2、添加SenTestingKit.framework&lt;/p&gt;
&lt;p&gt;选中测试的Target，本项目中即Unitest8，查看Build Phases选项卡下的Link Binary With Libraries，会发现项目中缺少对SenTestingKit.framework库的引用，将其添加。&lt;/p&gt;
&lt;p&gt;3、运行Unistest8测试&lt;/p&gt;
&lt;p&gt;在Scheme中选择Unitest8，生成时一定要选择Product-Test，如果选择Run，则会出现“The scheme &amp;lsquo;Unitest8&amp;rsquo; is not configured for Running”的错误。&lt;/p&gt;
&lt;p&gt;成功运行后，发现输出错误，错误信息如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unitest8.m:29: error: -&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Unitest8 testExample&lt;span style="color:#f92672"&gt;]&lt;/span&gt; : Unit tests are not implemented yet in Unitest8 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Test Case &lt;span style="color:#e6db74"&gt;&amp;#39;-[Unitest8 testExample]&amp;#39;&lt;/span&gt; failed &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0.057 seconds&lt;span style="color:#f92672"&gt;)&lt;/span&gt;. 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开&lt;strong&gt;Unitest8.m&lt;/strong&gt;，会发现在&lt;strong&gt;Unitest8&lt;/strong&gt;类的实现文件中默认添加了一个测试函数testExample，并添加一个执行失败的提示，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;testExample&lt;/span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; STFail(&lt;span style="color:#e6db74"&gt;@&amp;#34;Unit tests are not implemented yet in Unitest8&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看到这个错误，整个测试的准备工作已经完成，接下来就可以在测试用例的类实例中添加测试函数，测试函数的名称就不能随意了，必须以test为前缀。在测试文件夹中还可以添加多个测试用例进行测试。&lt;/p&gt;
&lt;p&gt;4、添加测试对象类，进行测试&lt;/p&gt;
&lt;p&gt;完成步骤3后，可以开始对项目中具体的类进行方法测试。除了在相应的测试用例中添加该类的引用外，首先得将这个类引用加入该测试的Target（很2地因为这个问题卡了许久），在本项目里即为Unitest8。添加引用的方式是，点击测试target()，选择面板Build Phases，打开Compile Sources，选中项目中要测试类的.m实现文件将其拖入Compile Sources就ok。否则会产生如下error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Undefined symbols &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; architecture i386: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;_OBJC_CLASS_&lt;/span&gt;$_测试类名&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, referenced from: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; objc-class-ref inUnitest8.o 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ld: symbol&lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; not found &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; architecture i386 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果测试的类存在nib文件则需要将nib文件拖入Build Phases&amp;ndash;Copy Bundle Resources中。&lt;/p&gt;
&lt;p&gt;以上就是参考的文章的主要内容，这里介绍给大家，希望对自己有用，对自己也有用。&lt;/p&gt;
&lt;p&gt;参考文章：http://blog.csdn.net/catandrat111/article/details/7819284&lt;/p&gt;</description></item><item><title>iOS 添加的UIButton为什么不起作用</title><link>https://zhangdapeng.dev/p/ios-tian-jia-de-uibutton-wei-shen-me-bu-qi-zuo-yong/</link><pubDate>Thu, 19 Jun 2025 09:58:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-tian-jia-de-uibutton-wei-shen-me-bu-qi-zuo-yong/</guid><description>&lt;p&gt;先看两个例子：&lt;/p&gt;
&lt;p&gt;第一个例子，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setPersonInfo:&lt;/span&gt;(CGFloat)x &lt;span style="color:#a6e22e"&gt;y:&lt;/span&gt;(CGFloat)y &lt;span style="color:#a6e22e"&gt;heihgt:&lt;/span&gt;(CGFloat)height{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoArea &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(x, y&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, width, height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoArea.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_contentScroll addSubview:labelInfoArea];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//基本信息的标题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoCaption &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelInfoArea.frame.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;基本信息&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoArea addSubview:labelInfoCaption];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//complete button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[_personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;is_completed&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;completeBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;161.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;159.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;160.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;161.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;159.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;160.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;我来完善&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;12.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(redirectCompleteDetail)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn setFrame:CGRectMake(self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80.0&lt;/span&gt;, y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_contentScroll addSubview:completeBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//基本信息表格
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoTable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelInfoCaption.frame.origin.x, labelInfoCaption.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelInfoCaption.frame.size.height, labelInfoArea.frame.size.width, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor lightGrayColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoArea addSubview:labelInfoTable];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tableCellHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tableCellWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; labelInfoTable.frame.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-年龄
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelAge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, tableCellWidth, tableCellHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;年龄&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelAge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-身高
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAge.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelAge.frame.size.width, labelAge.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;身高&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelHeight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-体重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelWeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelHeight.frame.size.width, labelHeight.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;体重&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelWeight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-性别
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelBMI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelHeight.frame.size.width, labelHeight.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;性别&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelBMI];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//+++++++++++++++++++
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-年龄值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelAgeValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, labelInfoTable.frame.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;age&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@岁&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;age&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelAgeValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-身高值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelHeightValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAgeValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAgeValue.frame.size.width, labelAgeValue.frame.origin.y, labelAgeValue.frame.size.width, labelAgeValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;height&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@CM&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;height&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelHeightValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-体重值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelWeightValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeightValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeightValue.frame.size.width, labelHeightValue.frame.origin.y, labelHeightValue.frame.size.width, labelHeightValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;weight&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@KG&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;weight&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelWeightValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-性别
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelBMIValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeightValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeightValue.frame.size.width, labelWeightValue.frame.origin.y, labelWeightValue.frame.size.width, labelWeightValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;sex&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;sex&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if([[NSString stringWithFormat:@&amp;#34;%@&amp;#34;,[self.personInfo valueForKey:@&amp;#34;bmi&amp;#34;]] isEqualToString:@&amp;#34;0&amp;#34;])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// labelBMIValue.text = @&amp;#34;无&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// labelBMIValue.text = [NSString stringWithFormat:@&amp;#34;%@KG&amp;#34;,[self.personInfo valueForKey:@&amp;#34;bmi&amp;#34;]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelBMIValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//++++++++++++++++
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//横轴分割线-第一根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;vfirstLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, tableCellHeight &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.origin.y, labelInfoTable.frame.size.width, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vfirstLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:vfirstLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第一根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;firstLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAge.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:firstLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第二根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;secondLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secondLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:secondLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第三根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;thridLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thridLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:thridLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二个例子，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setPersonInfo:&lt;/span&gt;(CGFloat)x &lt;span style="color:#a6e22e"&gt;y:&lt;/span&gt;(CGFloat)y &lt;span style="color:#a6e22e"&gt;heihgt:&lt;/span&gt;(CGFloat)height{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoArea &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(x, y&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, width, height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoArea.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_contentScroll addSubview:labelInfoArea];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//基本信息的标题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoCaption &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelInfoArea.frame.size.width &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;基本信息&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoCaption.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoArea addSubview:labelInfoCaption];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//基本信息表格
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelInfoTable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelInfoCaption.frame.origin.x, labelInfoCaption.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelInfoCaption.frame.size.height, labelInfoArea.frame.size.width, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor lightGrayColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelInfoTable.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoArea addSubview:labelInfoTable];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tableCellHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tableCellWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; labelInfoTable.frame.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-年龄
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelAge &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, tableCellWidth, tableCellHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;年龄&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAge.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelAge];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-身高
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAge.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelAge.frame.size.width, labelAge.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;身高&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeight.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelHeight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-体重
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelWeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelHeight.frame.size.width, labelHeight.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;体重&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeight.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelWeight];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-性别
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelBMI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelHeight.frame.size.width, labelHeight.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;性别&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMI.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelBMI];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//+++++++++++++++++++
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-年龄值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelAgeValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, labelInfoTable.frame.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, labelInfoTable.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;age&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@岁&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;age&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelAgeValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelAgeValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-身高值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelHeightValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAgeValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAgeValue.frame.size.width, labelAgeValue.frame.origin.y, labelAgeValue.frame.size.width, labelAgeValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;height&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@CM&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;height&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelHeightValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelHeightValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-体重值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelWeightValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeightValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeightValue.frame.size.width, labelHeightValue.frame.origin.y, labelHeightValue.frame.size.width, labelHeightValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;weight&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@KG&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;weight&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelWeightValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelWeightValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加基本信息-性别
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;labelBMIValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeightValue.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeightValue.frame.size.width, labelWeightValue.frame.origin.y, labelWeightValue.frame.size.width, labelWeightValue.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;sex&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;无&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[self.personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;sex&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if([[NSString stringWithFormat:@&amp;#34;%@&amp;#34;,[self.personInfo valueForKey:@&amp;#34;bmi&amp;#34;]] isEqualToString:@&amp;#34;0&amp;#34;])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// labelBMIValue.text = @&amp;#34;无&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// labelBMIValue.text = [NSString stringWithFormat:@&amp;#34;%@KG&amp;#34;,[self.personInfo valueForKey:@&amp;#34;bmi&amp;#34;]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelBMIValue.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:labelBMIValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//++++++++++++++++
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//横轴分割线-第一根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;vfirstLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, tableCellHeight &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.origin.y, labelInfoTable.frame.size.width, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vfirstLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:vfirstLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第一根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;firstLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelAge.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelAge.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:firstLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第二根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;secondLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelHeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelHeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secondLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:secondLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖轴分割线-第三根
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;thridLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(labelWeight.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelWeight.frame.size.width, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, labelInfoTable.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thridLine.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [labelInfoTable addSubview:thridLine];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//完善信息的按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setupComplateButton:&lt;/span&gt;(CGFloat) y{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//基本信息的完善按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[_personInfo valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;is_completed&amp;#34;&lt;/span&gt;]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;completeBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;161.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;159.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;160.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.layer.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;161.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;159.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;160.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;我来完善&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completeBtn.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;12.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(redirectCompleteDetail)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [completeBtn setFrame:CGRectMake(self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80.0&lt;/span&gt;, y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_contentScroll addSubview:completeBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一个例子，我将按钮直接放在了里面。导致我后面做操作的时候，似乎将重新添加了一个层，将我的UIbutton按钮覆盖掉了。导致不起作用。第二个例子是我在这个项目的解决方案，直接分开，我将UIButton直接作为最后的层添加到view上，这样就不会覆盖掉，结果达到了我想要的效果。&lt;/p&gt;</description></item><item><title>NSNotification广播实现视图跳转传递数据</title><link>https://zhangdapeng.dev/p/nsnotification-guang-bo-shi-xian-shi-tu-tiao-zhuan-chuan-di-shu-ju/</link><pubDate>Thu, 19 Jun 2025 09:58:19 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsnotification-guang-bo-shi-xian-shi-tu-tiao-zhuan-chuan-di-shu-ju/</guid><description>&lt;p&gt;NSNotification广播实现视图跳转传递数据&lt;br&gt;
广播机制分为：注册-&amp;gt;发送-&amp;gt;接收(接收方)&lt;br&gt;
第一步，在要发送数据的视图页面.m文件处理发送逻辑的方法里注册+发送&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;pressed:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [self performSegueWithIdentifier:@&amp;#34;second&amp;#34; sender:self];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;send message:%@&amp;#34;&lt;/span&gt;,firstField.text);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//页面跳转传值方法二：利用notification
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dicts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:&lt;span style="color:#e6db74"&gt;@&amp;#34;one1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;one&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;two2&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;two&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;three3&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;three&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注册(第一步)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;notification &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSNotification notificationWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;mynotification&amp;#34;&lt;/span&gt; object:firstField.text];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//发送（第二步）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] postNotification:notification];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注册+发送也可以一行完成(等效于以上两行)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] postNotificationName:&lt;span style="color:#e6db74"&gt;@&amp;#34;mynotification2&amp;#34;&lt;/span&gt; object:dicts];&lt;span style="color:#75715e"&gt;//发送一个字典过去
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;notificationWithName:参数的值是自己定义，接收方以此名称为接收标识。&lt;br&gt;
第二步，在跳转后，接收数据视图页面.m文件中处理逻辑的方法里 接收&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//接受端：接受（第一步）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(notificationHandler:) name:&lt;span style="color:#e6db74"&gt;@&amp;#34;mynotification&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;defaultCenter] addObserver:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(notificationHandler2:) name:&lt;span style="color:#e6db74"&gt;@&amp;#34;mynotification2&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//自定义接收信息和处理的方法（第二步）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;notificationHandler:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) notification{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secondField.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [notification object];&lt;span style="color:#75715e"&gt;//收到消息后在UItextField中显示出来
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//自定义接收字典信息的方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;notificationHandler2:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) notification2{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [notification2 object];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;receive dict :%@,forkey:%@&amp;#34;&lt;/span&gt;,dict,[dict objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;one&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：如果注册的notification在目标视图没有收到或名称写错，目标视图的相关方法就不会执行&lt;/p&gt;</description></item><item><title>iOS 数据存储 NSData存储转为NSDictionary存储</title><link>https://zhangdapeng.dev/p/ios-shu-ju-cun-chu-nsdata-cun-chu-zhuan-wei-nsdictionary-cun-chu/</link><pubDate>Thu, 19 Jun 2025 09:58:08 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-shu-ju-cun-chu-nsdata-cun-chu-zhuan-wei-nsdictionary-cun-chu/</guid><description>&lt;p&gt;最近做app，涉及到关于数据的存储，对于远程数据的请求，有个问题就是，对于同样的请求，不做重复的操作，但是又能够保证，获取的数据在本地，并且即使的进行解析，之前是NSdata，这样的话，转换数据的话，就要涉及到一个中间步骤，就是将数据转换为json格式，在转换为NSdictionary，解析的过程会出现的可能性，导致数据不能及时响应，最近几次的闪退，估计是这个原因，于是做了调整，闪退的现象果然概率不再频繁。&lt;/p&gt;
&lt;p&gt;这次主要是分享一下，修改后的封装类，主要是在里面添加了几个关于存储NSDictionary的方法&lt;/p&gt;
&lt;p&gt;代码托管在&lt;a class="link" href="https://github.com/zhangda89/IOS-StorageData" target="_blank" rel="noopener"
 &gt;github&lt;/a&gt;：https://github.com/zhangda89/IOS-StorageData&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// StorageData.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;CommonCrypto/CommonDigest.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;StorageData.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;xunYi7AppDelegate.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StorageData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;开始结didReceiveData搜数据&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveResponse:&lt;/span&gt;(NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;开始结didReceiveResponse搜数据&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didFailWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;didFailWithError&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connectionDidFinishLoading:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;connectionDidFinishLoading&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;remoteFetchData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([xunYi7AppDelegate isReachable]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:dataUrl];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestUseProtocolCachePolicy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLResponse alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receiveDataError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRequest:request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;receiveDataError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDataToFile:receivedData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; receivedData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [xunYi7AppDelegate showNetworkMessage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;localFetchData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrl];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDataToFile:receivedData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;保存成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;保存失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; receivedData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-艺人排行版
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchPersonRankDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 Dictionary 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 Dictionary 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:personInfo fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; personInfo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程数据存储失败&amp;#34;);s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-关注列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchAttentionListDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchAttentionListDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchAttentionListDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [attentionDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:attentionData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchAttentionListDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; attentionData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; attentionData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchAttentionListDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取远程数据的Dcitionary格式-关注列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;remoteFetchAttentionListDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [attentionDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:attentionData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchAttentionListDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; attentionData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; attentionData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchAttentionListDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-机会列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchChanceListDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchChanceListDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchChanceListDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;chanceDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;chanceData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [chanceDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:chanceData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchChanceListDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; chanceData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; chanceData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchChanceListDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-电视剧排行榜
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchTeleplayRankDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchTeleplayRankDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchTeleplayRankDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;teleplayDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;teleplayData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [teleplayDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:teleplayData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchTeleplayRankDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; teleplayData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; teleplayData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchTeleplayRankDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-艺人签单排行榜
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchStarkCheckDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchStarkCheckDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchStarkCheckDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;starkCheckDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;starkCheckData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [starkCheckDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:starkCheckData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchStarkCheckDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; starkCheckData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; starkCheckData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchStarkCheckDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取本地数据的Dcitionary格式-hotTeleplay
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchHotTeleplayDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchHotTeleplayDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchHotTeleplayDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;starkCheckDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;starkCheckData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [starkCheckDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:starkCheckData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchHotTeleplayDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; starkCheckData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; starkCheckData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchHotTeleplayDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 获取远程数据的Dcitionary格式-找演员
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;remoteFetchFindPerformersDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchPersonResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:searchPersonResult fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchFindPerformersDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; searchPersonResult;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; searchPersonResult;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchFindPerformersDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;localFetchFindPerformersDictionayData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@-dictionary.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrlString]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localDictionaryData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;本地数据 localFetchFindPerformersDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;远程获取数据 localFetchFindPerformersDictionayData 数据&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchPersonResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDictionaryDataToFile:searchPersonResult fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchFindPerformersDictionayData 远程数据存储成功&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; searchPersonResult;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; searchPersonResult;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;localFetchFindPerformersDictionayData 远程数据存储失败&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localDictionaryData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalDictionaryData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localDictionaryData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 存储Dictionary格式的数据到本地-艺人排行版
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;savePersonRankDictionaryToLocal:&lt;/span&gt;(NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data &lt;span style="color:#a6e22e"&gt;dataUrlString:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)urlString{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//md5加密字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;md5:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)str{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [str UTF8String];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; result[&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CC_MD5(cStr, strlen(cStr), result); &lt;span style="color:#75715e"&gt;// This is the md5 call
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSString stringWithFormat:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//上传图片存储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;saveUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取沙盒目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:fullPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager createDirectoryAtPath:fullPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withIntermediateDirectories:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attributes:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:imageName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIImageJPEGRepresentation(image, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 将图片写入文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageData writeToFile:fullPath atomically:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//上传图片删除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取沙盒目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:fullPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:fullPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储的图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchUploadImagePath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:imageName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fullPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断文件是否存在
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isFileExists:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fullpath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:fullpath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fullpath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数据存储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//+(void)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储文件的目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dataPath&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//此处首先指定了图片存取路径（默认写到应用程序沙盒 中）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//并给文件起个文件名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filePathDerectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; filePathDerectory;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取指定文件的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fromFilenamePathFetchLocalData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filename{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//保存数据到指定文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:filename]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsAtPath:filename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [data mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fromFilenamePathFetchLocalDictionaryData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filename{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dicData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDictionary alloc] initWithContentsOfFile:filename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(dicData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; dicData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//存储数据到指定文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;storageDataToFile:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data &lt;span style="color:#a6e22e"&gt;fileName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//保存数据到指定文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager createFileAtPath:fileName contents:data attributes:nil]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - 存储Dictionary格式的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;storageDictionaryDataToFile:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dicData &lt;span style="color:#a6e22e"&gt;fileName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//保存数据到指定文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([dicData writeToFile:fileName atomically:YES]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;deleteFile:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:fileName error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取今天的日期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchTodayDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dateFormatter stringFromDate:currentDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取前天的日期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchYesterdayBeforeDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate dateWithTimeIntervalSinceNow:&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;))];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dateFormatter stringFromDate:yesterdayDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储文件的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;createDirectory:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)directoryName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:directoryName]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager createDirectoryAtPath:directoryName
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withIntermediateDirectories:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attributes:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeFile:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filePath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:filePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:filePath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;error = %@&amp;#34;&lt;/span&gt;,error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeDirectory&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;removeDirectoryPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsPath stringByAppendingPathComponent:[self fetchYesterdayBeforeDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:removeDirectoryPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:removeDirectoryPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;error = %@&amp;#34;&lt;/span&gt;,error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自定义UITableViewCell（使用xib文件），还可以自定义处理选中按钮和非选中按钮</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-shi-yong-xib-wen-jian-hai-ke-yi-zi-ding-yi-chu-li-xuan-zhong-an-niu-he-fei-xuan-zhong-an-niu/</link><pubDate>Wed, 18 Jun 2025 11:28:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-shi-yong-xib-wen-jian-hai-ke-yi-zi-ding-yi-chu-li-xuan-zhong-an-niu-he-fei-xuan-zhong-an-niu/</guid><description>&lt;p&gt;最近在做自定义的cell的操作，由于之前是在网上找的一个类似的东东，结果拿来用的时候就出现了很多的问题，呵呵，结果我还是自己研究了一下，原因就是我之前是使用自定义的cell的问题是，在删除和非删除的过程中进行切换，有个选中和非选中的图片总是迟一步退去，导致的问题是，挡住了后面的内容，‍使得整个看起来不美观，结果我就是使用了UIImageView的隐藏功能，代码我放在下面，github也有的。在使用的时候最好是参照我的另一片博文：&lt;a class="link" href="https://www.gowhich.com/blog/135" target="_blank" rel="noopener"
 &gt;IPhone 自定义 UITableViewCell 行缩进（修正版）&lt;/a&gt;。好了，看代码。&lt;/p&gt;
&lt;p&gt;attentionListCell.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITableViewCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageViewPic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;selectImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;index;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//编辑操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameEdit&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameNormal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;attentionListCell.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;attentionListCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; selectImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _selectImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithStyle:&lt;/span&gt;(UITableViewCellStyle)style &lt;span style="color:#a6e22e"&gt;reuseIdentifier:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)reuseIdentifier
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithStyle:style reuseIdentifier:reuseIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelected:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)selected &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelected:selected animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqual:_listImage])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageViewPic.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listName])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListIndex:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listIndex])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.index.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListRank:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listRank])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;willTransitionToState:&lt;/span&gt;(UITableViewCellStateMask)state{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;ResetFrame&amp;#34;&lt;/span&gt; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:&lt;span style="color:#ae81ff"&gt;0.7&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self cache:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateDefaultMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingEditControlMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingDeleteConfirmationMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameEdit&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;View Flip&amp;#34;&lt;/span&gt; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:&lt;span style="color:#ae81ff"&gt;1.25&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;19.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.selectImageView setFrame:CGRectMake(selectImageX, selectImageY, selectImageWidth, selectImageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameNormal&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(_checkImageView &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_checkImageView setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;19.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.selectImageView setFrame:CGRectMake(selectImageX, selectImageY, selectImageWidth, selectImageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 重新定义editing的设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setEditing:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)editing &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.editing &lt;span style="color:#f92672"&gt;==&lt;/span&gt; editing){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setEditing:editing animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (editing){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;19.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat selectImageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.selectImageView setFrame:CGRectMake(selectImageX, selectImageY, selectImageWidth, selectImageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;unselectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_unselect&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:unselectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setChecked:_checked];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (checked){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;selectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_select&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:selectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;unselectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_unselect&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _selectImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:unselectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代码就是这样的。&lt;/p&gt;</description></item><item><title>自定义UITableViewCell 不使用xib文件</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-bu-shi-yong-xib-wen-jian/</link><pubDate>Wed, 18 Jun 2025 11:28:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-bu-shi-yong-xib-wen-jian/</guid><description>&lt;p&gt;以前经常使用xib做自定义的UITableViewCell，但是最近因为老是闪退，于是想知道是不是因为xib的问题，因为之前意识到一个问题就是兼容的问题，这里涉及到一个AutoLayout的问题。于是想不用xib文件试试。&lt;/p&gt;
&lt;p&gt;代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personImagePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;Icon_NMI&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:[[UIImage alloc] initWithContentsOfFile:personImagePath]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[personView setFrame:CGRectMake(imageViewX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewY,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewWidth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageViewHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[cell.contentView addSubview:personView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(titleLabelX,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; personView.frame.origin.y, self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; personView.frame.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; titleLabelHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;personLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;personLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[cell.contentView addSubview:personLabel];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;很简单的就实现了，如果想增加其他的东西，也是很方面的，只要将自己的组建添加到cell.contentView就好了。&lt;/p&gt;</description></item><item><title>NSNotificationCenter的简单使用</title><link>https://zhangdapeng.dev/p/nsnotificationcenter-de-jian-dan-shi-yong/</link><pubDate>Wed, 18 Jun 2025 11:28:09 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsnotificationcenter-de-jian-dan-shi-yong/</guid><description>&lt;p&gt;关于NSNotificationCenter，跟我前面那篇文章是一样的，一直想使用这个，基于种种原因，一直没去涉及，最近因为新浪微博的登录，so，用到了，就简单记录一下吧。&lt;/p&gt;
&lt;p&gt;第一步：简单的写个方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;addObservers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(deviceOrientationDidChange:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;UIDeviceOrientationDidChangeNotification&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeObservers&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;UIDeviceOrientationDidChangeNotification&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是这样的，添加一个通知，然后去调用方法&lt;/p&gt;
&lt;p&gt;这个方法是做什么的呢&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;deviceOrientationDidChange:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)object
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你想做什么都可以，因为只是一个例子，你可以抽象的超长发挥的。我没用上，知道这么用就好了先。&lt;/p&gt;</description></item><item><title>UIActivityIndicatorView简单的使用方法</title><link>https://zhangdapeng.dev/p/uiactivityindicatorview-jian-dan-de-shi-yong-fang-fa/</link><pubDate>Tue, 17 Jun 2025 18:57:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/uiactivityindicatorview-jian-dan-de-shi-yong-fang-fa/</guid><description>&lt;p&gt;关于UIActivityIndicatorView的简单的使用方法，最近突然就学会了，这个要归咎于，要多看别人的东西，多用用别人的东西，就能学到很多。&lt;/p&gt;
&lt;p&gt;第一步：属性声明&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIActivityIndicatorView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;indicatorView;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：实现过程&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;indicatorView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;indicatorView.autoresizingMask &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIViewAutoresizingFlexibleTopMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleBottomMargin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleLeftMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleRightMargin;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:indicatorView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[indicatorView sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[indicatorView startAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;indicatorView.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; weiboLoginWeb.center;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>weiboSDK登录分享</title><link>https://zhangdapeng.dev/p/weibosdk-deng-lu-fen-xiang/</link><pubDate>Tue, 17 Jun 2025 18:57:35 +0000</pubDate><guid>https://zhangdapeng.dev/p/weibosdk-deng-lu-fen-xiang/</guid><description>&lt;p&gt;关于这个分享，也是考虑到很多开发者，在使用的过程中遇到的了很多的问题，对于这种情况我是这么理解的，微博也许是做事不认真吧，也许是我们真的不懂吧，但是我觉得解决问题，能达到自己想要的效果就好了。微博官方的weiboSDK我用的是最新的版本，截止到目前这个时刻，我是用的是最新的，开始的时候，我使用的时候，使用了最初的UIWebView的登录方式，主要是因为，使用客户端的方式，至今不知道什么原理，自己还是慢慢研究吧，呵呵。后来觉得样式不符合自己，于是今天就自己使用UIViewController，在里面使用UIWebView的方式，简单的实现了，至少现在的看起来不会感觉手机的登录看起来怪怪 的。我把代码留在下面：&lt;/p&gt;
&lt;p&gt;github代码地址：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/zhangda89/IOS-weiboSDK" target="_blank" rel="noopener"
 &gt;https://github.com/zhangda89/IOS-weiboSDK&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/zhangda89/IOS-StorageData" target="_blank" rel="noopener"
 &gt;https://github.com/zhangda89/IOS-StorageData&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ThirdPartyLoginController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-7-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ThirdPartyLoginController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UserCenter.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ThirdPartyLoginController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ThirdPartyLoginController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; weiboLoginWeb;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; indicatorView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; authParams;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; appRedirectURI;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; sinaWeiboRequest;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; userID;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; accessToken;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; expirationDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; refreshToken;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; previousOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithNibName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil &lt;span style="color:#a6e22e"&gt;bundle:&lt;/span&gt;(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Custom initialization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;微博登录&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weiboLoginWeb.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIActivityIndicatorViewStyleGray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView.autoresizingMask &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIViewAutoresizingFlexibleTopMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleBottomMargin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleLeftMargin &lt;span style="color:#f92672"&gt;|&lt;/span&gt; UIViewAutoresizingFlexibleRightMargin;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:indicatorView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.authParams &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kAppKey, &lt;span style="color:#e6db74"&gt;@&amp;#34;client_id&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;response_type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kAppRedirectURI, &lt;span style="color:#e6db74"&gt;@&amp;#34;redirect_uri&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;mobile&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;display&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.appRedirectURI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kAppRedirectURI;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.sinaWeiboRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[SinaWeiboRequest alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sinaWeiboRequest.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - SinaWeiboRequestDelegate Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;request:&lt;/span&gt;(SinaWeiboRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;didReceiveResponse:&lt;/span&gt;(NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;response = %@&amp;#34;&lt;/span&gt;,response);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;request:&lt;/span&gt;(SinaWeiboRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;didReceiveRawData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;data = %@&amp;#34;&lt;/span&gt;,data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;request:&lt;/span&gt;(SinaWeiboRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;didFailWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;error = %@&amp;#34;&lt;/span&gt;,error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;request:&lt;/span&gt;(SinaWeiboRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;didFinishLoadingWithResult:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)result{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;result = %@&amp;#34;&lt;/span&gt;,result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([UserCenter saveWeiboAuth:result]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController popViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Activity Indicator
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showIndicator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView startAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicatorView.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; weiboLoginWeb.center;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hideIndicator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [indicatorView stopAnimating];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Show / Hide
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;load&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;authPagePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest serializeURL:kSinaWeiboWebAuthURL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params:authParams httpMethod:&lt;span style="color:#e6db74"&gt;@&amp;#34;GET&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [weiboLoginWeb loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:authPagePath]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;show&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self load];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showIndicator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addObservers];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hide&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeObservers];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [weiboLoginWeb stopLoading];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;cancel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self hide];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - UIDeviceOrientationDidChangeNotification Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;deviceOrientationDidChange:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)object
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark Obeservers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;addObservers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;											 selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(deviceOrientationDidChange:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;												 name:&lt;span style="color:#e6db74"&gt;@&amp;#34;UIDeviceOrientationDidChangeNotification&amp;#34;&lt;/span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeObservers&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[[NSNotificationCenter defaultCenter] removeObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;													name:&lt;span style="color:#e6db74"&gt;@&amp;#34;UIDeviceOrientationDidChangeNotification&amp;#34;&lt;/span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - UIWebView Delegate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webViewDidFinishLoad:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aWebView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self hideIndicator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webView:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)webView &lt;span style="color:#a6e22e"&gt;didFailLoadWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self hideIndicator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;webView:&lt;/span&gt;(UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aWebView &lt;span style="color:#a6e22e"&gt;shouldStartLoadWithRequest:&lt;/span&gt;(NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request &lt;span style="color:#a6e22e"&gt;navigationType:&lt;/span&gt;(UIWebViewNavigationType)navigationType{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; request.URL.absoluteString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;siteRedirectURI &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@%@&amp;#34;&lt;/span&gt;, kSinaWeiboSDKOAuth2APIDomain, appRedirectURI];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([url hasPrefix:appRedirectURI] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; [url hasPrefix:siteRedirectURI]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error_code &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest getParamValueFromUrl:url paramName:&lt;span style="color:#e6db74"&gt;@&amp;#34;error_code&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (error_code){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest getParamValueFromUrl:url paramName:&lt;span style="color:#e6db74"&gt;@&amp;#34;error&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error_uri &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest getParamValueFromUrl:url paramName:&lt;span style="color:#e6db74"&gt;@&amp;#34;error_uri&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error_description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest getParamValueFromUrl:url paramName:&lt;span style="color:#e6db74"&gt;@&amp;#34;error_description&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;errorInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error, &lt;span style="color:#e6db74"&gt;@&amp;#34;error&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error_uri, &lt;span style="color:#e6db74"&gt;@&amp;#34;error_uri&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error_code, &lt;span style="color:#e6db74"&gt;@&amp;#34;error_code&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error_description, &lt;span style="color:#e6db74"&gt;@&amp;#34;error_description&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;errorInfo = %@&amp;#34;&lt;/span&gt;,errorInfo);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self hide];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;code &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest getParamValueFromUrl:url paramName:&lt;span style="color:#e6db74"&gt;@&amp;#34;code&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (code){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self hide];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kAppKey, &lt;span style="color:#e6db74"&gt;@&amp;#34;client_id&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kAppSecret, &lt;span style="color:#e6db74"&gt;@&amp;#34;client_secret&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;authorization_code&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;grant_type&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.appRedirectURI, &lt;span style="color:#e6db74"&gt;@&amp;#34;redirect_uri&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code, &lt;span style="color:#e6db74"&gt;@&amp;#34;code&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sinaWeiboRequest disconnect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sinaWeiboRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.sinaWeiboRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [SinaWeiboRequest requestWithURL:kSinaWeiboWebAccessTokenURL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; httpMethod:&lt;span style="color:#e6db74"&gt;@&amp;#34;POST&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params:params
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [sinaWeiboRequest connect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 清空认证信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeAuthData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSArray* sinaweiboCookies = [cookies cookiesForURL:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [NSURL URLWithString:@&amp;#34;https://open.weibo.cn&amp;#34;]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// for (NSHTTPCookie* cookie in sinaweiboCookies)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [cookies deleteCookie:cookie];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 判断是否登录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return YES为已登录；NO为未登录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isLoggedIn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; userID &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; accessToken &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; expirationDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 判断登录是否过期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return YES为已过期；NO为未为期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isAuthorizeExpired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;now &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ([now compare:expirationDate] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NSOrderedDescending);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 判断登录是否有效，当已登录并且登录未过期时为有效状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return YES为有效；NO为无效
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isAuthValid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ([self isLoggedIn] &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;[self isAuthorizeExpired]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ThirdPartyLoginController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-7-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SinaWeiboRequest.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SinaWeibo.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SinaWeiboConstants.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;QuartzCore/QuartzCore.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define kAppKey @&amp;#34;xxxxxxxxx&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define kAppSecret @&amp;#34;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define kAppRedirectURI @&amp;#34;https:&lt;/span&gt;&lt;span style="color:#75715e"&gt;//api.weibo.com/oauth2/default.html&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifndef kAppKey
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifndef kAppSecret
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifndef kAppRedirectURI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ThirdPartyLoginController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIWebViewDelegate, SinaWeiboDelegate, SinaWeiboRequestDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIWebView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;weiboLoginWeb;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIActivityIndicatorView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;indicatorView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;authParams;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appRedirectURI;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) SinaWeiboRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sinaWeiboRequest;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;userID;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accessToken;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;expirationDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;refreshToken;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIInterfaceOrientation previousOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还有一个简单的管理微博用户登录的信息的方法，很简单的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UserCenter.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-7-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserCenter&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;saveWeiboAuth:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)params;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboExpireDate&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboAccessToken&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboUid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isOutDate&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeWeiboAuthCookieData&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeWeiboAuthData&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UserCenter.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-7-10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;UserCenter.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserCenter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 存储微博登录的信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;saveWeiboAuth:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)params{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;authData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [params objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;access_token&amp;#34;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;@&amp;#34;AccessTokenKey&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [params objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;expires_in&amp;#34;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [params objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;uid&amp;#34;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;@&amp;#34;UserIDKey&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [params objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;access_token&amp;#34;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;@&amp;#34;refresh_token&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] setObject:authData forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] synchronize];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//微博的时间戳的转换
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey = %@&amp;#34;&lt;/span&gt;,[[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 获取微博登录的过期时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboExpireDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 获取微博登录的AccessToken
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboAccessToken&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;AccessTokenKey&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 获取登录的微博用户的id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchWeiboUid&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;UserIDKey&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 判断是否过期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isOutDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//现在时刻的时间戳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;newDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timeStamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%lu&amp;#34;&lt;/span&gt;, (&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)[newDate timeIntervalSince1970]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//微博的时间戳的转换
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd HH:mm:ss ZZZ&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;weiBoDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter dateFromString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;weiBoDate ExpirationDateKey = %@&amp;#34;&lt;/span&gt;,[[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *weiBoDateStamp = [NSString stringWithFormat:@&amp;#34;%lu&amp;#34;, (long) [weiBoDate timeIntervalSince1970]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;weiBoDateStamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;weiBoDateStamp=%@, timeStamp = %@&amp;#34;&lt;/span&gt;,[[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;] objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;ExpirationDateKey&amp;#34;&lt;/span&gt;],timeStamp);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([timeStamp compare:weiBoDateStamp] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;){&lt;span style="color:#75715e"&gt;//未过期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//已经过期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeWeiboAuthData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 移出微博的登录的cookie信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeWeiboAuthCookieData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSHTTPCookieStorage&lt;span style="color:#f92672"&gt;*&lt;/span&gt; cookies &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHTTPCookieStorage sharedHTTPCookieStorage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray&lt;span style="color:#f92672"&gt;*&lt;/span&gt; sinaweiboCookies &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cookies cookiesForURL:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;https://open.weibo.cn&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSHTTPCookie&lt;span style="color:#f92672"&gt;*&lt;/span&gt; cookie &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; sinaweiboCookies)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cookies deleteCookie:cookie];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @description 移出微博的登录的信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;removeWeiboAuthData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSUserDefaults standardUserDefaults] removeObjectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;SinaWeiboAuthData&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>时间戳转时间 时间转时间戳</title><link>https://zhangdapeng.dev/p/shi-jian-chuo-zhuan-shi-jian-shi-jian-zhuan-shi-jian-chuo/</link><pubDate>Tue, 17 Jun 2025 18:57:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-jian-chuo-zhuan-shi-jian-shi-jian-zhuan-shi-jian-chuo/</guid><description>&lt;h3 id="现在时刻的时间戳"&gt;&lt;a class="link" href="#1" &gt;现在时刻的时间戳&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;newDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timeStamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%lu&amp;#34;&lt;/span&gt;, (&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)[newDate timeIntervalSince1970]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="时间转换为时间戳的转换"&gt;&lt;a class="link" href="#2" &gt;时间转换为时间戳的转换&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[dateFormatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd HH:mm:ss ZZZ&amp;#34;&lt;/span&gt;];&lt;span style="color:#75715e"&gt;//时间的格式要正确
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;weiBoDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter dateFromString:&lt;span style="color:#e6db74"&gt;@&amp;#34;2018-07-08 08:51:20 +0000&amp;#34;&lt;/span&gt;];&lt;span style="color:#75715e"&gt;//与上面的时间格式对应
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;weiBoDateStamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%lu&amp;#34;&lt;/span&gt;, (&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;) [weiBoDate timeIntervalSince1970]];&lt;span style="color:#75715e"&gt;//获取时间戳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="时间戳转换为时间"&gt;&lt;a class="link" href="#3" &gt;时间戳转换为时间&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timeStamp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSDate dateWithTimeIntervalSince1970:&lt;span style="color:#ae81ff"&gt;1296035591&lt;/span&gt;];&lt;span style="color:#75715e"&gt;//时间戳的起始点设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;1296035591 = %@&amp;#34;&lt;/span&gt;,timeStamp);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timeStampStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter stringFromDate:timeStamp];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;confromTimespStr= %@&amp;#34;&lt;/span&gt;,timeStampStr);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([timeStamp compare:&lt;span style="color:#e6db74"&gt;@&amp;#34;157679999&amp;#34;&lt;/span&gt;]){&lt;span style="color:#75715e"&gt;//比较时间戳是否过期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;时间还没有过期&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;时间已经过期&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UITableViewCell的seleced与deselect选中/取消选中</title><link>https://zhangdapeng.dev/p/uitableviewcell-de-seleced-yu-deselect-xuan-zhong-qu-xiao-xuan-zhong/</link><pubDate>Tue, 17 Jun 2025 18:57:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitableviewcell-de-seleced-yu-deselect-xuan-zhong-qu-xiao-xuan-zhong/</guid><description>&lt;p&gt;首先要从一个我遇到的问题谈起，一个基于NavigationBar的App，开始时我有一个UITableViewController，其中每个UITableViewCell点击后都会push另一个ViewController，每次点击Cell的时候，Cell都会被选中，当从push的ViewController返回的时候选中的Cell便会自动取消选中（有动画效果）。后来由于某些原因我把这个UITableViewController改成了UIViewController，之后就产生了一个问题：每次返回到TableView的时候，之前选中的Cell不能自动取消选中，经过查找得知：&lt;/p&gt;
&lt;p&gt;UITableViewController有一个clearsSelectionOnViewWillAppear的property，&lt;/p&gt;
&lt;p&gt;而当把UITableViewController修改成UIViewController后，这个属性自然就不存在了，因此我们必须手动添加取消选中的功能，方法很简单，在viewWillAppear方法中加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即可，估计UITableViewController也是用类似的方法来实现取消选中的功能的。&lt;/p&gt;</description></item><item><title>iOS中NSUserDefaults的简单使用</title><link>https://zhangdapeng.dev/p/ios-zhong-nsuserdefaults-de-jian-dan-shi-yong/</link><pubDate>Tue, 17 Jun 2025 18:51:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-nsuserdefaults-de-jian-dan-shi-yong/</guid><description>&lt;p&gt;创建一个user defaults方法有多个，最简单得快速创建方法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加数据到 user defaults:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults setObject:nameField.text forKey:UserDefaultNameKey];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以添加基本数据类型int, float, bool等，有相应得方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults setBool:YES forKey:UserDefaultBoolKey];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实例代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults setObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;yes&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;login&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults setBool:YES forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;login_state&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从user defaults中获取数据:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults objectForKey:NCUserDefaultNameKey]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[accountDefaults boolForKey: UserDefaultBoolKey];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实例代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;accountDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;login = %@&amp;#34;&lt;/span&gt;,[accountDefaults objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;login&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;login_state = %d&amp;#34;&lt;/span&gt;,[accountDefaults boolForKey: &lt;span style="color:#e6db74"&gt;@&amp;#34;login_state&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要点： NSUserDefaults非常好用，并不需要用户在程序中设置NSUserDefaults的全局变量，需要在哪里使用NSUserDefaults的数据，那么就在哪里创建一个NSUserDefaults对象，然后进行读或者写操作。&lt;/p&gt;
&lt;p&gt;针对同一个关键字对应的对象或者数据，可以对它进行重写，重写之后关键字就对应新的对象或者数据，旧的对象或者数据会被自动清理。&lt;/p&gt;
&lt;p&gt;参考文章：http://blog.csdn.net/binyanye1/article/details/7633728&lt;/p&gt;</description></item><item><title>SenTestingKit not loaded, Image not found</title><link>https://zhangdapeng.dev/p/sentestingkit-not-loaded-image-not-found/</link><pubDate>Tue, 17 Jun 2025 17:21:20 +0000</pubDate><guid>https://zhangdapeng.dev/p/sentestingkit-not-loaded-image-not-found/</guid><description>&lt;p&gt;报错信息：&lt;/p&gt;
&lt;p&gt;dyld: Library not loaded: @rpath/SenTestingKit.framework/Versions/A/SenTestingKit&lt;/p&gt;
&lt;p&gt;文件我参考“http://www.carrotcoded.com/2012/10/10/sentestingkit-not-loaded-image-not-found/”&lt;/p&gt;
&lt;p&gt;里面是这样的描述的&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;I am pretty sure that it was working perfectly in the old macbook pro, therefore i set out to google and see that alot of people actually hit this issue but there wasn’t any clear cut answer. To solve this basically, expand your solution -&amp;gt; Frameworks -&amp;gt; Remove the SenTestingKit from your project. This should resolve the issue. Note : Please remove reference not delete it.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;大概的意思就是说，去掉这个SenTestingKit.framework框架就好了。&lt;/p&gt;
&lt;p&gt;我去掉后确实可以了，也没有影响我的后面的运行&lt;/p&gt;
&lt;p&gt;Note : Please remove reference not delete it.&lt;/p&gt;
&lt;p&gt;注意这一句，别删掉了，这个可是框架自己本身就有的&lt;/p&gt;</description></item><item><title>iOS 毫秒级的计算 毫秒时间</title><link>https://zhangdapeng.dev/p/ios-hao-miao-ji-de-ji-suan-hao-miao-shi-jian/</link><pubDate>Tue, 17 Jun 2025 17:21:14 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-hao-miao-ji-de-ji-suan-hao-miao-shi-jian/</guid><description>&lt;p&gt;毫秒级很简单&lt;/p&gt;
&lt;p&gt;看代码示例&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_imageNameDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithCapacity:IMAGE_SUM];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;IMAGE_SUM;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;date &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimeInterval aInterval &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[date timeIntervalSince1970];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timeString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%f&amp;#34;&lt;/span&gt;, aInterval];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;uuid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postData uuid];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filename &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@_%@.png&amp;#34;&lt;/span&gt;,uuid,timeString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithObjectsAndKeys:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;state&amp;#34;&lt;/span&gt;,[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,filename],&lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_imageNameDic setObject:tmpDic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 删除文件 删除文件夹 创建文件 创建文件夹 判断文件存在 md5 封装类</title><link>https://zhangdapeng.dev/p/ios-shan-chu-wen-jian-shan-chu-wen-jian-jia-chuang-jian-wen-jian-chuang-jian-wen-jian-jia-pan-duan-wen-jian-cun-zai-md5-feng-zhuang-lei/</link><pubDate>Tue, 17 Jun 2025 17:21:05 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-shan-chu-wen-jian-shan-chu-wen-jian-jia-chuang-jian-wen-jian-chuang-jian-wen-jian-jia-pan-duan-wen-jian-cun-zai-md5-feng-zhuang-lei/</guid><description>&lt;p&gt;自己最近在使用关于数据的存取和删除，于是自己就写了一个包括功能的类，自己用着还是蛮方便，再次分享一下&lt;/p&gt;
&lt;p&gt;只贴代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// StorageData.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;CommonCrypto/CommonDigest.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;StorageData.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;xunYi7AppDelegate.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StorageData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;开始结didReceiveData搜数据&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveResponse:&lt;/span&gt;(NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;开始结didReceiveResponse搜数据&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didFailWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;didFailWithError&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connectionDidFinishLoading:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;connectionDidFinishLoading&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;remoteFetchData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([xunYi7AppDelegate isReachable]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:dataUrl];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestUseProtocolCachePolicy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLResponse alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receiveDataError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRequest:request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;receiveDataError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; receivedData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [xunYi7AppDelegate showNetworkMessage];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;localFetchData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchTodayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self dataPath] stringByAppendingPathComponent:[self fetchYesterdayDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self createDirectory:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [currentDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterdayDataFilePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [yesterdayDataFilePath stringByAppendingPathComponent:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@.plist&amp;#34;&lt;/span&gt;,[self md5:dataUrl]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;localData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalData:currentDataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(localData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){&lt;span style="color:#75715e"&gt;//本地数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{&lt;span style="color:#75715e"&gt;//远程获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self remoteFetchData:dataUrl];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self storageDataToFile:receivedData fileName:currentDataFilePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;保存成功&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self removeDirectory];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;保存失败&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((localData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self fromFilenamePathFetchLocalData:yesterdayDataFilePath]) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; localData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; receivedData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//md5加密字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;md5:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)str{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cStr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [str UTF8String];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; result[&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CC_MD5(cStr, strlen(cStr), result); &lt;span style="color:#75715e"&gt;// This is the md5 call
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSString stringWithFormat:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result[&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;14&lt;/span&gt;], result[&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//上传图片存储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;saveUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取沙盒目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:fullPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager createDirectoryAtPath:fullPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withIntermediateDirectories:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attributes:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:imageName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIImageJPEGRepresentation(image, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 将图片写入文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageData writeToFile:fullPath atomically:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//上传图片删除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取沙盒目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:fullPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:fullPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储的图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fetchUploadImagePath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpImage&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fullPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullPath stringByAppendingPathComponent:imageName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fullPath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断文件是否存在
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isFileExists:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fullpath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:fullpath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fullpath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数据存储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//+(void)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储文件的目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dataPath&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//此处首先指定了图片存取路径（默认写到应用程序沙盒 中）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//并给文件起个文件名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filePathDerectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; filePathDerectory;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取指定文件的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;fromFilenamePathFetchLocalData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filename{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//保存数据到指定文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:filename]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileManager contentsAtPath:filename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [data mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//存储数据到指定文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;storageDataToFile:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data &lt;span style="color:#a6e22e"&gt;fileName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//保存数据到指定文件中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager createFileAtPath:fileName contents:data attributes:nil]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;deleteFile:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:fileName error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取今天的日期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchTodayDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;currentDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dateFormatter stringFromDate:currentDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取昨天的日期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchYesterdayDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate dateWithTimeIntervalSinceNow:&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dateFormatter stringFromDate:yesterdayDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取前天的日期
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchYesterdayBeforeDate&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yesterdayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate dateWithTimeIntervalSinceNow:&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;))];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dateFormatter stringFromDate:yesterdayDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取存储文件的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;createDirectory:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)directoryName{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath:directoryName]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager createDirectoryAtPath:directoryName
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withIntermediateDirectories:YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attributes:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; directoryName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeFile:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filePath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:filePath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:filePath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;error = %@&amp;#34;&lt;/span&gt;,error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//删除目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeDirectory&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;removeDirectoryPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsPath stringByAppendingPathComponent:[self fetchYesterdayBeforeDate]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([fileManager fileExistsAtPath:removeDirectoryPath]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:removeDirectoryPath error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(error){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;error = %@&amp;#34;&lt;/span&gt;,error);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// StorageData.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StorageData&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NSURLConnectionDataDelegate, NSURLConnectionDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)remoteFetchData:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;localFetchData:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataUrl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;saveUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;uploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchUploadImagePath&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fetchUploadImagePath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeUploadImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)image &lt;span style="color:#a6e22e"&gt;withName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isFileExists:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fullpath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;removeFile:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)filePath;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有不完善的地方，希望指正和修改&lt;/p&gt;</description></item><item><title>UISegmentControl设置背景色的问题</title><link>https://zhangdapeng.dev/p/uisegmentcontrol-she-zhi-bei-jing-se-de-wen-ti/</link><pubDate>Tue, 17 Jun 2025 17:20:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/uisegmentcontrol-she-zhi-bei-jing-se-de-wen-ti/</guid><description>&lt;p&gt;关于UISegmentControl设置背景色的问题，我也遇到了，还查找了不少的资料，最终答案我在文档里面找到了。&lt;/p&gt;
&lt;p&gt;链接我记录一下：https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UISegmentedControl_Class/Reference/UISegmentedControl.html&lt;/p&gt;
&lt;p&gt;搜索一下tintcolor就可以知道了，说的很清楚的&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;tintColor The tint color of the segmented control. @property(nonatomic, retain) UIColor *tintColor Discussion The default value of this property is nil (no color). UISegmentedControl uses this property only if the style of the segmented control is UISegmentedControlStyleBar.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;说的就是，首先有个属性要改一下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sexSegment.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面代码是我的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;男&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;女&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sexSegment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:item];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sexSegment.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sexSegment.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ColorConfig NavigationColor]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sexSegment.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sexSegment setFrame:CGRectMake(segmentX, segmentY, segmentWidth, segmentHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sexSegment addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(selectSex:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_contentView addSubview:sexSegment];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>分段控件UISegmentedControl</title><link>https://zhangdapeng.dev/p/fen-duan-kong-jian-uisegmentedcontrol/</link><pubDate>Tue, 17 Jun 2025 17:20:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/fen-duan-kong-jian-uisegmentedcontrol/</guid><description>&lt;p&gt;最近刚刚接触到这个东西，感觉好神奇一样，就试着用了一下，哈哈，果然还不错：&lt;/p&gt;
&lt;p&gt;代码如下，很简单的例子，不寒有任何的杂质&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;男&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;女&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sexSegment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:item];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sexSegment.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sexSegment setSegmentedControlStyle:UISegmentedControlStylePlain];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sexSegment setFrame:CGRectMake(segmentX, segmentY, segmentWidth, segmentHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[sexSegment addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(selectSex:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_contentView addSubview:sexSegment];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>更新证书错误Code Sign error: Provisioning profile 'XXXX' can't be found</title><link>https://zhangdapeng.dev/p/geng-xin-zheng-shu-cuo-wu-code-sign-error-provisioning-profile-xxxx-cant-be-found/</link><pubDate>Tue, 17 Jun 2025 17:20:08 +0000</pubDate><guid>https://zhangdapeng.dev/p/geng-xin-zheng-shu-cuo-wu-code-sign-error-provisioning-profile-xxxx-cant-be-found/</guid><description>&lt;p&gt;在Xcode中当你在更新了你得证书而再重新编译你的程序，真机调试一直会出现 Code Sign error: Provisioning profile ‘XXXX’ can&amp;rsquo;t be found是不是会另你很恼火。下面说说解决方法，让你很好的解决这个问题。&lt;/p&gt;
&lt;p&gt;1.关闭你的项目，找到项目文件XXXX.xcodeproj，在文件上点击右键，选择“显示包内容”（Show Package Contents）。会新打开一个Finder。注：其实XXXX.xcodeproj就是一个文件夹，这里新打开的一个Finder里面的三个文件就是该XXXX.xcodeproj文件夹里面的文件。&lt;/p&gt;
&lt;p&gt;2.在新打开的Finder中找到project.pbxproj，并且打开。在这之中找到你之前的证书的编码信息。我之前报的错误信息是&lt;/p&gt;
&lt;p&gt;Code Sign error: Provisioning profile &amp;lsquo;37D44E7F-0339-4277-9A82-C146A944CD46&amp;rsquo;，所以我用查找的方式找到了所有包括37D44E7F-0339-4277-9A82-C146A944CD46的行，并且删除。&lt;/p&gt;
&lt;p&gt;3.保存，重新启动你的项目，再编译。就OK了。&lt;/p&gt;
&lt;p&gt;参考：http://www.douban.com/note/131009422/&lt;/p&gt;</description></item><item><title>创建透明的UIToolbar</title><link>https://zhangdapeng.dev/p/chuang-jian-tou-ming-de-uitoolbar/</link><pubDate>Tue, 17 Jun 2025 17:04:04 +0000</pubDate><guid>https://zhangdapeng.dev/p/chuang-jian-tou-ming-de-uitoolbar/</guid><description>&lt;p&gt;写描述方法：&lt;/p&gt;
&lt;p&gt;正确的方法是子类化UIToolbar，设置其backgroundColor&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TranslucentToolbar&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIToolbar&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TranslucentToolbar&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do nothing 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithFrame:&lt;/span&gt;(CGRect)aRect { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithFrame:aRect])) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.opaque &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.clearsContextBeforeDrawing &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在需要创建的地方使用子类化的UIToolbar&lt;/p&gt;
&lt;p&gt;如果你说不知道这些代码放在哪里。好吧我告诉你，其实这个就在自定义的UIoolbar中，如果你还不知道的话，请联系我好了，或者留言&lt;/p&gt;</description></item><item><title>iOS文件系统的管理</title><link>https://zhangdapeng.dev/p/ios-wen-jian-xi-tong-de-guan-li/</link><pubDate>Tue, 17 Jun 2025 16:46:14 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-wen-jian-xi-tong-de-guan-li/</guid><description>&lt;p&gt;用于执行一般的文件系统操作 (reading and writing is done via NSData, et. al.).&lt;/p&gt;
&lt;p&gt;主要功能包括：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从一个文件中读取数据；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;向一个文件中写入数据；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;删除文件；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;复制文件；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移动文件；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;比较两个文件的内容；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;测试文件的存在性；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;读取/更改文件的属性&amp;hellip; &amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just alloc/init an instance and start performing operations. Thread safe.&lt;/p&gt;
&lt;h3 id="常见的nsfilemanager处理文件的方法如下"&gt;&lt;a class="link" href="#0-1" &gt;常见的NSFileManager处理文件的方法如下：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;NSFileManager *fileManager = [[NSFileManager alloc]init]; //最好不要用defaultManager。&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSData *myData = [fileManager contentsAtPath:path]; // 从一个文件中读取数据&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager createFileAtPath:path contents:myData attributes:dict];//向一个文件中写入数据，属性字典允许你制定要创建&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager removeItemAtPath:path error:err];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager moveItemAtPath:path toPath:path2 error:err];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager copyItemAtPath:path toPath:path2 error:err];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager contentsEqualAtPath:path andPath:path2];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager fileExistsAtPath:path]; &amp;hellip; &amp;hellip;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="常见的nsfilemanager处理目录的方法如下"&gt;&lt;a class="link" href="#0-2" &gt;常见的NSFileManager处理目录的方法如下：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;[fileManager currentDirectoryPath];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager changeCurrentDirectoryPath:path];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager copyItemAtPath:path toPath:path2 error:err];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:err];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager fileExistsAtPath:path isDirectory:YES];&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;[fileManager enumeratorAtPath:path]; //获取目录的内容列表。一次可以枚举指定目录中的每个文件。 &amp;hellip; &amp;hellip;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Has a delegate with lots of “should” methods (to do an operation or proceed after an error).&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;And plenty more. Check out the documentation.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1文件的创建"&gt;1、&lt;a class="link" href="#1" &gt;文件的创建&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;CreateFile&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//对于错误信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建文件管理器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileMgr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//指向文件目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@/myFolder&amp;#34;&lt;/span&gt;, NSHomeDirectory()] attributes:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Result is: /Documents/file1.txt结果为：/Documents/file1.txt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filePath&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;file2.txt&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//需要写入的字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;iPhoneDeveloper Tips&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;http://iPhoneDevelopTips,com&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//写入文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//显示文件目录的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Documentsdirectory: %@&amp;#34;&lt;/span&gt;,[fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2对文件重命名"&gt;2、&lt;a class="link" href="#2" &gt;对文件重命名&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;对一个文件重命名,想要重命名一个文件，我们需要把文件移到一个新的路径下。下面的代码创建了我们所期望的目标文件的路径，然后请求移动文件以及在移动之后显示文件目录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//通过移动该文件对文件重命名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filePath2&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;file2.txt&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断是否移动
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; YES)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Unable to move file: %@&amp;#34;&lt;/span&gt;, [error localizedDescription]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//显示文件目录的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Documentsdirectory: %@&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3删除一个文件"&gt;3、&lt;a class="link" href="#3" &gt;删除一个文件&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;为了使这个技巧完整，让我们再一起看下如何删除一个文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//在filePath2中判断是否删除这个文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([fileMgr removeItemAtPath:filePath2 error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; YES)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Unable to delete file: %@&amp;#34;&lt;/span&gt;, [error localizedDescription]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//显示文件目录的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Documentsdirectory: %@&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一旦文件被删除了，正如你所预料的那样，文件目录就会被自动清空：&lt;br&gt;
这些示例能教你的，仅仅只是文件处理上的一些皮毛。想要获得更全面、详细的讲解，你就需要掌握NSFileManager文件的知识。&lt;/p&gt;
&lt;h3 id="4删除目录下所有文件"&gt;4、&lt;a class="link" href="#4" &gt;删除目录下所有文件&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取文件路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;attchmentFolder&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;document &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [document stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Attchments&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;manager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[manager contentsOfDirectoryAtPath:path error:nil]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [manager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; path;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ndash;清除附件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager defaultManager] removeItemAtPath:[[MOPAppDelegate instance] attchmentFolder] error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5判断文件是否存在"&gt;5、&lt;a class="link" href="#5" &gt;判断文件是否存在&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self dataFilePath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;｛&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//do some thing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;｝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataFilePath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [documentDirectory stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;data.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常用路径工具函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; NSUserName&lt;span style="color:#960050;background-color:#1e0010"&gt;（）；&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;返回当前用户的登录名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; NSFullUserName&lt;span style="color:#960050;background-color:#1e0010"&gt;（）；&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;返回当前用户的完整用户名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; NSHomeDirectory&lt;span style="color:#960050;background-color:#1e0010"&gt;（）；&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;返回当前用户主目录的路径&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; NSHomeDirectoryForUser&lt;span style="color:#960050;background-color:#1e0010"&gt;（）；&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;返回用户&lt;/span&gt;user的主目录 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; NSTemporaryDirectory&lt;span style="color:#960050;background-color:#1e0010"&gt;（）；&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;返回可用于创建临时文件的路径目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常用路径工具方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt; pathWithComponents&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;components &lt;span style="color:#960050;background-color:#1e0010"&gt;根据&lt;/span&gt;components&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSArray对象&lt;span style="color:#960050;background-color:#1e0010"&gt;）中元素构造有效路径&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;pathComponents &lt;span style="color:#960050;background-color:#1e0010"&gt;析构路径，获取路径的各个部分&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;lastPathComponent &lt;span style="color:#960050;background-color:#1e0010"&gt;提取路径的最后一个组成部分&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;pathExtension &lt;span style="color:#960050;background-color:#1e0010"&gt;路径扩展名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByAppendingPathComponent&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;path &lt;span style="color:#960050;background-color:#1e0010"&gt;将&lt;/span&gt;path添加到现有路径末尾 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByAppendingPathExtension&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;ext &lt;span style="color:#960050;background-color:#1e0010"&gt;将拓展名添加的路径最后一个组成部分&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByDeletingPathComponent &lt;span style="color:#960050;background-color:#1e0010"&gt;删除路径的最后一个部分&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByDeletingPathExtension &lt;span style="color:#960050;background-color:#1e0010"&gt;删除路径的最后一个部分&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;的扩展名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByExpandingTildeInPath &lt;span style="color:#960050;background-color:#1e0010"&gt;将路径中的代字符扩展成用户主目录（&lt;/span&gt;&lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）或指定用户主目录（&lt;/span&gt;&lt;span style="color:#f92672"&gt;~&lt;/span&gt;user&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByResolvingSymlinksInPath &lt;span style="color:#960050;background-color:#1e0010"&gt;尝试解析路径中的符号链接&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;stringByStandardizingPath &lt;span style="color:#960050;background-color:#1e0010"&gt;通过尝试解析&lt;/span&gt;&lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;..&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;.&lt;span style="color:#960050;background-color:#1e0010"&gt;、和符号链接来标准化路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用路径NSPathUtilities.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tempdir &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTemporaryDirectory(); &lt;span style="color:#960050;background-color:#1e0010"&gt;临时文件的目录名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fm currentDirectoryPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[path lastPathComponent]; &lt;span style="color:#960050;background-color:#1e0010"&gt;从路径中提取最后一个文件名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fullpath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [path stringByAppendingPathComponent:fname];&lt;span style="color:#960050;background-color:#1e0010"&gt;将文件名附加到路劲的末尾&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;extenson &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fullpath pathExtension]; &lt;span style="color:#960050;background-color:#1e0010"&gt;路径名的文件扩展名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;homedir &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSHomeDirectory();&lt;span style="color:#960050;background-color:#1e0010"&gt;用户的主目录&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;component &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [homedir pathComponents]; &lt;span style="color:#960050;background-color:#1e0010"&gt;路径的每个部分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NSProcessInfo类：允许你设置或检索正在运行的应用程序的各种类型信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSProcessInfo &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;processInfo &lt;span style="color:#960050;background-color:#1e0010"&gt;返回当前进程的信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSArray&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;arguments &lt;span style="color:#960050;background-color:#1e0010"&gt;以&lt;/span&gt;NSString对象数字的形式返回当前进程的参数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;environment &lt;span style="color:#960050;background-color:#1e0010"&gt;返回变量&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;值对词典。描述当前的环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;processIdentity &lt;span style="color:#960050;background-color:#1e0010"&gt;返回进程标识&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;processName &lt;span style="color:#960050;background-color:#1e0010"&gt;返回进程名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;globallyUniqueString &lt;span style="color:#960050;background-color:#1e0010"&gt;每次调用该方法都会返回不同的单值字符串，可以用这个字符串生成单值临时文件名&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;hostname &lt;span style="color:#960050;background-color:#1e0010"&gt;返回主机系统的名称&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;operatingSystem &lt;span style="color:#960050;background-color:#1e0010"&gt;返回表示操作系统的数字&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;operatingSystemName &lt;span style="color:#960050;background-color:#1e0010"&gt;返回操作系统名称&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;operatingSystemVersionString &lt;span style="color:#960050;background-color:#1e0010"&gt;返回操作系统当前版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;setProcessName&lt;span style="color:#960050;background-color:#1e0010"&gt;：（&lt;/span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;name &lt;span style="color:#960050;background-color:#1e0010"&gt;将当前进程名称设置为&lt;/span&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NSFileHandle类允许更有效地使用文件。&lt;/p&gt;
&lt;p&gt;可以实现如下功能：&lt;/p&gt;
&lt;p&gt;1、打开一个文件，执行读、写或更新（读写）操作；&lt;/p&gt;
&lt;p&gt;2、在文件中查找指定位置；&lt;/p&gt;
&lt;p&gt;3、从文件中读取特定数目的字节，或将特定数目的字节写入文件中&lt;/p&gt;
&lt;p&gt;另外，NSFileHandle类提供的方法也可以用于各种设备或套接字。一般而言，我们处理文件时都要经历以下三个步骤：&lt;/p&gt;
&lt;p&gt;1、打开文件，获取一个NSFileHandle对象（以便在后面的I/O操作中引用该文件）。&lt;/p&gt;
&lt;p&gt;2、对打开文件执行I/O操作。&lt;/p&gt;
&lt;p&gt;3、关闭文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSFileHandle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileHandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileHandle alloc]init]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fileHandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileHandle fileHandleForReadingAtPath:path]; &lt;span style="color:#75715e"&gt;//打开一个文件准备读取
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fileHandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileHandle fileHandleForWritingAtPath:path]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fileHandle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileHandle fileHandleForUpdatingAtPath:path]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fileData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileHandle availableData]; &lt;span style="color:#75715e"&gt;// 从设备或者通道返回可用的数据 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fileData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fileHandle readDataToEndOfFile]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[fileHandle writeData:fileData]; &lt;span style="color:#75715e"&gt;//将NSData数据写入文件 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[fileHandle closeFile]; &lt;span style="color:#75715e"&gt;//关闭文件 ... ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注：NSFileHandle类没有提供创建文件的功能，所以必须使用NSFileManager来创建文件&lt;/p&gt;
&lt;p&gt;参考：http://blog.csdn.net/zhuzhihai1988/article/details/7904333&lt;/p&gt;</description></item><item><title>iOS中数字的格式化 NSNumberFormatter</title><link>https://zhangdapeng.dev/p/ios-zhong-shu-zi-de-ge-shi-hua-nsnumberformatter/</link><pubDate>Tue, 17 Jun 2025 16:46:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-shu-zi-de-ge-shi-hua-nsnumberformatter/</guid><description>&lt;p&gt;最近搞数据展示，需要将数字展示为用千分号分割的字符串，让我好找呀，结果还是被我找到了。&lt;/p&gt;
&lt;p&gt;在iOS中我们可以通过NSDateFormatter来设置输出NSDate的格式。相比NSDateFormatter的大名鼎鼎，NSNumberFormatter好像知道的人就不多了。其实通过NSNumberFormatter，同样可以设置NSNumber输出的格式。例如如下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSNumberFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;formatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSNumberFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;formatter.numberStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSNumberFormatterDecimalStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;string &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [formatter stringFromNumber:[NSNumber numberWithInt:&lt;span style="color:#ae81ff"&gt;123456789&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Formatted number string:%@&amp;#34;&lt;/span&gt;,string);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果为：&lt;code&gt;[1223:403] Formatted number string:123,456,789&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;其中NSNumberFormatter类有个属性numberStyle，它是一个枚举型，设置不同的值可以输出不同的数字格式。该枚举包括：&lt;br&gt;
&lt;strong&gt;enum {&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;};&lt;/strong&gt;&lt;br&gt;
typedef NSUInteger NSNumberFormatterStyle;&lt;/p&gt;
&lt;p&gt;各个枚举对应输出数字格式的效果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:123456789
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:123,456,789
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:￥123,456,789.00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:-539,222,988%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:1.23456789E8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1243:403&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Formatted number string:一亿二千三百四十五万六千七百八十九
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中第三项和最后一项的输出会根据系统设置的语言区域的不同而不同。&lt;/p&gt;</description></item><item><title>iOS 获取手机的型号，系统版本，软件名称，软件版本</title><link>https://zhangdapeng.dev/p/ios-huo-qu-shou-ji-de-xing-hao-xi-tong-ban-ben-ruan-jian-ming-cheng-ruan-jian-ban-ben/</link><pubDate>Tue, 17 Jun 2025 16:45:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-huo-qu-shou-ji-de-xing-hao-xi-tong-ban-ben-ruan-jian-ming-cheng-ruan-jian-ban-ben/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//手机序列号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; identifierNumber &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] uniqueIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;手机序列号: %@&amp;#34;&lt;/span&gt;,identifierNumber);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//手机别名： 用户定义的名称
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; userPhoneName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] name];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;手机别名: %@&amp;#34;&lt;/span&gt;, userPhoneName);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设备名称
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; deviceName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] systemName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;设备名称: %@&amp;#34;&lt;/span&gt;,deviceName );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//手机系统版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; phoneVersion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] systemVersion];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;手机系统版本: %@&amp;#34;&lt;/span&gt;, phoneVersion);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//手机型号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; phoneModel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] model];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;手机型号: %@&amp;#34;&lt;/span&gt;,phoneModel );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//地方型号 （国际化区域名称）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; localPhoneModel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDevice currentDevice] localizedModel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;国际化区域名称: %@&amp;#34;&lt;/span&gt;,localPhoneModel );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;infoDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] infoDictionary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 当前应用名称
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appCurName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleDisplayName&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;当前应用名称：%@&amp;#34;&lt;/span&gt;,appCurName);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 当前应用软件版本 比如：1.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appCurVersion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleShortVersionString&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;当前应用软件版本:%@&amp;#34;&lt;/span&gt;,appCurVersion);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 当前应用版本号码 int类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appCurVersionNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleVersion&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;当前应用版本号码：%@&amp;#34;&lt;/span&gt;,appCurVersionNum);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入的结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.608 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 手机序列号: ef4dd99784b05114b4d894964599892c00000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.610 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 手机别名: iPhone Simulator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.610 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 设备名称: iPhone OS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.611 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 手机系统版本: 6.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.612 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 手机型号: iPhone Simulator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.612 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 国际化区域名称: iPhone Simulator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.613 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 当前应用名称：寻艺
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.614 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 当前应用软件版本:1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-06-27 18:08:30.614 xx&lt;span style="color:#f92672"&gt;[&lt;/span&gt;21014:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 当前应用版本号码：1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>openURL的使用</title><link>https://zhangdapeng.dev/p/openurl-de-shi-yong/</link><pubDate>Tue, 17 Jun 2025 16:45:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/openurl-de-shi-yong/</guid><description>&lt;p&gt;查资料的时候无意间发现了一个很好玩的：&lt;/p&gt;
&lt;p&gt;代码段：[[UIApplication sharedApplication] openURL:url];&lt;/p&gt;
&lt;p&gt;其中系统的url有：&lt;/p&gt;
&lt;p&gt;1.Map &lt;code&gt;http://maps.google.com/maps?q=Shanghai&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2.Email &lt;code&gt;mailto://myname@google.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3.Tel &lt;code&gt;tel://10086&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;4.Msg &lt;code&gt;sms://10086&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;openMaps&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//打开地图 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt;addressText &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;beijing&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//@&amp;#34;1Infinite Loop, Cupertino, CA 95014&amp;#34;; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addressText &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;urlText &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://maps.google.com/maps?q=%@&amp;#34;&lt;/span&gt;,addressText]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;urlText=============== %@&amp;#34;&lt;/span&gt;, urlText);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;openEmail&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//打开mail // Fire off an email to apple support
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication]openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;mailto://devprograms@apple.com&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;openPhone&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//拨打电话
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Call Google 411
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;tel://10086&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;openSms&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//打开短信
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Text toGoogle SMS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;sms://10086&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;openBrowser&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//打开浏览器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Lanuch any iPhone developers fav site
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://blog.csdn.net/duxinfeng2010&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考资料：http://blog.csdn.net/duxinfeng2010/article/details/8176317&lt;/p&gt;</description></item><item><title>UIToolBar的单独使用-不用自动调整中的位置</title><link>https://zhangdapeng.dev/p/uitoolbar-de-dan-du-shi-yong-bu-yong-zi-dong-tiao-zheng-zhong-de-wei-zhi/</link><pubDate>Tue, 17 Jun 2025 16:45:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitoolbar-de-dan-du-shi-yong-bu-yong-zi-dong-tiao-zheng-zhong-de-wei-zhi/</guid><description>&lt;p&gt;直接上代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// TWFXToolBarViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// DemoToolBar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Lion User on 13-1-19.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 Lion User. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;TWFXToolBarViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TWFXToolBarViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TWFXToolBarViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithNibName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil &lt;span style="color:#a6e22e"&gt;bundle:&lt;/span&gt;(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;// Custom initialization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建toolbar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIToolbar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;toolBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIToolbar alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;420.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40.0f&lt;/span&gt;) ] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建barbuttonitem
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;收藏&amp;#34;&lt;/span&gt; style:UIBarButtonItemStyleBordered target:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(test:)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建barbuttonitem
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:nil] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建一个segmentController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;seg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;牛扒&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;排骨&amp;#34;&lt;/span&gt;, nil] ] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//设置style
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[seg setSegmentedControlStyle:UISegmentedControlSegmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[seg addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(segmentControllerItem:) forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建一个内容是view的uibarbuttonitem
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;itemSeg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] initWithCustomView:seg] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//创建barbuttonitem,样式是flexible,这个种barbuttonitem用于两个barbuttonitem之间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//调整两个item之间的距离.flexible表示距离是动态的,fixed表示是固定的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;flexible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//把item添加到toolbar里
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[toolBar setItems:[NSArray arrayWithObjects:item1,flexible,itemSeg,flexible,item2, nil] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#75715e"&gt;//把toolbar添加到view上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[self.view addSubview:toolBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view from its nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;test:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@ 被选中了&amp;#34;&lt;/span&gt;,item.title];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alertView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;Attention&amp;#34;&lt;/span&gt; message:title delegate:self cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;ok&amp;#34;&lt;/span&gt; otherButtonTitles:nil, nil] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[alertView show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;segmentControllerItem:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;seg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSInteger index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; seg.selectedSegmentIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;message;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (index &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;你选了牛扒&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;你选了排骨&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alertView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;Attenton&amp;#34;&lt;/span&gt; message:message delegate:self cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK&amp;#34;&lt;/span&gt; otherButtonTitles:nil, nil] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[alertView show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;goBack:&lt;/span&gt;(UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self dismissViewControllerAnimated:YES completion:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自己实践测试过了。效果很不错，在我之前做的和现在比的话，关键一点是“&lt;code&gt;[toolBar setItems:[NSArray arrayWithObjects:item1,flexible,itemSeg,flexible,item2, nil] animated:YES];&lt;/code&gt;”这里很重要，使得自己不用去通过CGRectMake来设置。&lt;/p&gt;
&lt;p&gt;也许你有个问题是我想使用UIButton，好的你跟我的想法是一样的，我贴一帖我的代码好了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showEditBar&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建toolbar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect screenRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat toolbarWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat toolbarHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat toolbarMarginBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat toolbarX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (screenRect.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; toolbarWidth) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat toolbarY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (screenRect.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; toolbarMarginBottom &lt;span style="color:#f92672"&gt;-&lt;/span&gt; toolbarHeight) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;44.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;22.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _editToolBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[DeleteToolBar alloc] initWithFrame:CGRectMake(toolbarX, toolbarY, toolbarWidth, toolbarHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _editToolBar.barStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIBarStyleDefault;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _editToolBar.translucent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deleteBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIButton alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, toolbarWidth&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, _editToolBar.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;24.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.layer.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[ColorConfig NavigationColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[ColorConfig NavigationColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleteBar.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [deleteBar setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;删除&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [deleteBar addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(deleteAction:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;deleteBarBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithCustomView:deleteBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建barbuttonitem,样式是flexible,这个种barbuttonitem用于两个barbuttonitem之间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//调整两个item之间的距离.flexible表示距离是动态的,fixed表示是固定的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;flexible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把item添加到toolbar里
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_editToolBar setItems:[NSArray arrayWithObjects:flexible,deleteBarBtn,flexible, nil] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把toolbar添加到view上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:_editToolBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置table的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataTable setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, self.view.frame.size.width, TABLE_VIEW_HEIGHT &lt;span style="color:#f92672"&gt;-&lt;/span&gt; COMPARE_BAR_HEIGHT &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考文章：http://www.cnblogs.com/zouzf/archive/2013/01/19/2867574.html&lt;/p&gt;</description></item><item><title>iOS开发判断网络状态</title><link>https://zhangdapeng.dev/p/ios-kai-fa-pan-duan-wang-luo-zhuang-tai/</link><pubDate>Tue, 17 Jun 2025 15:51:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-pan-duan-wang-luo-zhuang-tai/</guid><description>&lt;p&gt;网站找过关于ISO网络的状态判断，官方也是有示例的，但是自己琢磨了一下，下面的代码还是可以不错的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/***
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;* 此函数用来判断是否网络连接服务器正常
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;* 需要导入Reachability类
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;isExistenceNetwork&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isExistenceNetwork;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Reachability &lt;span style="color:#f92672"&gt;*&lt;/span&gt;reachability &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [Reachability reachabilityWithHostName:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// 测试服务器状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt;([reachability currentReachabilityStatus]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; NotReachable:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isExistenceNetwork &lt;span style="color:#f92672"&gt;=&lt;/span&gt; FALSE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; ReachableViaWWAN:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isExistenceNetwork &lt;span style="color:#f92672"&gt;=&lt;/span&gt; TRUE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; ReachableViaWiFi:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isExistenceNetwork &lt;span style="color:#f92672"&gt;=&lt;/span&gt; TRUE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; isExistenceNetwork;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考文章：http://www.cnblogs.com/pengyingh/articles/2382259.html&lt;/p&gt;</description></item><item><title>自定义UITableViewCell中的button如何实现视图切换</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-zhong-de-button-ru-he-shi-xian-shi-tu-qie-huan/</link><pubDate>Tue, 17 Jun 2025 14:43:53 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell-zhong-de-button-ru-he-shi-xian-shi-tu-qie-huan/</guid><description>&lt;p&gt;问题如题，原理很简单，只要在cell中给对应的button添加操作事件就好了。&lt;/p&gt;
&lt;p&gt;示例代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// navigationTableCell.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-18.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;navigationTableCell&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITableViewCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;directorBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;writerBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;performerBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;otherBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;chancePerformerBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;chanceOtherBtn;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// navigationTableCell.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-18.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;navigationTableCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;navigationTableCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithStyle:&lt;/span&gt;(UITableViewCellStyle)style &lt;span style="color:#a6e22e"&gt;reuseIdentifier:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)reuseIdentifier
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithStyle:style reuseIdentifier:reuseIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelected:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)selected &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelected:selected animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the view for the selected state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;功能实现过程&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(row &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navigationTableCellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;navigationTableCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UINib &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navigationTableCellNib &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UINib nibWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;navigationTableCell&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_dataTable registerNib:navigationTableCellNib forCellReuseIdentifier:navigationTableCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navigationTableCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataTable dequeueReusableCellWithIdentifier:navigationTableCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[navigationTableCell alloc] initWithStyle:UITableViewCellStyleDefault
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:navigationTableCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.directorBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(directorPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.directorBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.writerBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(writerPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.writerBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.performerBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(performerPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.performerBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.otherBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(otherPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.otherBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.chancePerformerBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(chancePerformerPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.chancePerformerBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.chanceOtherBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(chanceOtherPush:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self giveButtonDrawCorner:cell.chanceOtherBtn];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;cellIdentifier&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataTable dequeueReusableCellWithIdentifier:cellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic objectForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,row]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect cellFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cell frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cellFrame.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell setFrame:cellFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS根据地址获取坐标的方法</title><link>https://zhangdapeng.dev/p/ios-gen-ju-di-zhi-huo-qu-zuo-biao-di-fang-fa/</link><pubDate>Tue, 17 Jun 2025 14:43:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-gen-ju-di-zhi-huo-qu-zuo-biao-di-fang-fa/</guid><description>&lt;p&gt;只要地址，中文也可以，英文也可以的&lt;/p&gt;
&lt;p&gt;在使用之前要引入包&lt;strong&gt;CoreLocation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;代码实例如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;oreillyAddress &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;上海&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//测试使用中文也可以找到经纬度具体的可以多尝试看看~
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CLGeocoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myGeocoder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CLGeocoder alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myGeocoder geocodeAddressString:oreillyAddress completionHandler:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;placemarks, NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([placemarks count] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; error &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Found %lu placemark(s).&amp;#34;&lt;/span&gt;, (&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)[placemarks count]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CLPlacemark &lt;span style="color:#f92672"&gt;*&lt;/span&gt;firstPlacemark &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [placemarks objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Longitude = %f&amp;#34;&lt;/span&gt;, firstPlacemark.location.coordinate.longitude);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Latitude = %f&amp;#34;&lt;/span&gt;, firstPlacemark.location.coordinate.latitude);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([placemarks count] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; error &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;Found no placemarks.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (error &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;An error occurred = %@&amp;#34;&lt;/span&gt;, error); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参看文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/bihailantian1988/article/details/7618980" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/bihailantian1988/article/details/7618980&lt;/a&gt;&lt;/p&gt;</description></item><item><title>5款傻瓜式APP开发工具</title><link>https://zhangdapeng.dev/p/5-kuan-sha-gua-shi-app-kai-fa-gong-ju/</link><pubDate>Tue, 17 Jun 2025 14:43:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/5-kuan-sha-gua-shi-app-kai-fa-gong-ju/</guid><description>&lt;h2 id="bizness-apps"&gt;&lt;a class="link" href="#1" &gt;Bizness Apps&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Bizness Apps为中小企业提供了一个快速制作手机App的平台。它目前支持iOS(iPhone、 iPad)及Android平台上的本机App制作。用户完全不需要具备任何编程知识，只要进行按钮勾选及拖拽，就能完成大部分设计工作。建立App时， 首先选择你的App类型。Bizness Apps为每种类型提供了相应的模板，包含了该类型大部分的常见功能，用户只需要进一步在选单中选取你的App需要的功能即可完成本机App的设计。在 App完成后，Bizness Apps会帮你把App上传到他们在iOS和Android应用商店的帐号。&lt;/p&gt;
&lt;h2 id="devmyapp"&gt;&lt;a class="link" href="#2" &gt;DevmyApp&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;一款傻瓜式的iOS应用程序开发软件。有了该应用，您就可以创建、设计和开发自己的iOS应用程序，同时还可避免为一些经常出现的功能模块重复编写代码。&lt;/p&gt;
&lt;h2 id="appsgeyser"&gt;&lt;a class="link" href="#3" &gt;Appsgeyser&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;使用AppsGeyser就可以让任何人都可以做应用程序的开发。 当然，这个程序并不能让你创建下一个愤怒的小鸟或者Foursquare。不过你仅仅想基于Web内容建立一个非常简单的应用程序的 话，AppsGeyser将会是你最佳的选择。AppsGeyser其实非常容易。&lt;/p&gt;
&lt;h2 id="appmakr"&gt;&lt;a class="link" href="#4" &gt;APPMakr&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;它的主要业务是为用户提供一个软件开发平台，让不会编程的用户也可以通过一个功能齐全的DIY工具包来开发手机应用程序。目前，AppMakr平台上的大部分应用主要是针对iOS系统，但针对Android及WP7的应用现在也正不断增长中。&lt;/p&gt;
&lt;h2 id="mobile-roadie"&gt;&lt;a class="link" href="#5" &gt;Mobile Roadie&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Mobile Roadie提供一个应用开发平台，整合YouTube, Brightcove, Flickr, Twitpic, Ustream, Topspin, 谷歌资讯，RSS, Twitter和Facebook。用户可使用该应用平台开发iOS应用和Android应用，并可以使用其提供的内容管理系统更新资讯，也可自行修改应 用细节。Mobile Roadie还提供了数据分析工具。&lt;br&gt;
当然，APP开发工具不仅仅这些，例如：&lt;/p&gt;
&lt;h3 id="专为艺术家打造的swebapps"&gt;&lt;a class="link" href="#5-1" &gt;专为艺术家打造的SwebApps&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;功能：SwebApps提供了一种在线服务，让你即便不知道如何编写代码也可以开发iPhone软件。 专为小公司打造，提供多种可供定制的模板，你还可以使用他们的图片库。&lt;/p&gt;
&lt;h3 id="开发电子书应用利器-ebook-app"&gt;&lt;a class="link" href="#5-2" &gt;开发电子书应用利器 eBook App&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;功能: T用于通过电子书创建软件几乎支持所有格式的文件：PDF, Doc, Zip, CHM, HTML, TXT, FB2, PDB, PRC, Mobi, PDB, MHT, RTF此外用户还可以选择字体和大小，添加图片和注释，锁定横屏或竖屏等&lt;/p&gt;
&lt;h3 id="游戏创意的实现者-gamesalad"&gt;&lt;a class="link" href="#5-3" &gt;游戏创意的实现者 GameSalad&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;功能: 这个下载工具可以让用户无需了解编程或脚本知识就可以开发游戏开发的软件可以发布到网页或iPhone上&lt;/p&gt;
&lt;p&gt;每个都这么简单，但总结就是，好的东西绝对不会这么简单，当他简单的时候，他已经不在是好的&lt;/p&gt;
&lt;p&gt;转自：http://mobile.51cto.com/hot-292923.htm&lt;/p&gt;</description></item><item><title>UITableView 实现异步加载图片</title><link>https://zhangdapeng.dev/p/uitableview-shi-xian-yi-bu-jia-zai-tu-pian/</link><pubDate>Tue, 17 Jun 2025 14:43:34 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitableview-shi-xian-yi-bu-jia-zai-tu-pian/</guid><description>&lt;p&gt;问题描述：&lt;/p&gt;
&lt;p&gt;我在用UITableView的时候，滑动的时候，会出现卡的现象，原因是因为每次滑动的时候都会去远程加载图片，导致了这样的结果。&lt;/p&gt;
&lt;p&gt;解决方案：&lt;/p&gt;
&lt;p&gt;在网上找的时候找到了这样的一个类，名字叫做AsynImageView,下载地址为：http://vdisk.weibo.com/s/GcAN3&lt;/p&gt;
&lt;p&gt;这个类文件就可以解决问题了&lt;/p&gt;
&lt;p&gt;解决问题的过程：&lt;/p&gt;
&lt;p&gt;自定义一个UITableViewCell，我的自定义代码如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;attentionListCell.h&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;AsynImageView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITableViewCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; AsynImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageViewPic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;index;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//编辑操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameEdit&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameNormal&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;attentionListCell.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;attentionListCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithStyle:&lt;/span&gt;(UITableViewCellStyle)style &lt;span style="color:#a6e22e"&gt;reuseIdentifier:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)reuseIdentifier
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithStyle:style reuseIdentifier:reuseIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelected:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)selected &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelected:selected animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the view for the selected state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqual:_listImage])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageViewPic.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listName])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListIndex:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listIndex])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.index.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListRank:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listRank])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;willTransitionToState:&lt;/span&gt;(UITableViewCellStateMask)state{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;ResetFrame&amp;#34;&lt;/span&gt; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:&lt;span style="color:#ae81ff"&gt;0.7&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self cache:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateDefaultMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingEditControlMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingDeleteConfirmationMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameEdit&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameNormal&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.checkImageView setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 重新定义editing的设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setEditing:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)editing &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.editing &lt;span style="color:#f92672"&gt;==&lt;/span&gt; editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super setEditing:editing animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(_checkImageView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;, self.index.frame.origin.y, &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;unselectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_unselect&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:unselectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checkImageView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:_checkImageView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setChecked:_checked];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if(_checkImageView == nil){
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// self.checkImageView = [[UIImageView alloc] initWithFrame:CGRectMake(5.0, self.index.frame.origin.y, 20.0, 20.0)];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *selectedPath = [[NSBundle mainBundle] pathForResource:@&amp;#34;attention_select&amp;#34; ofType:@&amp;#34;png&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// _checkImageView.image = [UIImage imageWithContentsOfFile:selectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// _checkImageView.backgroundColor = [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [self addSubview:_checkImageView];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// } 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (checked)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;selectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_select&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:selectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;unselectedPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention_unselect&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:unselectedPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实现的操作如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionListCellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;attentionListCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UINib &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nib &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UINib nibWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;attentionListCell&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataTable registerNib:nib forCellReuseIdentifier:attentionListCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attentionListCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataTable dequeueReusableCellWithIdentifier:attentionListCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[attentionListCell alloc] initWithStyle:UITableViewCellStyleSubtitle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:attentionListCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic objectForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,row]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//艺人头像
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.imageViewPic.imageURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://xxx.xxxxx.xxx/xxxxx/xxxxxx-%@-zfx.jpg&amp;#34;&lt;/span&gt;,[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;person_id&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.index.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;Vlink指数: %.1f&amp;#34;&lt;/span&gt;,[[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;current_index&amp;#34;&lt;/span&gt;]] doubleValue]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.index.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;排名:%@&amp;#34;&lt;/span&gt;,[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;current_rank&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.rank.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Item&lt;span style="color:#f92672"&gt;*&lt;/span&gt; item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [_items objectAtIndex:row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[cell setChecked:item.isChecked];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考：http://blog.csdn.net/enuola/article/details/8639404&lt;/p&gt;</description></item><item><title>iPhone利用线程实现数据的加载，并展示在table列表中</title><link>https://zhangdapeng.dev/p/iphone-li-yong-xian-cheng-shi-xian-shu-ju-de-jia-zai-bing-zhan-shi-zai-table-lie-biao-zhong/</link><pubDate>Tue, 17 Jun 2025 14:43:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-li-yong-xian-cheng-shi-xian-shu-ju-de-jia-zai-bing-zhan-shi-zai-table-lie-biao-zhong/</guid><description>&lt;p&gt;实现的过程是修改两个table 的controller类，修改方法如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WelcomePavilionViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDelegate,UITableViewDataSource&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实现方法是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import “WelcomePavilionViewController.h”
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import “XmlWelcome.h”
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WelcomePavilionViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; array,tableView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self.array count]&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[NSThread detachNewThreadSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(myTaskMethod) toTarget:self withObject:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;myTaskMethod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSAutoreleasePool &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSAutoreleasePool alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	XmlWelcome &lt;span style="color:#f92672"&gt;*&lt;/span&gt;parser&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[XmlWelcome alloc]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	initWithContentsOfURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://mp.myvsp.cn/welcomedemos/getpavilionxml.json?area=a&amp;amp;width=80&amp;amp;height=80&amp;amp;digest_length=20&amp;#34;&lt;/span&gt; ]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//设置代理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[parser setDelegate:parser];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[parser parse];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.array&lt;span style="color:#f92672"&gt;=&lt;/span&gt;parser.ones;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.tableView reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[parser &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[pool &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Releases the view if it doesn’t have a superview.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Release any cached data, images, etc that aren’t in use.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidUnload&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.array&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	self.tableView&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.tableView &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.array &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSInteger)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [array count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITableViewCell&lt;span style="color:#f92672"&gt;*&lt;/span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;tag&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cell&lt;span style="color:#f92672"&gt;==&lt;/span&gt;nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		reuseIdentifier:@&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;tag&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//表格设计
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt; one &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [one objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cell.detailTextLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [one objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;content&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [one objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;image&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSData dataWithContentsOfURL:url];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImage alloc] initWithData:data cache:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cell.image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;image;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[image &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;titleForHeaderInSection:&lt;/span&gt;(NSInteger)section
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; @&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;Hobby Information:&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里总结一下，关键的总结点是这里&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self.array count]&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[NSThread detachNewThreadSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(myTaskMethod) toTarget:self withObject:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后再在自己的调用方法里面调用**&lt;code&gt;[self.tableView reloadData];&lt;/code&gt;这个方法**&lt;/p&gt;</description></item><item><title>iOS开发的异常-bool _WebTryThreadLock(bool)</title><link>https://zhangdapeng.dev/p/ios-kai-fa-de-yi-chang-bool-webtrythreadlockbool/</link><pubDate>Tue, 17 Jun 2025 14:43:26 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-de-yi-chang-bool-webtrythreadlockbool/</guid><description>&lt;p&gt;一般的问题是这样的&lt;/p&gt;
&lt;p&gt;“&lt;code&gt;bool _WebTryThreadLock(bool)&lt;/code&gt;, 0xxxxxx: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now&amp;hellip;”&lt;/p&gt;
&lt;p&gt;原因: update ui in background thread.&lt;/p&gt;
&lt;p&gt;解决办法: update ui in main thread.&lt;/p&gt;
&lt;p&gt;示例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;), &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do time-consuming task in background thread
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Return back to main thread to update UI
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dispatch_sync(dispatch_get_main_queue(), &lt;span style="color:#f92672"&gt;^&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITextView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_profile setFrame:CGRectMake(labelPersonProfileCaption.frame.origin.x, labelPersonProfileCaption.frame.origin.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; labelPersonProfileCaption.frame.size.height, width, height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor lightGrayColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.editable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _profile.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_contentScroll addSubview:_profile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考资料：http://blog.csdn.net/chuwachen/article/details/8718253&lt;/p&gt;</description></item><item><title>使用Paros监控iPhone发出的HTTP请求</title><link>https://zhangdapeng.dev/p/shi-yong-paros-jian-kong-iphone-fa-chu-de-http-qing-qiu/</link><pubDate>Tue, 17 Jun 2025 14:43:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-yong-paros-jian-kong-iphone-fa-chu-de-http-qing-qiu/</guid><description>&lt;p&gt;电脑上的许多软件可以监控浏览器发出的HTTP请求, iPhone上有许多连网程序但没有自带软件可以实现监控, 为了方便测试这些请求是否正确而省去在程序中记录请求日志并逐一查找的麻烦, 可以利用Paros这个监控软件来实现.&lt;/p&gt;
&lt;p&gt;以下是实现在Mac上监控iPhone发出的HTTP请求的具体步骤:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;查看无线局域网IP:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;davidzhang@davidzhang:~/Downloads/tools$ ifconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;安装Paros&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下载安装直接运行可执行文件即可，有两个文件，一个是.bat文件，一个是.sh文件，可以根据自己系统的环境不同运行不同的文件&lt;/p&gt;
&lt;p&gt;下载地址1：http://sourceforge.net/projects/paros/&lt;/p&gt;
&lt;p&gt;下载地址2：http://vdisk.weibo.com/s/G6wyY&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;设置Paros本地代理:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Paros-&amp;gt;Tools-&amp;gt;Options-&amp;gt;Local proxy, Address填上”169.254.242.107″, 端口默认为8080&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;设置iPhone上网代理:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;iPhone上: 设置-&amp;gt;WiFi找到链接的网络-&amp;gt;下拉找到HTTP代理-&amp;gt;-&amp;gt;手动-&amp;gt;服务器填”169.254.242.107″, 端口填”8080″&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;查看HTTP请求:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;iPhone打开访问任何连网程序, 可以在Paros的Sites下看到访问的网站, 右边可以选Reques/Response等信息.&lt;/p&gt;</description></item><item><title>iPhone 设置代理上网</title><link>https://zhangdapeng.dev/p/iphone-she-zhi-dai-li-shang-wang/</link><pubDate>Tue, 17 Jun 2025 12:01:16 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-she-zhi-dai-li-shang-wang/</guid><description>&lt;p&gt;一开始不知如何在iphone里设置代理，网上说的大部分都是设置vpn的并不是代理设置。功夫不负有心人，在换了不同的关键字查找，终于找到设置方法了！其实很简单，步骤如下：&lt;br&gt;
1,连上wifi&lt;/p&gt;
&lt;p&gt;2,在 设置=&amp;gt;Wi-Fi=&amp;gt;你连上的网络右边的小箭头 然后往下拉有http代理设置这一栏，选择手动，然后输入你的代理服务器地址或者域名以及端口！&lt;/p&gt;</description></item><item><title>iOS中正则表达式的使用</title><link>https://zhangdapeng.dev/p/ios-zhong-zheng-ze-biao-da-shi-de-shi-yong/</link><pubDate>Tue, 17 Jun 2025 12:01:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-zheng-ze-biao-da-shi-de-shi-yong/</guid><description>&lt;p&gt;匹配9-15个由字母/数字组成的字符串的正则表达式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; regex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;^[A-Za-z0-9]{9,15}$&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pred &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;SELF MATCHES %@&amp;#34;&lt;/span&gt;, regex];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; isMatch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [pred evaluateWithObject:txtfldPhoneNumber.text];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cocoa用NSPredicate描述查询的方式，原理类似于在数据库中进行查询&lt;/p&gt;
&lt;p&gt;用BETWEEN，IN，BEGINWITH，ENDWITH，CONTAINS，LIKE这些谓词来构造NSPredicate，必要的时候使用SELF直接对自己进行匹配&lt;br&gt;
基本的查询&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicate; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name == &amp;#39;Herbie&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [predicate evaluateWithObject: car]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%s&amp;#34;&lt;/span&gt;, (match) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;YES&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;NO&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//在整个cars里面循环比较 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;engine.horsepower &amp;gt; 150&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [garage cars]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (Car &lt;span style="color:#f92672"&gt;*&lt;/span&gt;car &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; [garage cars]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([predicate evaluateWithObject: car]) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, car.name); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出完整的信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;engine.horsepower &amp;gt; 150&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;results; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//含有变量的谓词 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSPredicate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;predicateTemplate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;name == $NAME&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;varDict; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;varDict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys: &lt;span style="color:#e6db74"&gt;@&amp;#34;Herbie&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;@&amp;#34;NAME&amp;#34;&lt;/span&gt;, nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [predicateTemplate predicateWithSubstitutionVariables: varDict]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;SNORGLE: %@&amp;#34;&lt;/span&gt;, predicate); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;match &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [predicate evaluateWithObject: car]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%s&amp;#34;&lt;/span&gt;, (match) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;YES&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;NO&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意不能使用$VARIABLE作为路径名，因为它值代表值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//谓词字符串还支持c语言中一些常用的运算符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;(engine.horsepower &amp;gt; 50) AND (engine.horsepower &amp;lt; 200)&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;oop %@&amp;#34;&lt;/span&gt;, results); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name &amp;lt; &amp;#39;Newton&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, [results valueForKey: &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//强大的数组运算符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;engine.horsepower BETWEEN { 50, 200 }&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;betweens &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[NSNumber numberWithInt: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;], [NSNumber numberWithInt: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;], nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;engine.horsepower BETWEEN %@&amp;#34;&lt;/span&gt;, betweens]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicateTemplate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;engine.horsepower BETWEEN $POWERS&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;varDict &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithObjectsAndKeys: betweens, &lt;span style="color:#e6db74"&gt;@&amp;#34;POWERS&amp;#34;&lt;/span&gt;, nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [predicateTemplate predicateWithSubstitutionVariables: varDict]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//IN运算符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name IN { &amp;#39;Herbie&amp;#39;, &amp;#39;Snugs&amp;#39;, &amp;#39;Badger&amp;#39;, &amp;#39;Flap&amp;#39; }&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, [results valueForKey: &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;SELF.name IN { &amp;#39;Herbie&amp;#39;, &amp;#39;Snugs&amp;#39;, &amp;#39;Badger&amp;#39;, &amp;#39;Flap&amp;#39; }&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, [results valueForKey: &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;names &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars valueForKey: &lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;SELF IN { &amp;#39;Herbie&amp;#39;, &amp;#39;Snugs&amp;#39;, &amp;#39;Badger&amp;#39;, &amp;#39;Flap&amp;#39; }&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [names filteredArrayUsingPredicate: predicate];&lt;span style="color:#75715e"&gt;//这里限制了SELF的范围 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//BEGINSWITH,ENDSWITH,CONTAINS 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//附加符号，[c],[d],[cd],c表示不区分大小写，d表示不区分发音字符，cd表示什么都不区分 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name BEGINSWITH &amp;#39;Bad&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name BEGINSWITH &amp;#39;HERB&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name BEGINSWITH[cd] &amp;#39;HERB&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LIKE运算符（通配符）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name LIKE[cd] &amp;#39;*er*&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSPredicate predicateWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;name LIKE[cd] &amp;#39;???er*&amp;#39;&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cars filteredArrayUsingPredicate: predicate]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, results);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考资料：http://www.2cto.com/kf/201208/150608.html&lt;/p&gt;</description></item><item><title>iOS开发网络加载图片缓存策略(ASIDownloadCache缓存策略)</title><link>https://zhangdapeng.dev/p/ios-kai-fa-wang-luo-jia-zai-tu-pian-huan-cun-ce-lve-asidownloadcache-huan-cun-ce-lve/</link><pubDate>Tue, 17 Jun 2025 12:01:09 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-wang-luo-jia-zai-tu-pian-huan-cun-ce-lve-asidownloadcache-huan-cun-ce-lve/</guid><description>&lt;p&gt;很多情况需要从网络上加载图片，然后将图片在imageview中显示出来，但每次都要从网络上请求，会严重影响用户体验，为了不是每次显示都需要从网上下载数据，希望将图片放到本地缓存，因此我们需要一个好的的缓存策略，今天我将我在项目工程中的实际经验分享给大家，我这里主要介绍一下强大的ASIHTTPRequest的缓存策略，以及使用方法：&lt;/p&gt;
&lt;p&gt;下面是具体步骤：&lt;br&gt;
一、设置缓存策略&lt;br&gt;
首先在SplitDemoAppDelegate委托代理中，实现如下代码：&lt;br&gt;
在SplitDemoAppDelegate.h文件中，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ASIDownloadCache&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SplitDemoAppDelegate&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIApplicationDelegate,UITabBarControllerDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIWindow &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_window;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ASIDownloadCache&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_downloadCache; &lt;span style="color:#75715e"&gt;//下载缓存策略
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) ASIDownloadCache&lt;span style="color:#f92672"&gt;*&lt;/span&gt;downloadCache;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在SplitDemoAppDelegate.m文件中，代码如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SplitDemoAppDelegate.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SplitDemoAppDelegate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; window&lt;span style="color:#f92672"&gt;=&lt;/span&gt;_window;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; downloadCache &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _downloadCache;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化ASIDownloadCache缓存对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ASIDownloadCache &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cache &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[ASIDownloadCache alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.downloadCache &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cache;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cache &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt;NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置缓存存放路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.downloadCache setStoragePath:[documentDirectorystringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;resource&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置缓存策略
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.downloadCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Override point for customization after application launch.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_window &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_downloadCache &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;二、创建缓存线程&lt;/p&gt;
&lt;p&gt;这一步是创建一个NSOperation类，实现缓存的方法，代码如下：&lt;/p&gt;
&lt;p&gt;ResourceContainer.h文件实现&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ASIHTTPRequest.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;SplitDemoAppDelegate.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ResourceContainer&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSOperation&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_resourceURL; &lt;span style="color:#75715e"&gt;//资源请求url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSObject&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_hostObject; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SEL_resourceDidReceive; &lt;span style="color:#75715e"&gt;//资源接手响应方法 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SplitDemoAppDelegate&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_appDelegate; &lt;span style="color:#75715e"&gt;//应用委托对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ASIHTTPRequest&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_httpRequest; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;_imageView; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSURL&lt;span style="color:#f92672"&gt;*&lt;/span&gt;resourceURL;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSObject&lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostObject;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt;) SELresourceDidReceive;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt;) SplitDemoAppDelegate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appDelegate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) ASIHTTPRequest&lt;span style="color:#f92672"&gt;*&lt;/span&gt;httpRequest;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) UIImageView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//http请求回调方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didStartHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didFinishHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didFailedHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取消资源请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;cancelReourceGet&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//资源接收回调方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;resourceDidReceive:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)resource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ResourceContainer.m文件实现：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ResourceContainer.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;HttpConstant.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ASIDownloadCache.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ResourceContainer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; resourceURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _resourceURL;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; hostObject &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _hostObject;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; resourceDidReceive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _resourceDidReceive;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; appDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _appDelegate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; httpRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _httpRequest;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;init&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [super init]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.appDelegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (SplitDemoAppDelegate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[[UIApplication sharedApplication] delegate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.hostObject &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.resourceURL &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resourceDidReceive:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ASIHTTPRequest requestWithURL:self.resourceURL]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.httpRequest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; request;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest setDownloadCache:self.appDelegate.downloadCache];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest setDidStartSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(didStartHttpRequest:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest setDidFinishSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(didFinishHttpRequest:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest setDidFailSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(didFailedHttpRequest:)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//发异步请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest startAsynchronous];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_resourceURL &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_hostObject &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_httpRequest &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_imageView &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//开始请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didStartHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//请求成功返回处理结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didFinishHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([request responseStatusCode] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; [request responseStatusCode] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;304&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//判断是否来自缓存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([request didUseCachedResponse]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;=========资源请求：%@ 来自缓存============&amp;#34;&lt;/span&gt;,[self.resourceURL absoluteURL]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;=========资源请求：图片不来自缓存============&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resourceDidReceive:[request responseData]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resourceDidReceive:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//失败请求返回处理结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didFailedHttpRequest:&lt;/span&gt;(ASIHTTPRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)request{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resourceDidReceive:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取消资源请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;cancelReourceGet&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.httpRequest cancel];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//资源接收处理方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;resourceDidReceive:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)resource{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.hostObject respondsToSelector:self.resourceDidReceive]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(resource &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; self.imageView &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithData:resource];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.hostObject performSelectorOnMainThread:self.resourceDidReceive withObject:self.imageViewwaitUntilDone:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到第二步，我们的缓存策略的设置，以及资源请求和接收数据方法已经构建完毕，下面介绍一下如何使用我们上面创建的NSOperation类&lt;br&gt;
三、图片请求（利用上面创建的类）&lt;br&gt;
这里以我的工程为例进行分析：&lt;br&gt;
在DetailViewController.h声明文件中:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailViewController&lt;/span&gt; :&lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_imageURL; &lt;span style="color:#75715e"&gt;//图片url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_originalIndexArray; &lt;span style="color:#75715e"&gt;//保存请求图片的号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_originalOperationDic; &lt;span style="color:#75715e"&gt;//保存图片请求队列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSOperationQueue &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_requestImageQueue; &lt;span style="color:#75715e"&gt;//图片请求队列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageURL;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;originalIndexArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;originalOperationDic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) NSOperationQueue &lt;span style="color:#f92672"&gt;*&lt;/span&gt; requestImageQueue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//显示图片信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayProductImage&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//根据图片序号显示请求图片资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayImageByIndex:&lt;/span&gt;(NSInteger)index &lt;span style="color:#a6e22e"&gt;ByImageURL:&lt;/span&gt;(NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)url;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//处理图片请求返回信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;imageDidReceive:&lt;/span&gt;(UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在DetailViewController.m实现文件中:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ProductDetailViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//这里引入在第二步中，我们创建的对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;ResourceContainer.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; imageURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _imageURL;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; originalIndexArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _originalIndexArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; originalOperationDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _originalOperationDic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; requestImageQueue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _requestImageQueue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSOperationQueue &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempQueue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSOperationQueue alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.requsetImageQueue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tempQueue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tempQueue &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalIndexArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; array;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [array &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalOperationDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//显示图片信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;displayProductImage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://xxx.xxx.xxx.xxx&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//这个是从器返回有图片数目，self.xxxx根据具体的场合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; imageCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.xxxx.imageNum intValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;imageCount; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;这里是拼图片请求url，根据实际需求&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [url URLByAppendingPathComponent:str1];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//根据图片号请求资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self displayImageByIndex:i ByImageURL:self.productImageURL];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//根据图片序号显示请求图片资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;displayImageByIndex:&lt;/span&gt;(NSInteger)index &lt;span style="color:#a6e22e"&gt;ByImageURL:&lt;/span&gt;(NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;indexForString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,index];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//若数组中已经存在该图片编号，说明图片加载完毕，直接返回
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([self.originalIndexArray containsObject:indexForString]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建UIImageView对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; index;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建资源请求对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResourceContainer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageOperation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[ResourceContainer alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageOperation.resourceURL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; url;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageOperation.hostObject &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置收到图片信息处理理方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageOperation.resourceDidReceive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(imageDidReceive:);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageOperation.imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; imageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageView &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将图片请求对象加入图片请求队列中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.requsetImageQueue addOperation:imageOperation];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.originalOperationDic setObject:imageOperation forKey:indexForString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageOperation &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//处理图片请求返回信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;imageDidReceive:&lt;/span&gt;(UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)imageView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (imageView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil&lt;span style="color:#f92672"&gt;||&lt;/span&gt;imageView.image &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;no-pic-300-250.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将图片信息加载到前台，self.openFlowView是我用的coverFlow，coverFlow的使用方法网上很多，自己找吧
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.openFlowView setImage:imageView.image forIndex:imageView.tag];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.originalIndexArray addObject:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,imageView.tag]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.originalOperationDic removeObjectForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,imageView.tag]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_requestImageQueue &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_originalIndexArray &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_originalOperationDic &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_imageURL &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;经过上述步骤，我们实现了加载网络图片时缓存功能，增强了用户体验效果。&lt;br&gt;
参考:http://www.cnblogs.com/pengyingh/articles/2343061.html&lt;/p&gt;</description></item><item><title>UISearchBar 失去焦点 CancelButton失去功能的 解决办法</title><link>https://zhangdapeng.dev/p/uisearchbar-shi-qu-jiao-dian-cancelbutton-shi-qu-gong-neng-de-jie-jue-ban-fa/</link><pubDate>Tue, 17 Jun 2025 12:01:05 +0000</pubDate><guid>https://zhangdapeng.dev/p/uisearchbar-shi-qu-jiao-dian-cancelbutton-shi-qu-gong-neng-de-jie-jue-ban-fa/</guid><description>&lt;p&gt;首先要知道你是如何处理使得UISearchBar失去焦点的，那么我的办法一会你可以看一下，同时还有一个问题解决，就是如何是的CancelButton不失去操作的功能：&lt;/p&gt;
&lt;p&gt;代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;scrollViewWillBeginDecelerating:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personSearch resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.personSearch.showsCancelButton&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; control &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; [self.personSearch subviews])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([control isKindOfClass:[UIButton &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt; btn &lt;span style="color:#f92672"&gt;=&lt;/span&gt;(UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)control;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btn setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;取消&amp;#34;&lt;/span&gt; forState:UIControlStateNormal ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btn.enabled&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>根据url地址显示图片的方法</title><link>https://zhangdapeng.dev/p/gen-ju-url-di-zhi-xian-shi-tu-pian-de-fang-fa/</link><pubDate>Tue, 17 Jun 2025 11:59:57 +0000</pubDate><guid>https://zhangdapeng.dev/p/gen-ju-url-di-zhi-xian-shi-tu-pian-de-fang-fa/</guid><description>&lt;p&gt;虽然说这样的效率不好，但是既然有这样的方式就有这种方式存在的道理&lt;/p&gt;
&lt;p&gt;我记录一下其实现方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.imageViewPic.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;personpanel-%@-zfx.jpg&amp;#34;&lt;/span&gt;,[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;person_id&amp;#34;&lt;/span&gt;]] relativeToURL:[NSURL URLWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://xxxx.xxxx.xxxxx/xxxx/&amp;#34;&lt;/span&gt;]]]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cell.imageViewPic是一个实例化的UIImageview&lt;/p&gt;</description></item><item><title>iOS RegexKitLite 正则匹配 提取匹配的内容</title><link>https://zhangdapeng.dev/p/ios-regexkitlite-zheng-ze-pi-pei-ti-qu-pi-pei-de-nei-rong/</link><pubDate>Tue, 17 Jun 2025 11:59:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-regexkitlite-zheng-ze-pi-pei-ti-qu-pi-pei-de-nei-rong/</guid><description>&lt;p&gt;使用RegexKitLite正则表达式需要以下工作：&lt;br&gt;
1.RegexKitLite官方网址（内含使用教程）：http://regexkit.sourceforge.net/RegexKitLite&lt;br&gt;
2.下载地址：http://downloads.sourceforge.net/regexkit/RegexKitLite-4.0.tar.bz2&lt;br&gt;
3.将RegexKitLite.h和RegexKitLite.m引入到工程中。&lt;br&gt;
4.引入&amp;quot;libicucore.dylib&amp;quot;框架&lt;br&gt;
5.需要在处理的类中导入&amp;quot;RegexKitLite.h&amp;quot;&lt;/p&gt;
&lt;p&gt;言归正传，用正则表达式提取匹配的内容（此例子中讲述匹配字符串中的手机号码）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;15200000000,1234,12012345678,13400000000&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 要提取的字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;regexString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;b(13|15|18)([0-9]{9})&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;b&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 手机号码的正则表达式（由于15和18号段的不太熟悉，索性就干脆都算上了，你懂的。）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;matchArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [searchString componentsMatchedByRegex:regexString]; &lt;span style="color:#75715e"&gt;// 匹配结果以数组形式返回
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,matchArray); &lt;span style="color:#75715e"&gt;// 进行输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,matchArray);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2011-08-23 14:39:23.356 ZQRegex&lt;span style="color:#f92672"&gt;[&lt;/span&gt;6726:207&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 15200000000,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;13400000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UIButton的image和title位置设置</title><link>https://zhangdapeng.dev/p/uibutton-de-image-he-title-wei-zhi-she-zhi/</link><pubDate>Tue, 17 Jun 2025 11:59:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/uibutton-de-image-he-title-wei-zhi-she-zhi/</guid><description>&lt;p&gt;通过setTitle和titleEdgeInsets，setImage和imageEdgeInsets，能够实现title和image位置的变化&lt;/p&gt;
&lt;p&gt;具体的代码我以实现title的位置变化为例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;addButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addButton.layer.borderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColor whiteColor] CGColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addButton.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addButton.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addButton.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;54.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;addButton.titleLabel.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[addButton sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[addButton setTitleEdgeInsets:UIEdgeInsetsMake(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[addButton setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[addButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;+&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[addButton addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(addAction:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UITableView下拉刷新功能，完成</title><link>https://zhangdapeng.dev/p/uitableview-xia-la-shua-xin-gong-neng-wan-cheng/</link><pubDate>Tue, 17 Jun 2025 11:59:46 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitableview-xia-la-shua-xin-gong-neng-wan-cheng/</guid><description>&lt;p&gt;看了几个实例，最终解决了这个问题，之间为什么老是有问题没有解决呢，原因我觉得是跟ARC有关，因为我的应用是使用ARC的然后将下载回来的代码进行了调整，将release的代码段去掉了。结果有了一些问题，也不是很了解具体是哪里。目前问题解决了，里面使用了关于ARC机制和非ARC机制共存的办法,详细的内容可以参考我的这篇文章&lt;a class="link" href="http://gowhich.com/blog/191" target="_blank" rel="noopener"
 &gt;iOS 开发，工程中混合使用 ARC 和非ARC&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;代码段贴一下好了：&lt;/p&gt;
&lt;p&gt;EGOTableViewPullRefresh的下载地址：&lt;a class="link" href="http://vdisk.weibo.com/s/FtH88" target="_blank" rel="noopener"
 &gt;http://vdisk.weibo.com/s/FtH88&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;indexViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// indexViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-8.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 walkerfree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;EGORefreshTableHeaderView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indexViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, EGORefreshTableHeaderDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EGORefreshTableHeaderView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_refreshHeaderView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; _reloading;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personSearch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataTable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataDic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;initPersonIndexListData&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;indexViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// indexViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-8.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 walkerfree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;indexViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;personIndexTrendViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;listCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indexViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indexViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; personSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _personSearch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; dataTable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _dataTable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; dataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _dataDic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self initPersonIndexListData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (_refreshHeaderView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化下拉刷新控件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _refreshHeaderView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[EGORefreshTableHeaderView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _refreshHeaderView.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将下拉刷新控件作为子控件添加到UITableView中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataTable addSubview:_refreshHeaderView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_refreshHeaderView refreshLastUpdatedDate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;startLoadingTableViewData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self initPersonIndexListData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _reloading &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;endLoadingTableViewData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _reloading &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.dataTable];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;done&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark UIScrollViewDelegate Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;scrollViewDidScroll:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;scrollViewDidEndDragging:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView &lt;span style="color:#a6e22e"&gt;willDecelerate:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)decelerate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;scrollViewDidEndScrollingAnimation:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark EGORefreshTableHeaderDelegate Methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;egoRefreshTableHeaderDidTriggerRefresh:&lt;/span&gt;(EGORefreshTableHeaderView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self startLoadingTableViewData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(endLoadingTableViewData) withObject:nil afterDelay:&lt;span style="color:#ae81ff"&gt;3.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;egoRefreshTableHeaderDataSourceIsLoading:&lt;/span&gt;(EGORefreshTableHeaderView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; _reloading;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;egoRefreshTableHeaderDataSourceLastUpdated:&lt;/span&gt;(EGORefreshTableHeaderView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)view
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillDisappear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnBarItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returnBarItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnBarItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma UITableView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self.dataDic count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger) &lt;span style="color:#a6e22e"&gt;numberOfSectionsInTableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listCellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;listCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UINib &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nib &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UINib nibWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;listCell&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataTable registerNib:nib forCellReuseIdentifier:listCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:listCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[listCell alloc]initWithStyle:UITableViewCellStyleDefault
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:listCellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic objectForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,[indexPath row]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personRank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,[indexPath row] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personName.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personIndex.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;艺人新媒体指数 %0.2f&amp;#34;&lt;/span&gt;,[[dic valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;score&amp;#34;&lt;/span&gt;] floatValue]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personIndex.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;14.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personIndex.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%u&amp;#34;&lt;/span&gt;,[indexPath row]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personRank.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personRank.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%u&amp;#34;&lt;/span&gt;,[indexPath row]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personRank.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%u&amp;#34;&lt;/span&gt;,[indexPath row]] isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;2&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.personRank.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;didSelectRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic valueForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%u&amp;#34;&lt;/span&gt;,[indexPath row]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; personIndexTrendViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;trend &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[personIndexTrendViewController alloc] initWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;personIndexTrendViewController&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trend.personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dic mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController pushViewController:trend animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma UISearchBar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma 自定义函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initPersonIndexListData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;加载数据&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;date &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter stringFromDate: [NSDate dateWithTimeInterval:&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;) sinceDate:date]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;urlString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;http://XXXXXXXXX.XXX.XXX.XXX?&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:urlString];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestUseProtocolCachePolicy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLResponse alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receiveDataError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRequest:request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;receiveDataError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(receivedData &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;获取数据失败&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:receivedData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personInfo objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;list&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithCapacity:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([personList isKindOfClass:[NSMutableArray &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; personList) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataDic setObject:dic forKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([personList isKindOfClass:[NSMutableDictionary &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;NSMutableDictionary 类&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.dataDic count] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 开发，工程中混合使用 ARC 和非ARC</title><link>https://zhangdapeng.dev/p/ios-kai-fa-gong-cheng-zhong-hun-he-shi-yong-arc-he-fei-arc/</link><pubDate>Tue, 17 Jun 2025 11:59:43 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-gong-cheng-zhong-hun-he-shi-yong-arc-he-fei-arc/</guid><description>&lt;p&gt;问题是这样的：&lt;/p&gt;
&lt;p&gt;在项目开发过程中我们通常会用到第三方提供的源代码，麻烦的是有些开源项目用的是 ARC，有的用的是非 ARC。&lt;br&gt;
我在使用 SVProgressHUD 做等待视图时遇到问题，最终发现该项目使用的是 ARC 模式，而我的工程使用的是非 ARC 模式。&lt;/p&gt;
&lt;p&gt;解决方法是这样的：&lt;/p&gt;
&lt;p&gt;Xcode 项目中我们可以使用 ARC 和非 ARC 的混合模式。&lt;br&gt;
如果你的项目使用的非 ARC 模式，则为 ARC 模式的代码文件加入 &lt;code&gt;-fobjc-arc&lt;/code&gt; 标签。&lt;br&gt;
如果你的项目使用的是 ARC 模式，则为非 ARC 模式的代码文件加入 &lt;code&gt;-fno-objc-arc&lt;/code&gt; 标签。&lt;br&gt;
添加标签的方法：&lt;br&gt;
1，打开：你的target -&amp;gt; Build Phases -&amp;gt; Compile Sources.&lt;br&gt;
2，双击对应的 *.m 文件&lt;br&gt;
3，在弹出窗口中输入上面提到的标签 -fobjc-arc / -fno-objc-arc&lt;br&gt;
4，点击 done 保存&lt;/p&gt;
&lt;p&gt;参考：http://blog.csdn.net/fangzhangsc2006/article/details/8049765#reply&lt;/p&gt;</description></item><item><title>关于scrollView下拉自动刷洗的 操作方法（待续）</title><link>https://zhangdapeng.dev/p/guan-yu-scrollview-xia-la-zi-dong-shua-xi-de-cao-zuo-fang-fa-dai-xu/</link><pubDate>Mon, 16 Jun 2025 14:38:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/guan-yu-scrollview-xia-la-zi-dong-shua-xi-de-cao-zuo-fang-fa-dai-xu/</guid><description>&lt;p&gt;关于scrollView下拉自动刷洗的 操作方法，这个我最近由于做应用需要用到，找了几个版本的示例，自己根据原理试着自己做了一个，还是有点问题，先贴到这里，有时间再看看&lt;/p&gt;
&lt;p&gt;testRefreshViewViewController.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// testRefreshViewViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// testRefreshView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-11.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 walkerfree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;RefreshView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testRefreshViewViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RefreshViewDelegate, UIScrollViewDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scrollView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RefreshView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;refreshView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scrollView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;testRefreshViewViewController.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// testRefreshViewViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// testRefreshView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-6-11.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 walkerfree. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;testRefreshViewViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testRefreshViewViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testRefreshViewViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; scrollView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _scrollView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma RefreshView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;startLoading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView startLoading];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//模拟3秒钟后停止
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(stopLoading) withObject:nil afterDelay:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;stopLoading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView stopLoading];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;refresh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self startLoading];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//刚拖动的时候
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;scrollViewWillBeginDragging:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView scrollViewWillBeginDragging:scrollView_];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//拖动过程中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;scrollViewDidScroll:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView scrollViewDidScroll:scrollView_];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//拖动结束后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;scrollViewDidEndDragging:&lt;/span&gt;(UIScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)scrollView_ &lt;span style="color:#a6e22e"&gt;willDecelerate:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)decelerate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;here&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView scrollViewDidEndDragging:scrollView_ willDecelerate:decelerate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - RefreshViewDelegate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;refreshViewDidCallBack&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self refresh];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nils &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] loadNibNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;RefreshView&amp;#34;&lt;/span&gt; owner:self options:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; refreshView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [nils objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _scrollView.contentSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;460&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _scrollView.contentInset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIEdgeInsetsMake(REFRESH_HEADER_HEIGHT, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// _scrollView.backgroundColor = [UIColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [refreshView setupWithOwner:_scrollView delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self refresh];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(void) start
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面有个文件是：&lt;/p&gt;
&lt;p&gt;RefreshView.h&lt;/p&gt;
&lt;p&gt;这个文件来自于cocoachina，地址：&lt;del&gt;&lt;a class="link" href="http://www.cocoachina.com/bbs/read.php?tid=90232&amp;amp;fpage=3" target="_blank" rel="noopener"
 &gt;http://www.cocoachina.com/bbs/read.php?tid=90232&amp;fpage=3&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;需要的可以自己去下载一下&lt;/p&gt;</description></item><item><title>iOS 获取文件的目录路径的几种方法</title><link>https://zhangdapeng.dev/p/ios-huo-qu-wen-jian-de-mu-lu-lu-jing-de-ji-zhong-fang-fa/</link><pubDate>Mon, 16 Jun 2025 14:38:14 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-huo-qu-wen-jian-de-mu-lu-lu-jing-de-ji-zhong-fang-fa/</guid><description>&lt;p&gt;iphone沙箱模型的有四个文件夹，分别是什么，永久数据存储一般放在什么位置，得到模拟器的路径的简单方式是什么.&lt;br&gt;
documents，tmp，app，Library。&lt;br&gt;
(NSHomeDirectory())手动保存的文件在documents文件里&lt;br&gt;
Nsuserdefaults保存的文件在tmp文件夹里&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documents 目录：您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。&lt;/li&gt;
&lt;li&gt;AppName.app 目录：这是应用程序的程序包目录，包含应用程序的本身。由于应用程序必须经过签名，所以您在运行时不能对这个目录中的内容进行修改，否则可能会使应用程序无法启动。&lt;/li&gt;
&lt;li&gt;Library 目录：这个目录下有两个子目录：Caches 和 Preferences&lt;br&gt;
Preferences 目录：包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件，而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.&lt;br&gt;
Caches 目录：用于存放应用程序专用的支持文件，保存应用程序再次启动过程中需要的信息。&lt;/li&gt;
&lt;li&gt;tmp 目录：这个目录用于存放临时文件，保存应用程序再次启动过程中不需要的信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;获取这些目录路径的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;获取家目录路径的函数：&lt;br&gt;
&lt;code&gt;NSString *homeDir = NSHomeDirectory();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取Documents目录路径的方法：&lt;br&gt;
&lt;code&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;NSString *docDir = [paths objectAtIndex:0];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取Caches目录路径的方法：&lt;br&gt;
&lt;code&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;NSString *cachesDir = [paths objectAtIndex:0];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取tmp目录路径的方法：&lt;br&gt;
&lt;code&gt;NSString *tmpDir = NSTemporaryDirectory();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取应用程序程序包中资源文件路径的方法：&lt;br&gt;
例如获取程序包中一个图片资源（apple.png）路径的方法：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imagePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:@&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;apple&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt; ofType:@&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;png&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appleImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImage alloc] initWithContentsOfFile:imagePath];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代码中的mainBundle类方法用于返回一个代表应用程序包的对象。&lt;br&gt;
iphone沙盒(sandbox)中的几个目录获取方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;获取沙盒主目录路径&lt;br&gt;
&lt;code&gt;NSString *homeDir = NSHomeDirectory();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取Documents目录路径&lt;br&gt;
&lt;code&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;NSString *docDir = [paths objectAtIndex:0];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取Caches目录路径&lt;br&gt;
&lt;code&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;NSString *cachesDir = [paths objectAtIndex:0];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取tmp目录路径&lt;br&gt;
&lt;code&gt;NSString *tmpDir = NSTemporaryDirectory();&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取当前程序包中一个图片资源（apple.png）路径&lt;br&gt;
&lt;code&gt;NSString *imagePath = [[NSBundle mainBundle] pathForResource:@&amp;quot;apple&amp;quot; ofType:@&amp;quot;png&amp;quot;];&lt;/code&gt;
&lt;code&gt;UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSFileManager&lt;span style="color:#f92672"&gt;*&lt;/span&gt; fm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fm fileExistsAtPath:[self dataFilePath]]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//下面是对该文件进行制定路径的保存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取得一个目录下得所有文件名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;files &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fm subpathsAtPath: [self dataFilePath] ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//读取某个文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fm contentsAtPath:[self dataFilePath]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//或者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSData dataWithContentOfPath:[self dataFilePath]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NSDictionary的深复制（使用category）</title><link>https://zhangdapeng.dev/p/nsdictionary-de-shen-fu-zhi-shi-yong-category/</link><pubDate>Mon, 16 Jun 2025 14:38:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsdictionary-de-shen-fu-zhi-shi-yong-category/</guid><description>&lt;p&gt;目标：把NSDictionary对象转换成NSMutableDictionary对象，对象内容是字符串数组，需要实现完全复制（深复制）。
如果调用NSDictionary的mutableCopy方法，可以得到一个NSMutableDictionary对象，但这只是浅复制，如果我们修改NSDictionary中数组内的值(当然，数组必须是NSMutableArray），会发现，NSMutableDictionary对象内数组的值也跟着更改了。我们需要增加一个mutableDeepCopy方法来实现深复制，在该方法中，循环复制每一个元素。
要实现这一功能，有两种方法，一是继承，二是使用category。category与继承的区别在于，使用category并不是新建一个类，而是在原类的基础上增加一些方法（使用的时候还是用原类名），这样，我们就不需要修改已经在其他源文件中写好的类名，只需要导入h头文件，再把复制方法修改成我们新增的方法即可。&lt;/p&gt;
&lt;p&gt;一、新建Objective-C category文件，我这Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。&lt;/p&gt;
&lt;p&gt;二、两文件源代码：&lt;/p&gt;
&lt;p&gt;NSDictionary+MutableDeepCopy.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSDictionary&lt;/span&gt; (MutableDeepCopy) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;mutableDeepCopy&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//增加mutableDeepCopy方法 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NSDictionary+MutableDeepCopy.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;NSDictionary+MutableDeepCopy.h&amp;#34; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSDictionary&lt;/span&gt; (MutableDeepCopy) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;mutableDeepCopy&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSMutableDictionary alloc] initWithCapacity:[self count]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//新建一个NSMutableDictionary对象，大小为原NSDictionary对象的大小 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;keys&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[self allKeys]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; key &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; keys) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#75715e"&gt;//循环读取复制每一个元素 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[self objectForKey:key]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; copyValue; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([value respondsToSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(mutableDeepCopy)]) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary)，调用mutableDeepCopy方法复制 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; copyValue&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[value mutableDeepCopy]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([value respondsToSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(mutableCopy)]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; copyValue&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[value mutableCopy]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(copyValue&lt;span style="color:#f92672"&gt;==&lt;/span&gt;nil) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; copyValue&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dict setObject:copyValue forKey:key]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; dict; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是一篇转自别人的文章，方法当然学习一下，关键的一点是，我们如何去添加方法到已经存在的类中，比如上面的例子，我们如何添加深度复制的方法到NSDictionary中。&lt;/p&gt;
&lt;p&gt;通过上面的例子我学习了。大家也学习了&lt;/p&gt;
&lt;p&gt;测试代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;NSDictionary+MutableDeepCopy.h&amp;#34; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//导入头文件 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; argv[]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@autoreleasepool&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arr1&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSMutableArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;aa&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;bb&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;cc&amp;#34;&lt;/span&gt;, nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict1&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSDictionary alloc] initWithObjectsAndKeys:arr1,&lt;span style="color:#e6db74"&gt;@&amp;#34;arr1&amp;#34;&lt;/span&gt;, nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,dict1); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict2&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[dict1 mutableCopy]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//浅复制 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict3&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[dict1 mutableDeepCopy]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//深复制 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [arr1 addObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;dd&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,dict2); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,dict3); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 操作post提交数据</title><link>https://zhangdapeng.dev/p/ios-cao-zuo-post-ti-jiao-shu-ju/</link><pubDate>Mon, 16 Jun 2025 14:38:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cao-zuo-post-ti-jiao-shu-ju/</guid><description>&lt;p&gt;在做app应用的时候，需要将数据提交到服务器去存储，那么方法可以参考如下，哈，自己搜索整理的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//参数1名字=参数1数据&amp;amp;参数2名字＝参数2数据&amp;amp;参数3名字＝参数3数据&amp;amp;...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;app_key=XXXXXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;device_token=%@&amp;#34;&lt;/span&gt;,deviceId]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;teleplay_title=%@&amp;#34;&lt;/span&gt;,title]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;job_type=%@&amp;#34;&lt;/span&gt;,type]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;deadline=%@&amp;#34;&lt;/span&gt;,time]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;age=%@&amp;#34;&lt;/span&gt;,age]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;sex=%@&amp;#34;&lt;/span&gt;,sex]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;people_num=%@&amp;#34;&lt;/span&gt;,num]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;contact_person=%@&amp;#34;&lt;/span&gt;,person]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;contact=%@&amp;#34;&lt;/span&gt;,phone]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;postString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString stringByAppendingString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;amp;description=%@&amp;#34;&lt;/span&gt;,description]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;postString:%@&amp;#34;&lt;/span&gt;,postString);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将NSSrring格式的参数转换格式为NSData，POST提交必须用NSData数据。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;postData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [postString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//计算POST提交数据的长度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;postLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,[postData length]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;postLength=%@&amp;#34;&lt;/span&gt;,postLength);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//定义NSMutableURLRequest
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableURLRequest alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置提交目的url
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setURL:[NSURL URLWithString:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://www.baidu.com&amp;#34;&lt;/span&gt;]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置提交方式为 POST
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPMethod:&lt;span style="color:#e6db74"&gt;@&amp;#34;POST&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置http-header:Content-Type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//这里设置为 application/x-www-form-urlencoded ，如果设置为其它的，比如text/html;charset=utf-8，或者 text/html 等，都会出错。不知道什么原因。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setValue:&lt;span style="color:#e6db74"&gt;@&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span&gt; forHTTPHeaderField:&lt;span style="color:#e6db74"&gt;@&amp;#34;Content-Type&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置http-header:Content-Length
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setValue:postLength forHTTPHeaderField:&lt;span style="color:#e6db74"&gt;@&amp;#34;Content-Length&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置需要post提交的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[request setHTTPBody:postData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//定义
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSHTTPURLResponse&lt;span style="color:#f92672"&gt;*&lt;/span&gt; urlResponse &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置网络状态显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//同步提交:POST提交并等待返回值（同步），返回值是NSData类型。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;responseData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSURLConnection sendSynchronousRequest:request returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;urlResponse error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将NSData类型的返回值转换成NSString类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将NSData装换为字典类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonError &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:responseData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;jsonError];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;status&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([&lt;span style="color:#e6db74"&gt;@&amp;#34;ok&amp;#34;&lt;/span&gt; compare:status] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NSOrderedSame) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>文件操作 检查文件是否存在 创建文件目录</title><link>https://zhangdapeng.dev/p/wen-jian-cao-zuo-jian-cha-wen-jian-shi-fou-cun-zai-chuang-jian-wen-jian-mu-lu/</link><pubDate>Mon, 16 Jun 2025 14:38:02 +0000</pubDate><guid>https://zhangdapeng.dev/p/wen-jian-cao-zuo-jian-cha-wen-jian-shi-fou-cun-zai-chuang-jian-wen-jian-mu-lu/</guid><description>&lt;p&gt;关于文件目录的操作和检查&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dataPath:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)file 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSHomeDirectory() stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;Documents&amp;#34;&lt;/span&gt;] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;badge&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; bo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSAssert(bo,&lt;span style="color:#e6db74"&gt;@&amp;#34;创建目录失败&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [path stringByAppendingPathComponent:file]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文件目录操作和文件创建（图片）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//此处首先指定了图片存取路径（默认写到应用程序沙盒 中） 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//并给文件起个文件名 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageDir &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;163&amp;#34;&lt;/span&gt;] stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;songzi&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//存放图片的文件夹 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imagePath &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[imageDir stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;文件名.png&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//检查图片是否已经保存到本地 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self isExistsFile:imagePath]){ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSData dataWithContentsOfFile:imagePath]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSData dataWithContentsOfURL:[NSURL URLWithString: &lt;span style="color:#e6db74"&gt;@&amp;#34;网址&amp;#34;&lt;/span&gt;]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建文件夹路径 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSFileManager defaultManager] createDirectoryAtPath:imageDir withIntermediateDirectories:YES attributes:nil error:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建图片 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIImagePNGRepresentation([UIImage imageWithData:data]) writeToFile:imagePath atomically:YES]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithData:data]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查文件是否存在&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:fileName ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(path&lt;span style="color:#f92672"&gt;==&lt;/span&gt;NULL)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>路径操作 沙箱完整路径 tmp完整路径 判断路径</title><link>https://zhangdapeng.dev/p/lu-jing-cao-zuo-sha-xiang-wan-zheng-lu-jing-tmp-wan-zheng-lu-jing-pan-duan-lu-jing/</link><pubDate>Mon, 16 Jun 2025 14:37:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/lu-jing-cao-zuo-sha-xiang-wan-zheng-lu-jing-tmp-wan-zheng-lu-jing-pan-duan-lu-jing/</guid><description>&lt;h3 id="获取沙箱目录的完整路径"&gt;&lt;a class="link" href="#1" &gt;获取沙箱目录的完整路径&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取沙箱目录的完整路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//uuid.plist
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myPaths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myDocPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [myPaths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;myDocPath = %@&amp;#34;&lt;/span&gt;,myDocPath);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filename &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [myDocPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;uuid.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;filename = %@&amp;#34;&lt;/span&gt;,filename);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取tmp目录"&gt;&lt;a class="link" href="#2" &gt;获取tmp目录&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取tmp目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSTemporaryDirectory();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpfilename &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tmpPath stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;uuid.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tmpfilename = %@&amp;#34;&lt;/span&gt;,tmpfilename);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="判断路径是否存在"&gt;&lt;a class="link" href="#3" &gt;判断路径是否存在&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断路径是否存在
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSFileManager defaultManager] fileExistsAtPath:filename])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;文件存在&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;文件不存在&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 使用AdHoc发布自己的程序</title><link>https://zhangdapeng.dev/p/ios-shi-yong-adhoc-fa-bu-zi-ji-de-cheng-xu/</link><pubDate>Mon, 16 Jun 2025 14:37:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-shi-yong-adhoc-fa-bu-zi-ji-de-cheng-xu/</guid><description>&lt;p&gt;AdHoc实际主要就是你可以发布版本，通过签名Profile指定这个版本能在哪些设备上运行（不超过100个）。这样你可以把版本直接发给你的测试人员，不需要经过AppStore。起到Beta测试的作用。&lt;/p&gt;
&lt;h3 id="取得目标机器的udidunique-device-identifier-"&gt;&lt;a class="link" href="#1" &gt;取得目标机器的UDID（Unique Device Identifier ）&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;启动iTune，连接设备。选取设备，在Summary页面，可以看到Serial Number（序列号）。点击Serial Number（看上去是文字，实际可以点的），Serial Number就变成了UDID了。&lt;/p&gt;
&lt;p&gt;下面的部分翻译自http://www.iphonedevsdk.com/forum/iphone-sdk-development/35818-unofficial-ad-hoc-distribution-guide.html&lt;/p&gt;
&lt;h3 id="生成包含udid的provision-file"&gt;&lt;a class="link" href="#2" &gt;生成包含UDID的Provision file&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1.到你的iPhone Provision Potral，首先把你需要支持的Devide的UDID都输入进去。&lt;/p&gt;
&lt;p&gt;2.然后左边选 Provisioning，然后选Distribution，就到下面页面。按下面选择好。&lt;/p&gt;
&lt;p&gt;3.然后下载这个Provision File，双击，自动加入到Xcode中。&lt;/p&gt;
&lt;h3 id="编译你的工程"&gt;&lt;a class="link" href="#3" &gt;编译你的工程&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1.生成一个 entitlements plist 文件.&lt;/p&gt;
&lt;p&gt;2.我的这个界面和图上不一样，没有这个get-task-allow，而是其他的一些东西。我就什么都没动。&lt;/p&gt;
&lt;p&gt;3.在工程中“Get info”，选择Configurations，创建一个adhoc的Config。&lt;/p&gt;
&lt;p&gt;4.然后回到Build页面，Configuration选择adhoc，在Code Signing组下面，Code Signing Entitlements设为你刚刚建立的文件。&lt;/p&gt;
&lt;p&gt;5.Code Singing Identity用你正常发布的Provision&lt;/p&gt;
&lt;p&gt;6.Any iPhone OS Device用你刚刚创建的adhoc的Provision。&lt;/p&gt;
&lt;p&gt;7.最后Build你的应用，记着先Clean all Targets一下，然后你就可以在工程的Build目录下找到你的目标App了。&lt;/p&gt;
&lt;h3 id="如何安装"&gt;&lt;a class="link" href="#4" &gt;如何安装&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;把你的adhoc的Provision File和你刚刚生成的App文件发给你的Tester。&lt;br&gt;
他需要打开iTunes，在Libary-&amp;gt;Applicatione页面，把Provision文件和App文件拖进去。&lt;br&gt;
连接设备，确认在设备的Apps下面，这个新app已经被选中（Default应该是选中的）&lt;/p&gt;
&lt;p&gt;同步设备，App就安装上去了。&lt;/p&gt;</description></item><item><title>iOS 状态栏操作（收集）</title><link>https://zhangdapeng.dev/p/ios-zhuang-tai-lan-cao-zuo-shou-ji/</link><pubDate>Mon, 16 Jun 2025 14:37:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhuang-tai-lan-cao-zuo-shou-ji/</guid><description>&lt;p&gt;让状态栏显示网络等待标志&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES; &lt;span style="color:#75715e"&gt;//显示 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIApplication sharedApplication].networkActivityIndicatorVisible &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO; &lt;span style="color:#75715e"&gt;//隐藏
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;状态栏是可以通过UIApplication类提供的一些方法来修改的，比如完全去掉状态栏或者修改风格，不过这些改变只是在你的程序内部，当你退出你的程序又会复原。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myApp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIapplication sharedApplication];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1.隐藏状态栏&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myApp setStatusBarHidden:YES animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;记得隐藏状态栏后的你的“桌面”就增加320×20的大小，所以最好是在任何window或者view创建之前隐藏它。&lt;br&gt;
2.状态栏风格&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myApp setStatusBarStyle: UIStatusbarStyleBlackOpaque]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIStatusBarStyleDefault, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIStatusBarStyleBlackTranslucent, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIStatusBarStyleBlackOpaque 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } UIStatusBarStyle;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.状态栏方向&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myApp setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationPortrait &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationPortrait, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖屏，垂直向上 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationPortraitUpsideDown &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationPortraitUpsideDown, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//竖屏，垂直方向上下颠倒 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationLandscapeLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationLandscapeRight, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设备逆时针旋转到横屏模式 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIInterfaceOrientationLandscapeRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDeviceOrientationLandscapeLeft 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设备顺时针旋转到横屏模式 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } UIInterfaceOrientation;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有时候，需要在状态栏上显示一些自定义信息，比如新浪微博的官方iOS客户端：告知用户信息处于发送队列、发送成功或者发送失败。&lt;/p&gt;
&lt;p&gt;通过在状态栏显示自定义信息，可以给用户友好又不影响软件使用的提示。&lt;br&gt;
为此，我们显得定义一个自定义状态栏类，包含一个显示信息的Label：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CustomStatusBar&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIWindow&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;_messageLabel; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showStatusMessage:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)message; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hide&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接着，设置大小和系统状态栏一致，背景为黑色：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIApplication sharedApplication].statusBarFrame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里，为了让自定义的状态栏可以让用户看到，还需要设置它的windowLevel。&lt;br&gt;
在iOS中，windowLevel属性决定了UIWindow的显示层次。默认的windowLevel为UIWindowLevelNormal，即0.0。&lt;br&gt;
系统定义了三个层次如下，具体可参考官方文档：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; UIWindowLevel UIWindowLevelNormal; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; UIWindowLevel UIWindowLevelAlert; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; UIWindowLevel UIWindowLevelStatusBar; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; CGFloat UIWindowLevel;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了能够覆盖系统默认的状态栏，我们把自定义的状态栏的windowLevel调高点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.windowLevel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIWindowLevelStatusBar &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后，为显示信息和隐藏添加一点无伤大雅的动画：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showStatusMessage:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)message 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _messageLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize totalSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.frame.size; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CGRect){ self.frame.origin, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, totalSize.height }; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView animateWithDuration:&lt;span style="color:#ae81ff"&gt;0.5f&lt;/span&gt; animations:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CGRect){ self.frame.origin, totalSize }; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; finished){ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _messageLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; message; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hide&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView animateWithDuration:&lt;span style="color:#ae81ff"&gt;0.5f&lt;/span&gt; animations:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } completion:&lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; finished){ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _messageLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }];; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>如何在iOS设备上安装调试多个App</title><link>https://zhangdapeng.dev/p/ru-he-zai-ios-she-bei-shang-an-zhuang-tiao-shi-duo-ge-app/</link><pubDate>Fri, 13 Jun 2025 15:33:17 +0000</pubDate><guid>https://zhangdapeng.dev/p/ru-he-zai-ios-she-bei-shang-an-zhuang-tiao-shi-duo-ge-app/</guid><description>&lt;h3 id="如何在ios设备上安装调试多个app"&gt;&lt;a class="link" href="#1" &gt;如何在iOS设备上安装调试多个App&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;这个话题很重要，经过我的不断关注，在一个高手博客里面找到了，简单的贴到我这里了哈&lt;/p&gt;
&lt;p&gt;作为iOS开发工程师， 在发布app之前，你需要在真机上调试、测试，所以需要将app 下载到真机上。 如果想同时下载多个App ，怎么办呢？ 我们先来看看App 的工作原理。&lt;/p&gt;
&lt;p&gt;Appstore上的每个app 都有一个唯一的ID。 这个ID，如同人们的身份证一样，每个App 都不是不同的。 但作为iOS开发者来说，在App 调试阶段，你可以自行设置多个App ID。 因为这些App 还没有发布到Appstore 上，你只需要保证自己开发的App 设置不同的App ID 即可。&lt;/p&gt;
&lt;p&gt;只要App ID 不同， 你就可以在同一部iOS设备上，安装不同的App。&lt;/p&gt;
&lt;p&gt;具体到开发层面， 你需要在xcode 的 info.plist 文件的 Bunlde Identifier 设置 App ID。&lt;/p&gt;
&lt;p&gt;举例来说：&lt;/p&gt;
&lt;p&gt;如果你的 mobileprovisioning Proifle （dev_any_profile）文件对应的 Bunld ID 为： &lt;code&gt;com.leopard.*&lt;/code&gt; 这个 &lt;code&gt;*&lt;/code&gt; 就是一个通配符。 你可以用不同的字符替换。&lt;/p&gt;
&lt;p&gt;在 info.plist 文件的 Bunlde Identifier 中，填写 com.leopard.app1 , 在 project -&amp;gt; build setting -&amp;gt; code siging 中，将对应的 dev_any_profile 关联起来， 这样就生成了一个 app id 为 app1 的 App；&lt;/p&gt;
&lt;p&gt;同理，在 info.plist 文件的 Bunlde Identifier 中，填写 com.leopard.app2, 在 project -&amp;gt; build setting -&amp;gt; code siging 中，将对应的 dev_any_profile 关联起来， 这样就生成了一个 app id 为 app2 的 App；&lt;/p&gt;
&lt;p&gt;以此类推， 便可以生成多个App。 因为它们的 app id 不同， 便可以同时安装在同一部iOS设备上。&lt;/p&gt;</description></item><item><title>如何安装 ad-hoc ipa （这是我所知道的最快捷的方式）</title><link>https://zhangdapeng.dev/p/ru-he-an-zhuang-ad-hoc-ipa-zhe-shi-wo-suo-zhi-dao-de-zui-kuai-jie-de-fang-shi/</link><pubDate>Fri, 13 Jun 2025 15:33:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/ru-he-an-zhuang-ad-hoc-ipa-zhe-shi-wo-suo-zhi-dao-de-zui-kuai-jie-de-fang-shi/</guid><description>&lt;p&gt;“如何安装 ad-hoc ipa ”，说到这个话题，也是我最近很关注的，因为方便老板们或者其他人的测试，需要这个文件，具体怎么回事，我记到下面了，这篇文章也是转载一个高手的，专注移动端的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;如果你是 iOS 开发者， 给客户开发的app， 在发布到appstore 前，需经过客户的测试。 

如果客户的iOS设备不是越狱的，你只好通过 ad-hoc 模式，将生产的 ad-hoc profile 和 ipa 文件发给客户。 （如何生成这两个文件，不在此赘述）。 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;客户如何安装这两个文件，这是我一直头疼的。 我们无法要求客户有技术背景。 相反，大多客户为非技术人员。 客户是上帝，绝不能苛求客户。&lt;br&gt;
为此，我写过多个版本的文档， 但操作步骤，连我自己都觉得麻烦。&lt;br&gt;
早期，是基于 iTunes 同步安装。 但iTunes 的同步操作，太复杂了。 iTunes 版本每次更新，我都会被困惑一次。 iTunes 可谓功能强大，但对用户的使用技巧要求也很高。 如果客户仅仅是为了安装一个 ipa， 而被迫熟悉 iTunes。 其难度可想而知。&lt;br&gt;
其实， iTunes同步ipa 还算简单，难点在于，如何告知客户安装 那个 ad-hoc provisioning profile。 通常是无果而终。&lt;br&gt;
可以说，让客户通过 iTunes 安装 ad-hoc ipa，这个过程相当艰难。&lt;br&gt;
这里推荐一种我所知道的最快捷的方法。&lt;/p&gt;
&lt;h3 id="ad-hoc-profile-文件的安装"&gt;&lt;a class="link" href="#1" &gt;ad-hoc profile 文件的安装&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;将 ad-hoc provisioning profile 通过邮件发给客户， 客户一定要通过手机接收这个邮件 （不要通过PC接收邮件）。 客户从手机上打开邮箱， 点击 这个附件 （profile 文件）， 直接安装到 iOS 设备上。 （只需点击这个附件，即可安装成功）；&lt;br&gt;
这时，你需要查看下ad-hoc profile是否安装成功。 方法如下：&lt;br&gt;
打开iOS 设备的 设置-&amp;gt; 通用-&amp;gt; 描述文件，&lt;/p&gt;
&lt;h3 id="ipa-文件的安装"&gt;&lt;a class="link" href="#2" &gt;ipa 文件的安装&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;建议客户下载 iTools。 我一直是推崇apple 的官方安装渠道（通过iTunes）的，但这一次推荐iTools 。 对安装一个pia 来说， iTools 的强大的地方在于，你只需要在 PC上 双击 ipa 文件， 这个ipa 会自动导入到 iTools 中，而且会给出一个赫然安装提示。这一点，对于非技术人员来说，至关重要。 前提是，你的iOS设备需通过数据线连接到PC上。 这么醒目的 “立即安装”提示， 很直观吧&lt;/p&gt;</description></item><item><title>UITableView删除时，刷新table的方法</title><link>https://zhangdapeng.dev/p/uitableview-shan-chu-shi-shua-xin-table-de-fang-fa/</link><pubDate>Fri, 13 Jun 2025 15:33:08 +0000</pubDate><guid>https://zhangdapeng.dev/p/uitableview-shan-chu-shi-shua-xin-table-de-fang-fa/</guid><description>&lt;p&gt;不知道什么原因，自己在做删除操作的时候，会有个错误，总是删除了，又以空的形式出现，我火了。&lt;/p&gt;
&lt;p&gt;查找了很多资料，自己拼出一个还算能够使用的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;refreshData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpMutableDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithCapacity:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;allKeys &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic allKeys];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;allMutableKeys &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [allKeys mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSComparator cmptr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj1, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj2){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;resultKeys &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [allMutableKeys sortedArrayUsingComparator:cmptr];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; k &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; item &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; resultKeys) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic valueForKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,item]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [tmpMutableDictionary setValue:dic forKey:[NSString stringWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;, k]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; k&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tmpMutableDictionary mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 数组排序方法</title><link>https://zhangdapeng.dev/p/ios-shu-zu-pai-xu-fang-fa/</link><pubDate>Fri, 13 Jun 2025 15:33:04 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-shu-zu-pai-xu-fang-fa/</guid><description>&lt;p&gt;第一种，利用数组的sortedArrayUsingComparator调用 NSComparator ，obj1和obj2指的数组中的对象&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSComparator cmptr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj1, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj2){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sortArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;3&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;4&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;7&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;8&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;2&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;13&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;15&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;12&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;20&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;28&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//排序前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;outputBefore &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; sortArray){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[outputBefore appendFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;排序前:%@&amp;#34;&lt;/span&gt;,outputBefore);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//排序后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [sortArray sortedArrayUsingComparator:cmptr];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;outputAfter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; array){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[outputAfter appendFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;排序后:%@&amp;#34;&lt;/span&gt;,outputAfter);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二种 排序方法 利用sortedArrayUsingFunction 调用 对应方法customSort，这个方法中的obj1和obj2分别是指数组中的对象。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSInteger &lt;span style="color:#a6e22e"&gt;customSort&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj1, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj2,&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; context){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sortArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;3&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;4&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;7&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;8&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;2&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;13&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;15&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;12&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;20&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;28&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//排序前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;outputBefore &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; sortArray){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[outputBefore appendFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;排序前:%@&amp;#34;&lt;/span&gt;,outputBefore);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [sortArray sortedArrayUsingFunction:customSort context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;outputAfter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableString alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; array){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[outputAfter appendFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;排序后:%@&amp;#34;&lt;/span&gt;,outputAfter);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三种 利用sortUsingDescriptors调用NSSortDescriptor&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSSortDescriptor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sortDescriptor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSSortDescriptor alloc] initWithKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;price&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;															 ascending:NO];&lt;span style="color:#75715e"&gt;//其中，price为数组中的对象的属性，这个针对数组中存放对象比较更简洁方便
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;sortDescriptors &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] initWithObjects:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;sortDescriptor count:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_totalInfoArray sortUsingDescriptors:sortDescriptors];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[_airListView refreshTable:_totalInfoArray];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;字符串的比较模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSComparator cmptr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;^&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj1, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj2){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,obj1] compare:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,obj2] options:NSNumericSearch] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,obj1] compare:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,obj2] options:NSNumericSearch] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数字比较模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSInteger &lt;span style="color:#a6e22e"&gt;customSort&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj1, &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; obj2,&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; context){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedDescending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([obj1 integerValue] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; [obj2 integerValue]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedAscending;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (NSComparisonResult)NSOrderedSame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS设备 获取Model（设备型号）、Version（设备版本号）、app（程序版本号）</title><link>https://zhangdapeng.dev/p/ios-she-bei-huo-qu-model-she-bei-xing-hao-version-she-bei-ban-ben-hao-app-cheng-xu-ban-ben-hao/</link><pubDate>Fri, 13 Jun 2025 15:33:00 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-she-bei-huo-qu-model-she-bei-xing-hao-version-she-bei-ban-ben-hao-app-cheng-xu-ban-ben-hao/</guid><description>&lt;p&gt;最近想到了这些的东西，就去google搜索了一下，结果还真有，哈，知识在于发现，代码贴到下面了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;uniqueIdentifier: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] uniqueIdentifier]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;name: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] name]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;systemName: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] systemName]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;systemVersion: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] systemVersion]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;model: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] model]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;localizedModel: %@&amp;#34;&lt;/span&gt;, [[UIDevice currentDevice] localizedModel]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;infoDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] infoDictionary];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CFShow(infoDictionary);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app名称
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;app_Name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleDisplayName&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;app_Version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleShortVersionString&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app build版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;app_build &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [infoDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;CFBundleVersion&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>关于UIToolBar的学习</title><link>https://zhangdapeng.dev/p/guan-yu-uitoolbar-de-xue-xi/</link><pubDate>Fri, 13 Jun 2025 15:32:56 +0000</pubDate><guid>https://zhangdapeng.dev/p/guan-yu-uitoolbar-de-xue-xi/</guid><description>&lt;h3 id="uibbarbuttonitem的初始化"&gt;&lt;a class="link" href="#1" &gt;UIBbarButtonItem的初始化。&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;根据SDK的文档，我们可以发现UIBbarButtonItem有如下几种初始化的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-initWithTitle&lt;/li&gt;
&lt;li&gt;-initWithImage&lt;/li&gt;
&lt;li&gt;-initWithBarButtonSystemItem&lt;/li&gt;
&lt;li&gt;-initWithCustomView&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第4种方法就是我们添加各种作料的接口，所以今天的主角其它也是它。&lt;/p&gt;
&lt;h3 id="在uitoolbar上面添加title"&gt;&lt;a class="link" href="#2" &gt;在UIToolBar上面添加Title&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIToolbar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myToolBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIToolbar alloc] initWithFrame: CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myToolBarItems &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray array];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject:[[[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;myTile&amp;#34;&lt;/span&gt; style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action)] autorelease]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBar setItems:myToolBarItems animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBar &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;setItems传入值或者说items是一个对象数组。&lt;/p&gt;
&lt;h3 id="在uitoolbar上面添加image"&gt;&lt;a class="link" href="#3" &gt;在UIToolBar上面添加image&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject:[[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;myImage.png&amp;#34;&lt;/span&gt;] style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action)]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="在uitoolbar上面添加systemitem"&gt;&lt;a class="link" href="#4" &gt;在UIToolBar上面添加SystemItem&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action)] autorelease]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note:&lt;/p&gt;
&lt;p&gt;initWithBarButtonSystemItem初始化：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Defines system defaults for commonly used items.&lt;/p&gt;
&lt;p&gt;typedef enum {&lt;br&gt;
UIBarButtonSystemItemDone,&lt;br&gt;
UIBarButtonSystemItemCancel,&lt;br&gt;
UIBarButtonSystemItemEdit,&lt;br&gt;
UIBarButtonSystemItemSave,&lt;br&gt;
UIBarButtonSystemItemAdd,&lt;br&gt;
UIBarButtonSystemItemFlexibleSpace,&lt;br&gt;
UIBarButtonSystemItemFixedSpace,&lt;br&gt;
UIBarButtonSystemItemCompose,&lt;br&gt;
UIBarButtonSystemItemReply,&lt;br&gt;
UIBarButtonSystemItemAction,&lt;br&gt;
UIBarButtonSystemItemOrganize,&lt;br&gt;
UIBarButtonSystemItemBookmarks,&lt;br&gt;
UIBarButtonSystemItemSearch,&lt;br&gt;
UIBarButtonSystemItemRefresh,&lt;br&gt;
UIBarButtonSystemItemStop,&lt;br&gt;
UIBarButtonSystemItemCamera,&lt;br&gt;
UIBarButtonSystemItemTrash,&lt;br&gt;
UIBarButtonSystemItemPlay,&lt;br&gt;
UIBarButtonSystemItemPause,&lt;br&gt;
UIBarButtonSystemItemRewind,&lt;br&gt;
UIBarButtonSystemItemFastForward,&lt;br&gt;
UIBarButtonSystemItemUndo, // iPhoneOS 3.0&lt;br&gt;
UIBarButtonSystemItemRedo, // iPhoneOS 3.0&lt;br&gt;
} UIBarButtonSystemItem;&lt;/p&gt;
&lt;h3 id="在uitoolbar上面添加其它各种控件"&gt;&lt;a class="link" href="#5" &gt;在UIToolBar上面添加其它各种控件&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;最自由意义，最有意思的，我把它放在最后来讲。我们使用initWithCustomView来完成，&lt;/p&gt;
&lt;p&gt;这里需要看一下initWithCustomView的定义：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithCustomView:&lt;/span&gt;(UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)customView
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看出，它的参数是一个VIEW，所以我们给它的配料要正确哦才行哦，否则，你就等着时间DIDADIDA的流失吧.&lt;/p&gt;
&lt;p&gt;A&amp;gt;加一个开关switch：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject:[[[UIBarButtonItem alloc] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWithCustomView:[[[UISwitch alloc] init] autorelease]] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; autorelease]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;B&amp;gt;加一个按钮UIBarButtonItem&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIBarButtonItem alloc] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;myButton&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UIBarButtonItemStyleBordered 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(action)]autorelease]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;get1Button.width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject:myButton];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;gt;加一个文本Label&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myLabel &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;40.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;45.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;myLabel.font&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIFont systemFontOfSize:&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//myLabel.backgroundColor = [UIColor clearColor]; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//myLabel.textAlignment=UITextAlignmentCenter; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc]initWithCustomView:myLabel]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject: myButtonItem]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mylabel &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myButtonItem &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;D&amp;gt;加一个进度条UIProgressView&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIProgressView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myProgress &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIProgressView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;65.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;90.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc]initWithCustomView:myProgress]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBarItems addObject: myButtonItem]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myProgress &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myButtonItem &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以加使用initWithCustomView制作各种button，这里就不在这里一个一个在加了。我想你应该也已经掌握了如何添加各种buttonItem的方法了。&lt;/p&gt;</description></item><item><title>在UIToolBar上添加按钮，并调整按钮位置</title><link>https://zhangdapeng.dev/p/zai-uitoolbar-shang-tian-jia-an-niu-bing-tiao-zheng-an-niu-wei-zhi/</link><pubDate>Fri, 13 Jun 2025 15:32:51 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-uitoolbar-shang-tian-jia-an-niu-bing-tiao-zheng-an-niu-wei-zhi/</guid><description>&lt;p&gt;我是第一次使用这个东西，经过自己资料的查找，终于有了我觉得比较好用的方法&lt;/p&gt;
&lt;p&gt;如下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nextStep &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIButton alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[nextStep setImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;button-下一步.png&amp;#34;&lt;/span&gt;] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[nextStep addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(doneAction:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nextStepBarBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithCustomView:nextStep];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//[nextStepBarBtn setWidth:1080];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;spaceButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemFixedSpace target:nil action:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[spaceButtonItem setWidth:&lt;span style="color:#ae81ff"&gt;540&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myToolBar setItems:[NSArray arrayWithObjects:spaceButtonItem,nextStepBarBtn,nil] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里面用的是横屏的，我针对于自己的项目，需要的是竖屏的，结果的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIToolbar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionToolBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIToolbar alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, self.view.frame.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;, self.view.frame.size.width, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;attentionToolBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;attentionToolBar.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:attentionToolBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIButton alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[attentionBar setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;添加关注&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[attentionBar addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(addAttention:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nextStepBarBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithCustomView:attentionBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;spaceButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemFixedSpace target:nil action:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[spaceButtonItem setWidth:(self.view.frame.size.width &lt;span style="color:#f92672"&gt;-&lt;/span&gt; attentionBar.frame.size.width)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[attentionToolBar setItems:[NSArray arrayWithObjects:spaceButtonItem,nextStepBarBtn,nil] animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>UILabel 用法详解（弥补加补充）</title><link>https://zhangdapeng.dev/p/uilabel-yong-fa-xiang-jie-mi-bu-jia-bu-chong/</link><pubDate>Fri, 13 Jun 2025 15:32:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/uilabel-yong-fa-xiang-jie-mi-bu-jia-bu-chong/</guid><description>&lt;p&gt;关于UILabel的用法前面有篇文章已经说过，但是我看过后还有有些缺少，之后自己又找了很多，现在记录一下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建uilabel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;280&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置背景色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor grayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置tag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;91&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置标签文本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;CCBASE.NET!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置标签文本字体和字体大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont fontWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;Arial&amp;#34;&lt;/span&gt; size:&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置文本对齐方式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAlignmentCenter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本对齐方式有以下三种
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//typedef enum {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UITextAlignmentLeft = 0,左对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UITextAlignmentCenter,居中对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UITextAlignmentRight, 右对齐 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//} UITextAlignment;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//超出label边界文字的截取方式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.lineBreakMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UILineBreakModeTailTruncation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//截取方式有以下6种
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//typedef enum { 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeWordWrap = 0, 以空格为边界，保留整个单词 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeCharacterWrap, 保留整个字符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeClip, 到边界为止 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeHeadTruncation, 省略开始，以……代替 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeTailTruncation, 省略结尾，以……代替 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UILineBreakModeMiddleTruncation,省略中间，以……代替，多行时作用于最后一行 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//} UILineBreakMode;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本文字自适应大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.adjustsFontSizeToFitWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//当adjustsFontSizeToFitWidth=YES时候，如果文本font要缩小时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//baselineAdjustment这个值控制文本的基线位置，只有文本行数为1是有效
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.baselineAdjustment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIBaselineAdjustmentAlignCenters;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//有三种方式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//typedef enum {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIBaselineAdjustmentAlignBaselines = 0, 默认值文本最上端于label中线对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIBaselineAdjustmentAlignCenters,//文本中线于label中线对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// UIBaselineAdjustmentNone,//文本最低端与label中线对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//} UIBaselineAdjustment;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本最多行数，为0时没有最大行数限制
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.numberOfLines &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//最小字体，行数为1时有效，默认为0.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.minimumFontSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本高亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.highlighted &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本是否可变
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//去掉label背景色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//label1.backgroundColor = [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//文本阴影颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.shadowColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor grayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//阴影大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.shadowOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//是否能与用户交互
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label1.userInteractionEnabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:label1];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[label1 &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iPhone隐藏和显示TabBar的方法</title><link>https://zhangdapeng.dev/p/iphone-yin-cang-he-xian-shi-tabbar-de-fang-fa/</link><pubDate>Fri, 13 Jun 2025 15:32:40 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-yin-cang-he-xian-shi-tabbar-de-fang-fa/</guid><description>&lt;p&gt;关于显示和隐藏TabBar的方法，自己开始不是很懂，查找了很多的资料，在http://blog.csdn.net/riveram/article/details/7345577&lt;/p&gt;
&lt;p&gt;这里面，有这样的描述，里面是给了两个方法：&lt;/p&gt;
&lt;p&gt;隐藏tabbar的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;hideTabBar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.tabBarController.tabBar.hidden &lt;span style="color:#f92672"&gt;==&lt;/span&gt; YES) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;contentView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( [[self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] isKindOfClass:[UITabBar &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]] )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height &lt;span style="color:#f92672"&gt;+&lt;/span&gt; self.tabBarController.tabBar.frame.size.height); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.tabBar.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;显示tabbar的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;showTabBar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.tabBarController.tabBar.hidden &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NO)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;contentView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] isKindOfClass:[UITabBar &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; self.tabBarController.tabBar.frame.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.tabBar.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后直接调用就好了。&lt;/p&gt;
&lt;p&gt;另外在cocoachina的网站上，也看到了一个方法，不过只是说是隐藏的方法。&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;p&gt;隐藏Tabbar&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;makeTabBarHidden:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)hide
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( [self.tabBarController.view.subviews count] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;contentView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( [[self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] isKindOfClass:[UITabBar &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]] )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tabBarController.view.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// [UIView beginAnimations:@&amp;#34;TabbarHide&amp;#34; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( hide )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.tabBarController.view.bounds; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contentView.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(self.tabBarController.view.bounds.origin.x,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.view.bounds.origin.y,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.view.bounds.size.width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.view.bounds.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; self.tabBarController.tabBar.frame.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBarController.tabBar.hidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hide;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// [UIView commitAnimations]; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是，有经过资料的查找，有个比较简单的方法&lt;/p&gt;
&lt;p&gt;我在A视图的代码可参考如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加右侧的item
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.rightButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _rightButton.titleLabel.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont fontWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;Avenir-Book&amp;#34;&lt;/span&gt; size:&lt;span style="color:#ae81ff"&gt;14.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _rightButton.contentHorizontalAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIControlContentHorizontalAlignmentLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _rightButton.contentEdgeInsets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIEdgeInsetsMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arrowPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;littleArrow&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton setBackgroundImage:[UIImage imageWithContentsOfFile:arrowPath] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(personRoleSelect:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([_role isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; (_role &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;全部&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton setTitle:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,_role] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rightItemBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithCustomView:_rightButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.rightBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rightItemBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.hidesBottomBarWhenPushed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returnItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillDisappear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.hidesBottomBarWhenPushed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_dropDown hideDropDown:_rightButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主要是这句：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;self.hidesBottomBarWhenPushed = YES;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;和&lt;/p&gt;
&lt;p&gt;&lt;code&gt;self.hidesBottomBarWhenPushed = NO;&lt;/code&gt;&lt;/p&gt;</description></item><item><title>nil,Nil,NULL 和NSNull的学习</title><link>https://zhangdapeng.dev/p/nilnilnull-he-nsnull-de-xue-xi/</link><pubDate>Fri, 13 Jun 2025 15:32:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/nilnilnull-he-nsnull-de-xue-xi/</guid><description>&lt;p&gt;1.object-c最好 用nil [nil 任意方法],不会崩溃&lt;br&gt;
&lt;code&gt;nil&lt;/code&gt; 是一个对象值。&lt;br&gt;
&lt;code&gt;NULL&lt;/code&gt; 是一个通用指针（泛型指针）。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;NSNULL，NULL和nil在本质上应该是一样的，NULL和nil其实就是0，但是在Objective-c中，对于像NSArray这样的类型，nil或NULL不能做为加到其中的Object，如果定义了一个NSArray，为其分配了内存，又想设置其中的内容为空，则可以用[NSNULL null返回的对象来初始化NSArray中的内容，&lt;br&gt;
3.因为在NSArray和NSDictionary中nil中有特殊的含义（表示列表结束），所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值，可以使用NSNull类。NSNull只有一个方法：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+ (NSNull *) null;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为Object-C的集合对象，如NSArray、NSDictionary、NSSet等，都有可能包含NSNull对象，所以，如果一下代码中的item为NSNull，则会引起程序崩溃。&lt;/p&gt;
&lt;p&gt;以下代码是常见的错误，release对象没有设置为nil，从而引起程序崩溃。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSArray objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([item isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;TestNumber&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; someObject&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[Object alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[someObject &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(someObject)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//crash here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;nil用来给对象赋值（Object-C的任何对象都属于id类型），NULL则给任何指针赋值，NULL和nil不能互换，nil用于类指针赋值（在Object-C中类是一个对象，是类的meta-class的实例），而NSNull则用于集合操作，虽然它们表示的都是空值，但是使用场合完全不同，所以在编码时严格按照变量类型来赋值，将正确的空值赋给正确的类型，使代码易于阅读和维护，也不易引起错误。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断对象不空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(object) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断对象为空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(object &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//数组初始化，空值结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;pageNames&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSArray alloc] initWithObjects:&lt;span style="color:#e6db74"&gt;@&amp;#34;DocumentList&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;AdvancedSearch&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;@&amp;#34;Statistics&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断数组元素是否为空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;controller&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSArray objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((NSNull &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)controller &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [NSNull null])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//判断字典对象的元素是否为空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;userId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;UserId&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(userId &lt;span style="color:#f92672"&gt;==&lt;/span&gt; [NSNull null])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Object-C有个可爱的特性，就是当发消息给nil对象时，系统返回0值而不是引起异常，这和JAVA烦人的NullPointerException以及C/C++的程序直接崩溃的处理完全不一样，明白Object-C的这个特性对于开发正确的IOS程序非常重要，因为nil是对象的合法值，nil对象同样可以接收消息，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;person&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[person castBallot];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;&amp;#34;person=%@&amp;#34;&lt;/span&gt;,person);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对象置空，然后发送消息，程序同样接着往下执行而不会崩溃。&lt;/p&gt;</description></item><item><title>iOS 修改导航栏的返回按钮的内容</title><link>https://zhangdapeng.dev/p/ios-xiu-gai-dao-hang-lan-de-fan-hui-an-niu-de-nei-rong/</link><pubDate>Fri, 13 Jun 2025 14:09:32 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-xiu-gai-dao-hang-lan-de-fan-hui-an-niu-de-nei-rong/</guid><description>&lt;p&gt;如何修改导航栏的返回按钮内容，开始我也费了好久的时间最后打算自定义一个算了，结果方法还是被我找到了。&lt;/p&gt;
&lt;p&gt;导航的返回按钮的加载原理是这样的：&lt;/p&gt;
&lt;p&gt;1、如果B视图有一个自定义的左侧按钮（leftBarButtonItem），则会显示这个自定义按钮；&lt;br&gt;
2、如果B没有自定义按钮，但是A视图的&lt;code&gt;backBarButtonItem&lt;/code&gt;属性有自定义项，则显示这个自定义项；&lt;br&gt;
3、如果前2条都没有，则默认显示一个后退按钮，后退按钮的标题是A视图的标题。&lt;br&gt;
按照这个解释，我把&lt;code&gt;UIBarButtonItem *backItem&lt;/code&gt;……这段代码放在A视图的&lt;code&gt;pushViewController&lt;/code&gt;语句之前。&lt;/p&gt;
&lt;p&gt;实现过程是这样的&lt;/p&gt;
&lt;p&gt;A视图的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;didSelectRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUInteger row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [indexPath row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returnButtonItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnButtonItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(row &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; personViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;person &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[personViewController alloc] initWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;personViewController&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController pushViewController:person animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(row &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; teleplayViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;teleplay &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[teleplayViewController alloc] initWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;teleplayViewController&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController pushViewController:teleplay animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意这段代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;returnButtonItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnButtonItem;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;B视图我是什么也没有做的。结果就达到你想要的效果了。&lt;/p&gt;
&lt;p&gt;查资料的时候有一种新的方法，没有试过，先帖在这里了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationController.navigationBar.topItem.title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;self.message;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationController.navigationBar.tintColor&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIColorblackColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem&lt;span style="color:#f92672"&gt;*&lt;/span&gt;backButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItemalloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34; fan hui &amp;#34;&lt;/span&gt;style:UIBarButtonItemStyleBorderedtarget:selfaction:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(PopViewController)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.leftBarButtonItem&lt;span style="color:#f92672"&gt;=&lt;/span&gt; backButton;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个应该是贴在B视图里面（就是你要跳转到的视图）&lt;/p&gt;
&lt;p&gt;补充&lt;/p&gt;
&lt;p&gt;对于这段代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;returnButtonItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnButtonItem;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;很好解释的，事实上也不用一定要放在我说的那里，也是可以放在 viewWillAppear里面的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;returnButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returnButtonItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; returnButtonItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>mutableCopy和Copy的区别</title><link>https://zhangdapeng.dev/p/mutablecopy-he-copy-de-qu-bie/</link><pubDate>Fri, 13 Jun 2025 14:08:38 +0000</pubDate><guid>https://zhangdapeng.dev/p/mutablecopy-he-copy-de-qu-bie/</guid><description>&lt;p&gt;这两个方法区别就是一个可以copy后是可变的，一个是不可变的&lt;/p&gt;
&lt;p&gt;我举个例子，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataDic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;showDataDic;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我要copy dataDic到showDataDic里面去&lt;/p&gt;
&lt;p&gt;第一种方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.showDataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithCapacity:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.showDataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的话self.showDataDic是不可变的&lt;/p&gt;
&lt;p&gt;第二种方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.showDataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableDictionary dictionaryWithCapacity:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.showDataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataDic mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的话self.showDataDic是可变的&lt;/p&gt;</description></item><item><title>iOS 通过代码设置statusBar的tintColor颜色</title><link>https://zhangdapeng.dev/p/ios-tong-guo-dai-ma-she-zhi-statusbar-de-tintcolor-yan-se/</link><pubDate>Fri, 13 Jun 2025 14:07:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-tong-guo-dai-ma-she-zhi-statusbar-de-tintcolor-yan-se/</guid><description>&lt;p&gt;在iOS6中，statusbar的颜色是由当前页面的UINavigationBar决定的，也就是当前view中的UINavigationBar决定statusbar的tintColor的。如果我们的UIViewController是UINavigationController的子集，那么就好statusbar的颜色还好设置，如果UINavigationBar被hide掉，或是根本就没有UINavigationController，那么在iOS6上statusbar的颜色就是黑色。&lt;br&gt;
如何办呢？我们如何才能在iOS6上设置statusbar的颜色？&lt;br&gt;
刚才说了，statusbar的颜色是由UINavigationBar决定的，那么我们可不可以在当前view中放一个UINavigationBar并设置其颜色，影响其statusbar的颜色。 我们的假设是正确的，这个方法的确可行。&lt;/p&gt;
&lt;p&gt;在我们的view中放入一个UINavigationBar,并设置其&lt;code&gt;frame=CGRectMake(0, -43, 320, 44);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在这儿y的值一定得是-43（UINavigationBar有一个像素的值）,不然一样达不到效果。&lt;/p&gt;
&lt;p&gt;实例代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.personSearch.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置状态栏的颜色为红色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UINavigationBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navigationBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationBar alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;43.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:navigationBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UIScrollView的touchesBegan和touchesEnd</title><link>https://zhangdapeng.dev/p/ios-uiscrollview-de-touchesbegan-he-touchesend/</link><pubDate>Fri, 13 Jun 2025 13:52:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uiscrollview-de-touchesbegan-he-touchesend/</guid><description>&lt;p&gt;使用UIScrollView的时候，总是调用不了touchesBegan和touchesEnd，还有另外的两个方法，经过查找是因为UIScrollViewDelegate没有这个方法，不过我们可以自己来定义这个方法，来调用父类的方法：&lt;/p&gt;
&lt;p&gt;touchScrollView.h&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// touchScrollView.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;touchScrollView&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIScrollView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;touchScrollView.m&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// touchScrollView.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-28.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;touchScrollView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;touchScrollView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithFrame:&lt;/span&gt;(CGRect)frame
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesBegan:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super touchesBegan:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.dragging )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self nextResponder] touchesBegan:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesEnded:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super touchesEnded:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( &lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.dragging )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self nextResponder] touchesEnded:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesCancelled:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super touchesEnded:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.dragging)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self nextResponder] touchesCancelled:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesMoved:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super touchesMoved:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;self.dragging)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[self nextResponder] touchesMoved:touches withEvent:event];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Only override drawRect: if you perform custom drawing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// An empty implementation adversely affects performance during animation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;- (void)drawRect:(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; // Drawing code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用方法可以这样&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; touchScrollView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scrollView;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS NSDate学习及常用操作</title><link>https://zhangdapeng.dev/p/ios-nsdate-xue-xi-ji-chang-yong-cao-zuo/</link><pubDate>Fri, 13 Jun 2025 13:40:03 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nsdate-xue-xi-ji-chang-yong-cao-zuo/</guid><description>&lt;h3 id="创建或初始化可用以下方法"&gt;&lt;a class="link" href="#1" &gt;创建或初始化可用以下方法&lt;/a&gt;
&lt;/h3&gt;&lt;h4 id="用于创建nsdate实例的类方法有"&gt;&lt;a class="link" href="#1-1" &gt;用于创建NSDate实例的类方法有&lt;/a&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)date; &lt;/code&gt;
返回当前时间&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;&lt;/code&gt;
返回以当前时间为基准，然后过了secs秒的时间,这里的值可以为负值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs; &lt;/code&gt;
返回以2001/01/01 GMT为基准，然后过了secs秒的时间，这里的值可以为负值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs; &lt;/code&gt;
返回以1970/01/01 GMT为基准，然后过了secs秒的时间，这里的值可以为负值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)distantFuture; &lt;/code&gt;
返回很多年以后的未来的某一天。（比如你需要一个比现在(Now)晚(大)很长时间的时间值，则可以调用该方法。测试返回了4000/12/31 16:00:00）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (id)distantPast; &lt;/code&gt;
返回很多年以前的某一天。（比如你需要一个比现在(Now)早(小)大很长时间的时间值，则可以调用该方法。测试返回了公元前0001/12/31 17:00:00）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="用于创建nsdate实例的实例方法有"&gt;&lt;a class="link" href="#1-1-1" &gt;用于创建NSDate实例的实例方法有&lt;/a&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;- (id)addTimeInterval:(NSTimeInterval)secs; &lt;/code&gt;
返回以目前的实例中保存的时间为基准，然后过了secs秒的时间，这里的值可以为负值&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="用于初始化nsdate实例的实例方法有"&gt;&lt;a class="link" href="#1-2" &gt;用于初始化NSDate实例的实例方法有&lt;/a&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (id)init; &lt;/code&gt;
初始化为当前时间。类似date方法&lt;br&gt;
初始化为以2001/01/01 GMT为基准，然后过了secs秒的时间。类似dateWithTimeIntervalSinceReferenceDate:方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate; &lt;/code&gt;
初始化为以refDate为基准，然后过了secs秒的时间，这里的值可以为负值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs; &lt;/code&gt;
初始化为以当前时间为基准，然后过了secs秒的时间，这里的值可以为负值&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="日期之间比较可用以下方法"&gt;&lt;a class="link" href="#2" &gt;日期之间比较可用以下方法&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (BOOL)isEqualToDate:(NSDate *)otherDate; &lt;/code&gt;
与otherDate比较，相同返回YES&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSDate *)earlierDate:(NSDate *)anotherDate; &lt;/code&gt;
与anotherDate比较，返回较早的那个日期&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSDate *)laterDate:(NSDate *)anotherDate; &lt;/code&gt;
与anotherDate比较，返回较晚的那个日期&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSComparisonResult)compare:(NSDate *)other;&lt;/code&gt;
该方法用于排序时调用:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当实例保存的日期值与anotherDate相同时返回NSOrderedSame&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当实例保存的日期值晚于anotherDate时返回NSOrderedDescending&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当实例保存的日期值早于anotherDate时返回NSOrderedAscending&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="取回时间间隔可用以下方法"&gt;&lt;a class="link" href="#3" &gt;取回时间间隔可用以下方法&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSTimeInterval)timeIntervalSinceDate:(NSDate \*)refDate; &lt;/code&gt;
以refDate为基准时间，返回实例保存的时间与refDate的时间间隔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSTimeInterval)timeIntervalSinceNow; &lt;/code&gt;
以当前时间(Now)为基准时间，返回实例保存的时间与当前时间(Now)的时间间隔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSTimeInterval)timeIntervalSince1970; &lt;/code&gt;
以1970/01/01 GMT为基准时间，返回实例保存的时间与1970/01/01 GMT的时间间隔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;- (NSTimeInterval)timeIntervalSinceReferenceDate; &lt;/code&gt;
以2001/01/01 GMT为基准时间，返回实例保存的时间与2001/01/01 GMT的时间间隔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+ (NSTimeInterval)timeIntervalSinceReferenceDate; &lt;/code&gt;
以2001/01/01 GMT为基准时间，返回当前时间(Now)与2001/01/01 GMT的时间间隔&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="将时间表示成字符串"&gt;&lt;a class="link" href="#4" &gt;将时间表示成字符串&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;- (NSString *)description; &lt;/code&gt;
以YYYY-MM-DD HH:MM:SS ±HHMM的格式表示时间。（其中 &amp;ldquo;±HHMM&amp;rdquo; 表示与GMT的存在多少小时多少分钟的时区差异。比如，若时区设置在北京，则 &amp;ldquo;±HHMM&amp;rdquo; 显示为 &amp;ldquo;+0800&amp;rdquo;）&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>自定义UIButton的时候遇到的小问题</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uibutton-de-shi-hou-yu-dao-de-xiao-wen-ti/</link><pubDate>Fri, 13 Jun 2025 11:35:03 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uibutton-de-shi-hou-yu-dao-de-xiao-wen-ti/</guid><description>&lt;p&gt;出现问题的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//选择按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;performerButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setFrame:CGRectMake(tip.frame.size.width&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;11.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;35.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(setTeleplayType:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.scrollView addSubview:performerButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;演员&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果是看不到你添加的标题。&lt;/p&gt;
&lt;p&gt;问题的关键是如何解决的，呵呵，蠢死我了，其实就是自己设计的button的宽度太小了，没有将字体显示出来.&lt;/p&gt;
&lt;p&gt;结果的代码如下修改就好：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//选择按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;performerButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setFrame:CGRectMake(tip.frame.size.width&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;11.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(setTeleplayType:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.scrollView addSubview:performerButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;演员&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[performerButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>How can a build engineer distribute an app on behalf of the team? (版本生成工程师如何代表一个团队分发一个app)</title><link>https://zhangdapeng.dev/p/how-can-a-build-engineer-distribute-an-app-on-behalf-of-the-team-ban-ben-sheng-cheng-gong-cheng-shi-ru-he-dai-biao-yi-ge-tuan-dui-fen-fa-yi-ge-app/</link><pubDate>Fri, 13 Jun 2025 11:34:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/how-can-a-build-engineer-distribute-an-app-on-behalf-of-the-team-ban-ben-sheng-cheng-gong-cheng-shi-ru-he-dai-biao-yi-ge-tuan-dui-fen-fa-yi-ge-app/</guid><description>&lt;p&gt;由于自己也在学习ios开发，也经常的会关注developer.app.com，因此今天有幸看到这篇文章，自己英语也不是很好，综合google和海词，大概了解了一下标题的意思，（&lt;code&gt;https://developer.apple.com/library/ios/#qa/qa1763/_index.html#//apple_ref/doc/uid/DTS40012165&lt;/code&gt;）这个是文章的地址，这里算是做个笔记，方便自己下次看看。这篇文章整体就是说代表一个团队分发一个app，应该是用于这个团队的测试使用吧。（也许有错，还希望大牛看到后 指点一下）。&lt;/p&gt;
&lt;p&gt;那么接下来的结局方案就是如下了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add the build engineer to the development team with the role of Admin through the &lt;a class="link" href="https://developer.apple.com/membercenter/index.action" target="_blank" rel="noopener"
 &gt;Member Center&lt;/a&gt;. For more information on defining team roles, see &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/ManagingYourTeam/ManagingYourTeam.html#/apple_ref/doc/uid/TP40012582-CH16-SW1" target="_blank" rel="noopener"
 &gt;Managing Your Team&lt;/a&gt;. The Admin role is required to manage the team distribution certificate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the distribution build will be submitted to the App Store, add the build engineer to the team users on &lt;a class="link" href="https://itunesconnect.apple.com/" target="_blank" rel="noopener"
 &gt;iTunes Connect&lt;/a&gt; with the role of Technical User. This allows the build engineer to log into iTunes Connect with their own credentials while submitting the app. Skip this step if the build is being used for Ad Hoc beta testing. For more info about the Technical User role in iTunes Connect, see &lt;a class="link" href="http://developer.apple.com/library/mac/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/7_ManagingYourTeam/ManagingYourTeam.html#/apple_ref/doc/uid/TP40011225-CH2-SW1" target="_blank" rel="noopener"
 &gt;Managing Users&lt;/a&gt; in the iTunes Connect Developer Guide.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The build engineer should then…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Create a new distribution certificate according to &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/CodeSigningYourApps/CodeSigningYourApps.html#/apple_ref/doc/uid/TP40012582-CH23-SW1" target="_blank" rel="noopener"
 &gt;Creating Your Certificates&lt;/a&gt;. If the team distribution certificate already exists, it must be revoked and recreated by the build engineer according to &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificatesandProvisioningAssets/MaintainingCertificatesandProvisioningAssets.html#/apple_ref/doc/uid/TP40012582-CH20-SW8" target="_blank" rel="noopener"
 &gt;Re-Creating Certificates and Updating Related Provisioning Profiles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a distribution profile using the steps in &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html#/apple_ref/doc/uid/TP40012582-CH9-SW12" target="_blank" rel="noopener"
 &gt;Creating Store Provisioning Profiles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Download and install the distribution provisioning profile by dragging it onto the Xcode or iTunes icons on the dock.&lt;/li&gt;
&lt;li&gt;Define a Bundle Identifier in Xcode that is compatible with the App ID for the app using the steps in &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/ConfiguringYourApp/ConfiguringYourApp.html#/apple_ref/doc/uid/TP40012582-CH13-SW16" target="_blank" rel="noopener"
 &gt;Setting the Bundle ID&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Assign the distribution provisioning profile to the &amp;lsquo;Release&amp;rsquo; Code Signing Identity with the Xcode project Target level Build Settings.&lt;/li&gt;
&lt;li&gt;Depending on your intended distribution method, follow the steps in &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html#/apple_ref/doc/uid/TP40012582-CH9-SW1" target="_blank" rel="noopener"
 &gt;Submitting Your App&lt;/a&gt; or &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html#/apple_ref/doc/uid/TP40012582-CH8-SW1" target="_blank" rel="noopener"
 &gt;Beta Testing your iOS App&lt;/a&gt; respectively.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我就直接复制了一下，其实步骤很简单的，基本上能够看的明白。&lt;/p&gt;
&lt;p&gt;只不过这里提到了几点Importment：&lt;/p&gt;
&lt;p&gt;This Q&amp;amp;A is exclusively for iOS App Store apps. The process within this document should not be followed for the Enterprise Developer Program. Please consult &lt;a class="link" href="https://developer.apple.com/support/technical/submit/" target="_blank" rel="noopener"
 &gt;Apple DTS&lt;/a&gt; with any questions before leveraging this document, or if you are unsure of your developer program type.&lt;/p&gt;
&lt;p&gt;这条就是说这个需求不适合企业开发者项目，显然不是企业开发者，就是个人的喽，呵呵。&lt;/p&gt;
&lt;p&gt;另外一点就是&lt;/p&gt;
&lt;p&gt;A single email address has access to only one iTunes Connect account, unlike the Member Center, which supports multiple teams per Apple ID. Therefore the build engineer must supply a new unique email address that is not already associated to another iTunes Connect account.&lt;/p&gt;
&lt;p&gt;一个email地址只允许链接一个iTunes账户，作为一个bulid enginner 必须有一个email，这个email没有链接多个iTunes账户。好了就这么多了。有不懂的大家一起探讨&lt;/p&gt;</description></item><item><title>NSDateFormatter setDateFormat 自定义日期/时间格式</title><link>https://zhangdapeng.dev/p/nsdateformatter-setdateformat-zi-ding-yi-ri-qi-shi-jian-ge-shi/</link><pubDate>Fri, 13 Jun 2025 11:34:56 +0000</pubDate><guid>https://zhangdapeng.dev/p/nsdateformatter-setdateformat-zi-ding-yi-ri-qi-shi-jian-ge-shi/</guid><description>&lt;p&gt;NSDateFormatter自定义日期/时间格式 ,简单的举一个例子，看下面的代码就可以了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[dateFormatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dateValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ((UIDatePicker &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender).date;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.teleplayDate.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter stringFromDate:dateValue];&lt;span style="color:#75715e"&gt;//[NSString stringWithFormat:@&amp;#34;%@&amp;#34;,dateValue];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.wantToSaveTeleplayDate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.teleplayDate.text;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面附上几个格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yyyy:MM:dd G &lt;span style="color:#e6db74"&gt;&amp;#39;at&amp;#39;&lt;/span&gt; HH:mm:ss zzz 1996.07.10 AD at 15:08:56 PDT 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;EEE, MMM d, &lt;span style="color:#e6db74"&gt;&amp;#34;yy Wed,july 10, &amp;#39;99 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;h:mm a 12:08 PM 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;hh &amp;#39;o&amp;#34;&lt;/span&gt;clock&lt;span style="color:#e6db74"&gt;&amp;#39; a,zzzz 12 o&amp;#39;&lt;/span&gt;clock PM, Pacific Daylight Time 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;K:mm a, z 0:00 PM, PST 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yyyyy,MMMM.dd GGG hh:mm aaa 01996.july.10 AD 12:08 PM 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面是得到当前的年，月，日，时，分，秒。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSCalendar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSCalendar currentCalendar]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; unitFlags &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSYearCalendarUnit &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NSMonthCalendarUnit &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NSDayCalendarUnit &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NSHourCalendarUnit &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NSMinuteCalendarUnit &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NSSecondCalendarUnit; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateComponents &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cal components:unitFlags fromDate:date]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd year]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd month]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd day]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; h &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd hour]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd minute]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dd second];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然不止这些的，有兴趣的可以去参考一下：http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns&lt;/p&gt;</description></item><item><title>iOS 自定义的UIActionSheet 完整版</title><link>https://zhangdapeng.dev/p/ios-zi-ding-yi-de-uiactionsheet-wan-zheng-ban/</link><pubDate>Fri, 13 Jun 2025 11:34:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-ding-yi-de-uiactionsheet-wan-zheng-ban/</guid><description>&lt;p&gt;自定义的UIActionSheet ，网上找了好久，都没有完整的解决办法，于是自己 经过查找资料，然后根据自己的项目需要做了一些改动，得到了一个完整版的，自定义的UIActionSheet,代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setUpDatePicker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//点击显示时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.actionSheet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIActionSheet alloc] initWithTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destructiveButtonTitle:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cancelButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;取消&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UISegmentedControl &lt;span style="color:#f92672"&gt;*&lt;/span&gt;confirmButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:&lt;span style="color:#e6db74"&gt;@&amp;#34;确定&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Add the picker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.datePicker &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIDatePicker alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.datePicker.datePickerMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIDatePickerModeDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.datePicker addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(dateChanged:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet addSubview:self.datePicker];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet setBounds:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect pickerRect;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.datePicker.bounds;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickerRect.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.datePicker.bounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pickerRect;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButton.momentary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButton.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;65.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButton.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cancelButton addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(DatePickerDoneClick:) forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet addSubview:cancelButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButton.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confirmButton.momentary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confirmButton.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;245.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;65.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confirmButton.segmentedControlStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UISegmentedControlStyleBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [confirmButton addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(DatePickerDoneClick:) forControlEvents:UIControlEventValueChanged];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet addSubview:confirmButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confirmButton.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet showInView:self.view];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet setBounds:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;DatePickerDoneClick:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;) sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;button &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(button.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet dismissWithClickedButtonIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(button.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.actionSheet dismissWithClickedButtonIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;dateChanged:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDate &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDateFormatter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dateFormatter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dateFormatter setDateFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dateValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ((UIDatePicker &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender).date;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.teleplayDate.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dateFormatter stringFromDate:dateValue];&lt;span style="color:#75715e"&gt;//[NSString stringWithFormat:@&amp;#34;%@&amp;#34;,dateValue];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里简单的解释一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;-(void) setUpDatePicker方法用于调用UIDatePicker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(void) DatePickerDoneClick:(id) sender方法用于实现隐藏UIdatePicker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(void) dateChanged:(id)sender方法实现获取日期结果值的方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有实现效果，别忘记加上协议，这个是比较容易忘记的&lt;/p&gt;</description></item><item><title>iOS关于NSString追加字符串的问题</title><link>https://zhangdapeng.dev/p/ios-guan-yu-nsstring-zhui-jia-zi-fu-chuan-de-wen-ti/</link><pubDate>Fri, 13 Jun 2025 11:34:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-guan-yu-nsstring-zhui-jia-zi-fu-chuan-de-wen-ti/</guid><description>&lt;p&gt;IOS关于NSString追加字符串的问题，网上也有不少的做法，比较多的做法是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSMutableStringalloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[str stringByAppendingString:&lt;span style="color:#e6db74"&gt;@&amp;#34;eee&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#75715e"&gt;//问题行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//一开始的时候怎样修改都追加不上，类型也换了
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//应该是：把追加后的值回传给要追加的原对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;str&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[str stringByAppendingString:&lt;span style="color:#e6db74"&gt;@&amp;#34;eee&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#75715e"&gt;//正确
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是使用上面的方法，我不知道你们有没有遇到有类型不对的提示，总之我这里是有的，于是我将上面这样改了一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;str&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSMutableStringalloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;dd&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[str stringByAppendingString:&lt;span style="color:#e6db74"&gt;@&amp;#34;eee&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#75715e"&gt;//问题行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(str);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一开始的时候怎样修改都追加不上，类型也换了
应该是：把追加后的值回传给要追加的原对象&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;str&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[str stringByAppendingString:&lt;span style="color:#e6db74"&gt;@&amp;#34;eee&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#75715e"&gt;//正确
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;警告消失了。&lt;/p&gt;</description></item><item><title>iOS 点击屏幕任意空白处，键盘消失</title><link>https://zhangdapeng.dev/p/ios-dian-ji-ping-mu-ren-yi-kong-bai-chu-jian-pan-xiao-shi/</link><pubDate>Fri, 13 Jun 2025 11:34:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-dian-ji-ping-mu-ren-yi-kong-bai-chu-jian-pan-xiao-shi/</guid><description>&lt;p&gt;点击屏幕任意空白处，键盘消失的方法：&lt;/p&gt;
&lt;p&gt;在这个方法里面实现就好了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;touchesBegan:&lt;/span&gt;(NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)touches &lt;span style="color:#a6e22e"&gt;withEvent:&lt;/span&gt;(UIEvent &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)event
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.teleplayDescription resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.teleplayTitle resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.teleplayContactPeople resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.teleplayContactPeoplePhone resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UIView下面有UITextField,键盘弹出影响输入TextField的内容，解决办法</title><link>https://zhangdapeng.dev/p/ios-uiview-xia-mian-you-uitextfield-jian-pan-dan-chu-ying-xiang-shu-ru-textfield-de-nei-rong-jie-jue-ban-fa/</link><pubDate>Fri, 13 Jun 2025 11:34:40 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uiview-xia-mian-you-uitextfield-jian-pan-dan-chu-ying-xiang-shu-ru-textfield-de-nei-rong-jie-jue-ban-fa/</guid><description>&lt;p&gt;在viewdidload的时候，把每个TextField设好tag。之后就可以根据最下面的UITextField的内容来判断键盘的弹出和关闭了&lt;/p&gt;
&lt;p&gt;实例代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldDidBeginEditing:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ &lt;span style="color:#75715e"&gt;//当点触textField内部，开始编辑都会调用这个方法。textField将成为first responder 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (textField.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimeInterval animationDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.30f&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;-=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;216&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.size.height &lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;216&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;ResizeView&amp;#34;&lt;/span&gt;context:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:animationDuration]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldReturn:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#75715e"&gt;//当用户按下ruturn，把焦点从textField移开那么键盘就会消失了 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// textField
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (textField.tag &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimeInterval animationDuration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.30f&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.view.frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.origin.y &lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;216&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; frame.size. height &lt;span style="color:#f92672"&gt;-=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;216&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//self.view移回原位置 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;ResizeView&amp;#34;&lt;/span&gt;context:nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:animationDuration]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.view.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [textField resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; returnYES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UITextField的学习</title><link>https://zhangdapeng.dev/p/ios-uitextfield-de-xue-xi/</link><pubDate>Fri, 13 Jun 2025 11:34:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uitextfield-de-xue-xi/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初始化textfield并设置位置及大小&lt;br&gt;
&lt;code&gt;UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置边框样式，只有设置了才会显示边框样式&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.borderStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextBorderStyleRoundedRect; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextBorderStyleNone, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextBorderStyleLine, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextBorderStyleBezel, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextBorderStyleRoundedRect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITextBorderStyle; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设置输入框的背景颜色，此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉
&lt;code&gt;text.backgroundColor = [UIColor whiteColor]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置背景&lt;br&gt;
&lt;code&gt;text.background = [UIImage imageNamed:@&amp;quot;dd.png&amp;quot;]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置背景&lt;br&gt;
&lt;code&gt;text.disabledBackground = [UIImage imageNamed:@&amp;quot;cc.png&amp;quot;]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当输入框没有内容时，水印提示 提示内容为password&lt;br&gt;
&lt;code&gt;text.placeholder = @&amp;quot;password&amp;quot;; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置输入框内容的字体样式和大小&lt;br&gt;
&lt;code&gt;text.font = [UIFont fontWithName:@&amp;quot;Arial&amp;quot; size:20.0f]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置字体颜色&lt;br&gt;
&lt;code&gt;text.textColor = [UIColor redColor]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入框中是否有个叉号，在什么时候显示，用于一次性删除输入框中的内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.clearButtonMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextFieldViewModeAlways; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeNever, &lt;span style="color:#75715e"&gt;// 重不出现 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeWhileEditing, &lt;span style="color:#75715e"&gt;//编辑时出现 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeUnlessEditing, &lt;span style="color:#75715e"&gt;// 除了编辑外都出现 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeAlways &lt;span style="color:#75715e"&gt;// 一直出现 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITextFieldViewMode; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;输入框中一开始就有的文字&lt;br&gt;
&lt;code&gt;text.text = @&amp;quot;一开始就在输入框的文字&amp;quot;; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每输入一个字符就变成点 用语密码输入&lt;br&gt;
&lt;code&gt;text.secureTextEntry = YES; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;是否纠错&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.autocorrectionType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocorrectionTypeNo; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocorrectionTypeDefault, &lt;span style="color:#75715e"&gt;// 默认 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocorrectionTypeNo, &lt;span style="color:#75715e"&gt;// 不自动纠错 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocorrectionTypeYes, &lt;span style="color:#75715e"&gt;// 自动纠错 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITextAutocorrectionType; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;再次编辑就清空&lt;br&gt;
&lt;code&gt;text.clearsOnBeginEditing = YES; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内容对齐方式&lt;br&gt;
&lt;code&gt;text.textAlignment = UITextAlignmentLeft; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内容的垂直对齐方式 UITextField继承自UIControl, 此类中有一个属性contentVerticalAlignment&lt;br&gt;
&lt;code&gt;text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动
&lt;code&gt;textFied.adjustsFontSizeToFitWidth = YES; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置自动缩小显示的最小字体大小&lt;br&gt;
&lt;code&gt;text.minimumFontSize = 20; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置键盘的样式&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.keyboardType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIKeyboardTypeNumberPad; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeDefault, &lt;span style="color:#75715e"&gt;// 默认键盘，支持所有字符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeASCIICapable, &lt;span style="color:#75715e"&gt;// 支持ASCII的默认键盘 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeNumbersAndPunctuation, &lt;span style="color:#75715e"&gt;// 标准电话键盘，支持＋＊＃字符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeURL, &lt;span style="color:#75715e"&gt;// URL键盘，支持.com按钮 只支持URL字符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeNumberPad, &lt;span style="color:#75715e"&gt;// 数字键盘 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypePhonePad, &lt;span style="color:#75715e"&gt;// 电话键盘 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeNamePhonePad, &lt;span style="color:#75715e"&gt;// 电话键盘，也支持输入人名 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeEmailAddress, &lt;span style="color:#75715e"&gt;// 用于输入电子 邮件地址的键盘
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeDecimalPad, &lt;span style="color:#75715e"&gt;// 数字键盘 有数字和小数点 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeTwitter, &lt;span style="color:#75715e"&gt;// 优化的键盘，方便输入@、#字符 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardTypeAlphabet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIKeyboardTypeASCIICapable, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIKeyboardType; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;首字母是否大写&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.autocapitalizationType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocapitalizationTypeNone; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocapitalizationTypeNone, &lt;span style="color:#75715e"&gt;// 不自动大写 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocapitalizationTypeWords, &lt;span style="color:#75715e"&gt;// 单词首字母大写 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocapitalizationTypeSentences, &lt;span style="color:#75715e"&gt;// 句子的首字母大写 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextAutocapitalizationTypeAllCharacters, &lt;span style="color:#75715e"&gt;// 所有字母都大写 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITextAutocapitalizationType; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;return键变成什么键&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.returnKeyType &lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIReturnKeyDone; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyDefault, &lt;span style="color:#75715e"&gt;// 默认 灰色按钮，标有Return 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyGo, &lt;span style="color:#75715e"&gt;// 标有Go的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyGoogle, &lt;span style="color:#75715e"&gt;// 标有Google的蓝色按钮，用语搜索 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyJoin, &lt;span style="color:#75715e"&gt;// 标有Join的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyNext, &lt;span style="color:#75715e"&gt;// 标有Next的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyRoute, &lt;span style="color:#75715e"&gt;// 标有Route的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeySearch, &lt;span style="color:#75715e"&gt;// 标有Search的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeySend, &lt;span style="color:#75715e"&gt;// 标有Send的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyYahoo, &lt;span style="color:#75715e"&gt;// 标有Yahoo的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyYahoo, &lt;span style="color:#75715e"&gt;// 标有Yahoo的蓝色按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIReturnKeyEmergencyCall, &lt;span style="color:#75715e"&gt;// 紧急呼叫按钮 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIReturnKeyType; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;键盘外观&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;textView.keyboardAppearance&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIKeyboardAppearanceDefault&lt;span style="color:#960050;background-color:#1e0010"&gt;；&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardAppearanceDefault&lt;span style="color:#960050;background-color:#1e0010"&gt;，&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 默认外观，浅灰色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UIKeyboardAppearanceAlert&lt;span style="color:#960050;background-color:#1e0010"&gt;，&lt;/span&gt;&lt;span style="color:#75715e"&gt;// 深灰 石墨色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIReturnKeyType; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设置代理 用于实现协议&lt;br&gt;
&lt;code&gt;text.delegate = self; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把textfield加到视图中&lt;br&gt;
&lt;code&gt;[self.window addSubview:text]; &lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最右侧加图片是以下代码 左侧类似&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UIImageView alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;right.png&amp;#34;&lt;/span&gt;]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.rightView&lt;span style="color:#f92672"&gt;=&lt;/span&gt;image; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.rightViewMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextFieldViewModeAlways; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeNever, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeWhileEditing, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeUnlessEditing, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	UITextFieldViewModeAlways 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITextFieldViewMode; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;按return键键盘往下收 becomeFirstResponder&lt;br&gt;
类要采用UITextFieldDelegate协议 &lt;code&gt;text.delegate = self;&lt;/code&gt; 声明text的代理是我，我会去实现把键盘往下收的方法 这个方法在UITextFieldDelegate里所以我们要采用UITextFieldDelegate这个协议&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldReturn:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[text resignFirstResponder]; &lt;span style="color:#75715e"&gt;//主要是[receiver resignFirstResponder]在哪调用就能把receiver对应的键盘往下收 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="重写绘制行为"&gt;&lt;a class="link" href="#1" &gt;重写绘制行为&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;除了UITextField对象的风格选项，你还可以定制化UITextField对象，为他添加许多不同的重写方法，来改变文本字段的显示行为。这些方法都会返回一个CGRect结构，制定了文本字段每个部件的边界范围。以下方法都可以重写。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;textRectForBounds: // 重写来重置文字区域&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;drawTextInRect: // 改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数，就不用调用super了.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;placeholderRectForBounds: // 重写来重置占位符区域&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;drawPlaceholderInRect: // 重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数，就不用调用super了.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;borderRectForBounds: // 重写来重置边缘区域&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;editingRectForBounds: // 重写来重置编辑区域&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;clearButtonRectForBounds: // 重写来重置clearButton位置,改变size可能导致button的图片失真&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;leftViewRectForBounds:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rightViewRectForBounds:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="委托方法"&gt;&lt;a class="link" href="#2" &gt;委托方法&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldBeginEditing:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//返回一个BOOL值，指定是否循序文本字段开始编辑 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldDidBeginEditing:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//开始编辑时触发，文本字段将成为first responder 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldEndEditing:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//返回BOOL值，指定是否允许文本字段结束编辑，当编辑结束，文本字段会让出first responder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//要想在用户结束编辑时阻止文本字段消失，可以返回NO 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//这对一些文本字段必须始终保持活跃状态的程序很有用，比如即时消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textField:&lt;/span&gt;(UITextField&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField &lt;span style="color:#a6e22e"&gt;shouldChangeCharactersInRange:&lt;/span&gt;(NSRange)range &lt;span style="color:#a6e22e"&gt;replacementString:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//当用户使用自动更正功能，把输入的文字修改为推荐的文字时，就会调用这个方法。 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//这对于想要加入撤销选项的应用程序特别有用 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//可以跟踪字段内所做的最后一次修改，也可以对所有编辑做日志记录,用作审计用途。 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//要防止文字被改变可以返回NO 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//这个方法的参数中有一个NSRange对象，指明了被改变文字的位置，建议修改的文本也在其中 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldClear:&lt;/span&gt;(UITextField &lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//返回一个BOOL值指明是否允许根据用户请求清除内容 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//可以设置在特定条件下才允许清除内容 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textFieldShouldReturn:&lt;/span&gt;(UITextField &lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//返回一个BOOL值，指明是否允许在按下回车键时结束编辑 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//如果允许要调用resignFirstResponder 方法，这回导致结束编辑，而键盘会被收起[textField resignFirstResponder]; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//查一下resign这个单词的意思就明白这个方法了 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="通知"&gt;&lt;a class="link" href="#3" &gt;通知&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;UITextField派生自UIControl，所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件，你还可以使用下列UITextField类特有的事件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UITextFieldTextDidBeginEditingNotification&lt;/li&gt;
&lt;li&gt;UITextFieldTextDidChangeNotification&lt;/li&gt;
&lt;li&gt;UITextFieldTextDidEndEditingNotification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。&lt;br&gt;
因为文本字段要使用键盘输入文字，所以下面这些事件发生时，也会发送动作通知&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UIKeyboardWillShowNotification //键盘显示之前发送&lt;/li&gt;
&lt;li&gt;UIKeyboardDidShowNotification //键盘显示之后发送&lt;/li&gt;
&lt;li&gt;UIKeyboardWillHideNotification //键盘隐藏之前发送&lt;/li&gt;
&lt;li&gt;UIKeyboardDidHideNotification //键盘隐藏之后发送&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;限制只能输入特定的字符&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)textField:(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSCharacterSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cs;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filtered &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//按cs分离出数组,数组按@&amp;#34;&amp;#34;分离出字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; canChange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [string isEqualToString:filtered];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; canChange;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面那个NUMBERS是一个宏，可以在文件顶部定义：&lt;br&gt;
&lt;code&gt;#define NUMBERS @”0123456789\n”&lt;/code&gt; （这个代表可以输入数字和换行，请注意这个\n，如果不写这个，Done按键将不会触发，如果用在SearchBar中，将会不触发Search事件，因为你自己限制不让输入\n，好惨，我在项目中才发现的。）&lt;br&gt;
所以，如果你要限制输入英文和数字的话，就可以把这个定义为：&lt;br&gt;
&lt;code&gt;#define kAlphaNum @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″&lt;/code&gt;。&lt;br&gt;
当然，你还可以在以上方法return之前，做一提示的，比如提示用户只能输入数字之类的。如果你觉得有需要的话。&lt;br&gt;
&lt;strong&gt;限制只能输入一定长度的字符&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textField:&lt;/span&gt;(UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textField &lt;span style="color:#a6e22e"&gt;shouldChangeCharactersInRange:&lt;/span&gt;(NSRange)range &lt;span style="color:#a6e22e"&gt;replacementString:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)string 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//string就是此时输入的那个字符 textField就是此时正在输入的那个输入框 返回YES就是可以改变输入框的值 NO相反
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([string isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;]) &lt;span style="color:#75715e"&gt;//按会车可以改变
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} 	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt; toBeString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [textField.text stringByReplacingCharactersInRange:range withString:string]; &lt;span style="color:#75715e"&gt;//得到输入框的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.myTextField &lt;span style="color:#f92672"&gt;==&lt;/span&gt; textField) &lt;span style="color:#75715e"&gt;//判断是否时我们想要限定的那个输入框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([toBeString length] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;//如果输入框内容大于20则弹出警告
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			textField.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [toBeString substringToIndex:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alert &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIAlertView alloc] initWithTitle:nil message:&lt;span style="color:#e6db74"&gt;@&amp;#34;超过最大字数不能输入了&amp;#34;&lt;/span&gt; delegate:nil cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;Ok&amp;#34;&lt;/span&gt; otherButtonTitles:nil, nil] autorelease]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			[alert show]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UITextView的placeHolder的设置</title><link>https://zhangdapeng.dev/p/ios-uitextview-de-placeholder-de-she-zhi/</link><pubDate>Fri, 13 Jun 2025 11:34:32 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uitextview-de-placeholder-de-she-zhi/</guid><description>&lt;p&gt;我在用UITextView的时候，默认是不能设置placeholder的，于是网上找了一些资料，最后找到了一个别人写的自定义类，拿来用用，顺便分享一下。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CPTextViewPlaceholder.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Cassius Pacheco
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Cassius Pacheco on 30/01/13.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013 Cassius Pacheco. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CPTextViewPlaceholder.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CPTextViewPlaceholder&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UITextAutocorrectionType originalCorrection;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;placeholderColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;originalTextColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;getter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; isUsingPlaceholder) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; usingPlaceholder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;getter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; isSettingPlaceholder) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; settingPlaceholder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CPTextViewPlaceholder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark Life Cycle method
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithCoder:&lt;/span&gt;(NSCoder &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)aDecoder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithCoder:aDecoder]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.placeholderColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor lightGrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalCorrection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.autocorrectionType;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalTextColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super.textColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(didBeginEditing) name:UITextViewTextDidBeginEditingNotification object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(didEndEditing) name:UITextViewTextDidEndEditingNotification object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(textDidChange:) name:UITextViewTextDidChangeNotification object:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidBeginEditingNotification object:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidEndEditingNotification object:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;layoutSubviews&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super layoutSubviews];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Fixes iOS 5.x cursor when becomeFirstResponder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([UIDevice currentDevice].systemVersion.floatValue &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6.000000&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; self.isFirstResponder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark Notifications
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didBeginEditing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self sendCursorToBeginning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didEndEditing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.text.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setupPlaceholder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;textDidChange:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)notification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//self.text received the placeholder text by CPTex tViewPlaceholder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isSettingPlaceholder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.text.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setupPlaceholder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.usingPlaceholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSRange range &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.text rangeOfString:self.placeholder options:NSLiteralSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (range.location &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; NSNotFound) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;newText &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.text stringByReplacingCharactersInRange:range withString:&lt;span style="color:#e6db74"&gt;@&amp;#34;&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.originalTextColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.autocorrectionType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.originalCorrection;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//User pasted a text equals to placeholder or setText was called
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([newText isEqualToString:self.placeholder]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self sendCursorToEnd];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//this is necessary for iOS 5.x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newText.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setupPlaceholder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; newText;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;canPerformAction:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;SEL&lt;/span&gt;)action &lt;span style="color:#a6e22e"&gt;withSender:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; action &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(paste:)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [super canPerformAction:action withSender:sender];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark - Getters and Setters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setAutocorrectionType:&lt;/span&gt;(UITextAutocorrectionType)autocorrectionType
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setAutocorrectionType:autocorrectionType];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalCorrection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; autocorrectionType;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setPlaceholder:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)placeholder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _placeholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; placeholder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder &lt;span style="color:#f92672"&gt;||&lt;/span&gt; self.text.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setupPlaceholder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setTextColor:&lt;/span&gt;(UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)textColor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setTextColor:textColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.originalTextColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; textColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelectedRange:&lt;/span&gt;(NSRange)selectedRange
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self sendCursorToBeginning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelectedRange:selectedRange];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelectedTextRange:&lt;/span&gt;(UITextRange &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)selectedTextRange
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.isUsingPlaceholder) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self sendCursorToBeginning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelectedTextRange:selectedTextRange];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma mark Utilities methods
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setupPlaceholder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.autocorrectionType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocorrectionTypeNo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.usingPlaceholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.settingPlaceholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.placeholder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.settingPlaceholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.placeholderColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self sendCursorToBeginning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sendCursorToBeginning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(cursorToBeginning) withObject:nil afterDelay:&lt;span style="color:#ae81ff"&gt;0.01&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;cursorToBeginning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.selectedRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSMakeRange(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sendCursorToEnd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(cursorToEnd) withObject:nil afterDelay:&lt;span style="color:#ae81ff"&gt;0.01&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;cursorToEnd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super.selectedRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSMakeRange(self.text.length, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CPTextViewPlaceholder.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Cassius Pacheco
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by Cassius Pacheco on 30/01/13.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013 Cassius Pacheco. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CPTextViewPlaceholder&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;placeholder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS segue的使用</title><link>https://zhangdapeng.dev/p/ios-segue-de-shi-yong/</link><pubDate>Fri, 13 Jun 2025 10:13:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-segue-de-shi-yong/</guid><description>&lt;p&gt;在storyboard中，segue有几种不同的类型，在iphone和ipad的开发中，segue的类型是不同的。&lt;/p&gt;
&lt;p&gt;在iphone中，segue有：push，modal，和custom三种不同的类型，这些类型的区别在与新页面出现的方式。&lt;/p&gt;
&lt;p&gt;而在ipad中，有push，modal，popover，replace和custom五种不同的类型。&lt;/p&gt;
&lt;p&gt;根据这几个特点，同时自己有观看了，斯坦福大学的公开课，里面也是有关于此方面的应用。废话少说，将自己的实例放上来吧。&lt;/p&gt;
&lt;p&gt;里面的内容大部分跟课程里面的内容差不多&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PsychologistViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Psychologist
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-26.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;PsychologistViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;happinessViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PsychologistViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; diagnosis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PsychologistViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; diagnosis &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _diagnosis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setAndShowDiagnosis:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)diagnosis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.diagnosis &lt;span style="color:#f92672"&gt;=&lt;/span&gt; diagnosis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self performSegueWithIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;showDiagnosis&amp;#34;&lt;/span&gt; sender:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;prepareForSegue:&lt;/span&gt;(UIStoryboardSegue &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)segue &lt;span style="color:#a6e22e"&gt;sender:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([segue.identifier isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;showDiagnosis&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [segue.destinationViewController setHappiness:self.diagnosis];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([segue.identifier isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;movie&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [segue.destinationViewController setHappiness:&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([segue.identifier isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;teleplay&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [segue.destinationViewController setHappiness:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([segue.identifier isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;cartoon&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [segue.destinationViewController setHappiness:&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;flaying:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setAndShowDiagnosis:&lt;span style="color:#ae81ff"&gt;86&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;bite:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setAndShowDiagnosis:&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;play:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setAndShowDiagnosis:&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PsychologistViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Psychologist
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-26.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PsychologistViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;flaying:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;bite:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;play:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// faceView.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happiness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;faceView&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@protocol&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FaceViewDataSource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;smileForFaceView:&lt;/span&gt;(faceView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;faceView&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) CGFloat scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pinch:&lt;/span&gt;(UIPinchGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)gesture;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;weak&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;FaceViewDataSource&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; dataSource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// faceView.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happiness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;faceView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define DEFAULT_SCALE 0.90
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define EYE_H 0.35
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define EYE_V 0.35
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define EYE_RADIUS 0.10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MOUTH_H 0.45
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MOUTH_V 0.40
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MOUTH_SMILE 0.25
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;faceView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; scale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(CGFloat) &lt;span style="color:#a6e22e"&gt;scale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;_scale)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; DEFAULT_SCALE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; _scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setScale:&lt;/span&gt;(CGFloat)scale
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(scale &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; _scale)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _scale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setNeedsDisplay];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;pinch:&lt;/span&gt;(UIPinchGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)gesture
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;((gesture.state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIGestureRecognizerStateChanged) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; (gesture.state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIGestureRecognizerStateEnded))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.scale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; gesture.scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gesture.scale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.contentMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIViewContentModeRedraw;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;awakeFromNib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setup];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithFrame:&lt;/span&gt;(CGRect)frame
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setup];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;drawCircleAtPoint:&lt;/span&gt;(CGPoint)p &lt;span style="color:#a6e22e"&gt;withRadius:&lt;/span&gt;(CGFloat)radius &lt;span style="color:#a6e22e"&gt;inContext:&lt;/span&gt;(CGContextRef)context
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsPushContext(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextBeginPath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddArc(context, p.x, p.y, radius, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; , &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;M_PI, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextStrokePath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIGraphicsPopContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Only override drawRect: if you perform custom drawing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// An empty implementation adversely affects performance during animation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//face
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint midPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; midPoint.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.bounds.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; self.bounds.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; midPoint.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.bounds.origin.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; self.bounds.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.bounds.size.width &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(self.bounds.size.height &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; self.bounds.size.width) size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.bounds.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; self.scale;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineWidth(context, &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[UIColor blueColor] setStroke];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self drawCircleAtPoint:midPoint withRadius:size inContext: context];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//eye
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint eyePoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; eyePoint.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; midPoint.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; EYE_H;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; eyePoint.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; midPoint.y &lt;span style="color:#f92672"&gt;-&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; EYE_V;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self drawCircleAtPoint:eyePoint withRadius:size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; EYE_RADIUS inContext:context];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; eyePoint.x &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; EYE_H &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self drawCircleAtPoint:eyePoint withRadius:size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; EYE_RADIUS inContext:context];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//mouth
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint mouthStartPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthStartPoint.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; midPoint.x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; MOUTH_H;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthStartPoint.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; midPoint.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; MOUTH_V;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint mouthEndPoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mouthStartPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthEndPoint.x &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; MOUTH_H &lt;span style="color:#f92672"&gt;*&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint mouthCP1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mouthStartPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthCP1.x &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; MOUTH_H &lt;span style="color:#f92672"&gt;*&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint mouthCP2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mouthEndPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthCP2.x &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; MOUTH_V &lt;span style="color:#f92672"&gt;*&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; smile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.dataSource smileForFaceView:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(smile &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) smile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(smile &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) smile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat smileOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MOUTH_SMILE &lt;span style="color:#f92672"&gt;*&lt;/span&gt; size &lt;span style="color:#f92672"&gt;*&lt;/span&gt; smile;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthCP1.y &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; smileOffset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mouthCP2.y &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; smileOffset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextBeginPath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextMoveToPoint(context, mouthStartPoint.x, mouthStartPoint.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddCurveToPoint(context, mouthCP1.x, mouthCP1.y, mouthCP2.x, mouthCP2.y, mouthEndPoint.x, mouthEndPoint.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextStrokePath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Drawing code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happinessViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happiness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;happinessViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;faceView.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;happinessViewController&lt;/span&gt; ()&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;FaceViewDataSource&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;weak&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; faceView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;faceView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;happinessViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; happiness &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _happiness;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; faceView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _faceView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setHappiness:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;)happiness
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _happiness &lt;span style="color:#f92672"&gt;=&lt;/span&gt; happiness;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.faceView setNeedsDisplay];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setFaceView:&lt;/span&gt;(faceView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)faceView
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _faceView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; faceView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.faceView addGestureRecognizer:[[UIPinchGestureRecognizer alloc] initWithTarget:self.faceView action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(pinch:)]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.faceView addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(handleHappinessGesture:)]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.faceView.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;handleHappinessGesture:&lt;/span&gt;(UIPanGestureRecognizer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)gesture
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(gesture.state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIGestureRecognizerStateChanged &lt;span style="color:#f92672"&gt;||&lt;/span&gt; gesture.state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UIGestureRecognizerStateEnded)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint translation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [gesture translationInView:self.faceView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.happiness &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; translation.y &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [gesture setTranslation:CGPointZero inView:self.faceView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;smileForFaceView:&lt;/span&gt;(faceView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (self.happiness &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50.0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)toInterfaceOrientation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happinessViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// happiness
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-23.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;happinessViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; happiness; &lt;span style="color:#75715e"&gt;//0 代表不开心 100 代表开心
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;应用截图相册地址：http://my.poco.cn/album/album_show_photo_list.htx&amp;amp;user_id=173673909&amp;amp;set_hash=3946768073&lt;/p&gt;</description></item><item><title>将UISearchBar放在UINavigationBar之上</title><link>https://zhangdapeng.dev/p/jiang-uisearchbar-fang-zai-uinavigationbar-zhi-shang/</link><pubDate>Fri, 13 Jun 2025 10:13:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/jiang-uisearchbar-fang-zai-uinavigationbar-zhi-shang/</guid><description>&lt;p&gt;将UISearchBar放在UINavigationBar之上,实现的过程如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view from its nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加左侧的item
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;leftItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;艺人&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UIBarButtonItemStyleBordered target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(showSelect)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; leftItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//导航条的搜索条
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _searchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;44.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _searchBar.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchBar setTintColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_searchBar setPlaceholder:&lt;span style="color:#e6db74"&gt;@&amp;#34;输入艺人名字&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将搜索条放在一个UIView上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;768&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [searchView addSubview:_searchBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationItem.titleView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; searchView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置tableview的代理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataTable.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//加载数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;category&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果说你的searchbar的位置不对，那么好的我这里高速你应该如何去调整吧：&lt;/p&gt;
&lt;p&gt;请你注意一下这条语句：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_searchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;44.0f&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;那么解决的办法就很简单了，只要你修改一个坐标和宽度，或者高度，你就可以任意的设置了。&lt;/p&gt;</description></item><item><title>iOS自定义导航栏背景图片和颜色</title><link>https://zhangdapeng.dev/p/ios-zi-ding-yi-dao-hang-lan-bei-jing-tu-pian-he-yan-se/</link><pubDate>Fri, 13 Jun 2025 10:13:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-ding-yi-dao-hang-lan-bei-jing-tu-pian-he-yan-se/</guid><description>&lt;p&gt;修改导航栏的背景图片，可按照下面的方法操作：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UINavigationBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.navigationController.navigationBar; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define kSCNavBarImageTag 10 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([navBar respondsToSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(setBackgroundImage:forBarMetrics:)]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//if iOS 5.0 and later 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [navBar setBackgroundImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;navbar1.png&amp;#34;&lt;/span&gt;] forBarMetrics:UIBarMetricsDefault]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[navBar viewWithTag:kSCNavBarImageTag]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (imageView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;navbar1.png&amp;#34;&lt;/span&gt;]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageView setTag:kSCNavBarImageTag]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [navBar insertSubview:imageView atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [imageView &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改导航栏的背景色的方法，可按照下面的办法来操作：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;navBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS自定义UISearchBar的背景图</title><link>https://zhangdapeng.dev/p/ios-zi-ding-yi-uisearchbar-de-bei-jing-tu/</link><pubDate>Fri, 13 Jun 2025 10:13:24 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-ding-yi-uisearchbar-de-bei-jing-tu/</guid><description>&lt;p&gt;关于自定义的UISearchBar的背景图设置，在经过自己查找资料的情况下，发现的问题是，只有代码段，其采用的方式是，重写UISearchBar，然后调用layoutSubviews这个方法。&lt;/p&gt;
&lt;p&gt;那么关于自定UISearchBar我采用的方法是类似自定义UITableviewCell的方法，那么接下来这个layoutSubviews的方法，我想大家也就知道该在那里实现了，实现代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// personSearch.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;personSearch&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UISearchBar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// personSearch.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;personSearch.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;QuartzCore/QuartzCore.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;personSearch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithFrame:&lt;/span&gt;(CGRect)frame
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;layoutSubviews&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchField;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	NSUInteger numViews &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.subviews count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; numViews; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]]) { &lt;span style="color:#75715e"&gt;//conform?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			searchField &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.subviews objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;(searchField &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; searchField.placeholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;输入要查找的艺人的名字&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [searchField setBorderStyle:UITextBorderStyleRoundedRect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [searchField setBackgroundColor:[UIColor whiteColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//自己的搜索图标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;GUI_search&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;iView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:image];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [iView setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		searchField.leftView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; iView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super layoutSubviews];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Only override drawRect: if you perform custom drawing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// An empty implementation adversely affects performance during animation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;- (void)drawRect:(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; // Drawing code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK！实现过程就是这样的，漂亮的结果就出来了&lt;/p&gt;</description></item><item><title>UISearchbar的取消按钮设置图片</title><link>https://zhangdapeng.dev/p/uisearchbar-de-qu-xiao-an-niu-she-zhi-tu-pian/</link><pubDate>Fri, 13 Jun 2025 10:13:20 +0000</pubDate><guid>https://zhangdapeng.dev/p/uisearchbar-de-qu-xiao-an-niu-she-zhi-tu-pian/</guid><description>&lt;p&gt;网上找了好多关于给UISearchBar的取消按钮设置图片的文章，结果就是给力一段代码，让人迷迷糊糊，不知道该放在哪里，我经过测试是这样的&lt;/p&gt;
&lt;p&gt;一般你会搜到这样的代码段：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchbuttons &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; searchBar.subviews)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([searchbuttons isKindOfClass:[UIButton &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cancelButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIButton&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchbuttons;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 cancelButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 [cancelButton setBackgroundImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;yourImageName&amp;#34;&lt;/span&gt;] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我这里修改了上述代码，并放在了具体的方法中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//开始搜搜
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;searchBarShouldBeginEditing:&lt;/span&gt;(UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchBar{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.searchBar setShowsCancelButton:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchbuttons &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.searchBar.subviews)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([searchbuttons isKindOfClass:[UIButton &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cancelButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIButton&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchbuttons;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;GUI_cancel_search&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cancelButton setBackgroundImage:[UIImage imageWithContentsOfFile:path] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因为我这里要执行的操作是，在进行搜索的时候将取消按钮显示出来，这样的话我就只有在这里进行操作了，经过测试绝对是可以执行的。另外这里有一个点就是，我没有使用UIImage的imageNamed方法，因为会有点小问题，你可以去看我的一篇文章&lt;a class="link" href="https://www.gowhich.com/blog/142" target="_blank" rel="noopener"
 &gt;UIImage中imageNamed的使用注意&lt;/a&gt;&lt;/p&gt;</description></item><item><title>UIImage中imageNamed的使用注意</title><link>https://zhangdapeng.dev/p/uiimage-zhong-imagenamed-de-shi-yong-zhu-yi/</link><pubDate>Fri, 13 Jun 2025 10:13:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/uiimage-zhong-imagenamed-de-shi-yong-zhu-yi/</guid><description>&lt;p&gt;最近查找了关于这个imageNamed的使用方法说明：有几篇文章是这样说的&lt;/p&gt;
&lt;p&gt;第一篇文章：http://hi.baidu.com/dongliqian/item/f9a60bdee1dad84fdcf9be6e&lt;/p&gt;
&lt;p&gt;在这篇文章里面提到，&lt;code&gt;[UIImage imageNamed: @&amp;quot;&amp;quot;]&lt;/code&gt; 多次操作之后，应用经常发生内存警告从而导致自动退出的问题，由此看来[UIImage imageNamed:]只适合与UI界面中小的贴图的读取，而一些比较大的资源文件应该尽量避免使用这个接口。&lt;/p&gt;
&lt;p&gt;第二篇文章里面是这样说的：http://www.cocoachina.com/bbs/simple/?t27420.html&lt;/p&gt;
&lt;p&gt;里面提到“这种方法在application bundle的顶层文件夹寻找由供应的名字的图象 。 如果找到图片，装载到iPhone系统缓存图象。那意味图片是(理论上)放在内存里作为cache的。”&lt;/p&gt;
&lt;p&gt;综合以上我觉得，使用这个方法还是需要注意的，建议使用下面这总方法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;search&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>PHP针对iPhone和Android设备输出不同的viewport</title><link>https://zhangdapeng.dev/p/php-zhen-dui-iphone-he-android-she-bei-shu-chu-bu-tong-de-viewport/</link><pubDate>Fri, 13 Jun 2025 10:13:12 +0000</pubDate><guid>https://zhangdapeng.dev/p/php-zhen-dui-iphone-he-android-she-bei-shu-chu-bu-tong-de-viewport/</guid><description>&lt;p&gt;PHP针对iPhone和Android设备输出不同的viewport&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//if iphone
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$browser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strpos&lt;/span&gt;($_SERVER[&lt;span style="color:#e6db74"&gt;&amp;#39;HTTP_USER_AGENT&amp;#39;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#34;iPhone&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; $browser) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $browser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;iphone&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//if android
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$android &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strpos&lt;/span&gt;($_SERVER[&lt;span style="color:#e6db74"&gt;&amp;#39;HTTP_USER_AGENT&amp;#39;&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#34;Android&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; $android) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $brower &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;android&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;html模版&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($browser &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;iphone&amp;#39;&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, minimum-scale=1.0, maximum-scale=1.0&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php } elseif ($brower == &amp;#39;android&amp;#39;) { ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;meta name=&amp;#34;HandheldFriendly&amp;#34; content=&amp;#34;true&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt; &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, height=device-height, user-scalable=no&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php } ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iPhone 自定义 UITableViewCell 行缩进（修正版）</title><link>https://zhangdapeng.dev/p/iphone-zi-ding-yi-uitableviewcell-xing-suo-jin-xiu-zheng-ban/</link><pubDate>Thu, 12 Jun 2025 17:45:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-zi-ding-yi-uitableviewcell-xing-suo-jin-xiu-zheng-ban/</guid><description>&lt;p&gt;这篇文章跟我之前讲的一篇文章是一样的，唯独不同的一点是，在编辑的状态进行拖动的时候，cell有重载的现象，这样导致的结果是，编辑状态缩进的cell又回复了原来的状态，使得原来的效果又回复了，这次，经过资料的查找，找打解决的办法，代码贴到下面了。至于自定的cell的话，大家可以自己去模仿制作一个，应该是没什么区别的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITableViewCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageViewPic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;index;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//编辑操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;attentionListCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithStyle:&lt;/span&gt;(UITableViewCellStyle)style &lt;span style="color:#a6e22e"&gt;reuseIdentifier:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)reuseIdentifier
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithStyle:style reuseIdentifier:reuseIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelected:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)selected &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelected:selected animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the view for the selected state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqual:_listImage])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageViewPic.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listName])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListIndex:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listIndex])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.index.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListRank:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listRank])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;willTransitionToState:&lt;/span&gt;(UITableViewCellStateMask)state{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView beginAnimations:&lt;span style="color:#e6db74"&gt;@&amp;#34;ResetFrame&amp;#34;&lt;/span&gt; context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationDuration:&lt;span style="color:#ae81ff"&gt;0.7&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self cache:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateDefaultMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingEditControlMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(state &lt;span style="color:#f92672"&gt;==&lt;/span&gt; UITableViewCellStateShowingDeleteConfirmationMask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setSubViewsFrameEdit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameEdit&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setSubViewsFrameNormal&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 重新定义editing的设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setEditing:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)editing &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.editing &lt;span style="color:#f92672"&gt;==&lt;/span&gt; editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super setEditing:editing animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat imageHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat nameHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;25.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat indexHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;45.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;240.0&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; offset;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat rankHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(imageX, imageY, imageWidth, imageHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(nameX, nameY, nameWidth, nameHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(indexX, indexY, indexWidth, indexHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(rankX, rankY, rankWidth, rankHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(_checkImageView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Unselected.png&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:_checkImageView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_checkImageView setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;, self.index.frame.origin.y, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setChecked:_checked];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(_checkImageView &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Selected.png&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:_checkImageView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_checkImageView setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;, self.index.frame.origin.y, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (checked)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Selected.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;223.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;230.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;250.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Unselected.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>使用for...in...输出NSMutableArray内容和输入NSMutableDictionary</title><link>https://zhangdapeng.dev/p/shi-yong-forin-shu-chu-nsmutablearray-nei-rong-he-shu-ru-nsmutabledictionary/</link><pubDate>Thu, 12 Jun 2025 17:45:02 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-yong-forin-shu-chu-nsmutablearray-nei-rong-he-shu-ru-nsmutabledictionary/</guid><description>&lt;h3 id="for"&gt;&lt;a class="link" href="#1" &gt;for&amp;hellip;in&amp;hellip;输出NSMutableDictionary（代码片段摘录如下）&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;attention&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.dataDic &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDictionary dictionaryWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithCapacity:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; section &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.dataDic) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Item &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[Item alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; item.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self.dataDic objectForKey:section] valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; item.isChecked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [_items addObject:item];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="for-1"&gt;&lt;a class="link" href="#2" &gt;for&amp;hellip;in&amp;hellip;输出NSMutableArray（代码片段摘录如下）&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;item &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; _items) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;item.title = %@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;title&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;item.isChecked = %@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;isChecked&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iPhone 自定义 UITableViewCell 行缩进</title><link>https://zhangdapeng.dev/p/iphone-zi-ding-yi-uitableviewcell-xing-suo-jin/</link><pubDate>Thu, 12 Jun 2025 17:44:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/iphone-zi-ding-yi-uitableviewcell-xing-suo-jin/</guid><description>&lt;p&gt;网上搜索了很多，不知道是我搜索技术问题还是怎么着，就是没有找到，不过经过自己的努力，还是发现了解决的办法，因为这种情况大多数是自定的UITableviewCell,那么肯定知道如何自己的自定的cell里面如何修改cell上面的元素，其实原理很简单，就是重新设置一下元素的frame大小就好了，我讲自己的代码贴到下面希望能够给大家一个指引。如果问题，可以联系我跟我继续探讨。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UITableViewCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;imageViewPic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;index;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//编辑操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//--------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// attentionListCell.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-16.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;attentionListCell.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attentionListCell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checkImageView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checkImageView;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithStyle:&lt;/span&gt;(UITableViewCellStyle)style &lt;span style="color:#a6e22e"&gt;reuseIdentifier:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)reuseIdentifier
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithStyle:style reuseIdentifier:reuseIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Initialization code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;setSelected:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)selected &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super setSelected:selected animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configure the view for the selected state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListImage:&lt;/span&gt;(UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqual:_listImage])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.imageViewPic.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listName])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.name.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listName;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListIndex:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listIndex])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listIndex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.index.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listIndex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setListRank:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[value isEqualToString:_listRank])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _listRank &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [value &lt;span style="color:#66d9ef"&gt;copy&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.rank.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _listRank;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setCheckImageViewCenter:&lt;/span&gt;(CGPoint)pt &lt;span style="color:#a6e22e"&gt;alpha:&lt;/span&gt;(CGFloat)alpha &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (animated)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[UIView beginAnimations:nil context:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[UIView setAnimationBeginsFromCurrentState:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[UIView setAnimationDuration:&lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; alpha;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		[UIView commitAnimations];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.center &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; alpha;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 重新定义editing的设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setEditing:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)editing &lt;span style="color:#a6e22e"&gt;animated:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.editing &lt;span style="color:#f92672"&gt;==&lt;/span&gt; editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[super setEditing:editing animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (editing)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CGRect *imageFrame = self.imageViewPic.frame;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.imageViewPic setFrame:CGRectMake(self.imageViewPic.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, self.imageViewPic.frame.origin.y, self.imageViewPic.frame.size.width, self.imageViewPic.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.name setFrame:CGRectMake(self.name.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, self.name.frame.origin.y, self.name.frame.size.width, self.name.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.index setFrame:CGRectMake(self.index.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, self.index.frame.origin.y, self.index.frame.size.width, self.index.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.rank setFrame:CGRectMake(self.rank.frame.origin.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, self.rank.frame.origin.y, self.rank.frame.size.width, self.rank.frame.size.height)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [self.imageViewPic setFrame:CGRectMake(&amp;lt;#CGFloat x#&amp;gt;, &amp;lt;#CGFloat y#&amp;gt;, &amp;lt;#CGFloat width#&amp;gt;, &amp;lt;#CGFloat height#&amp;gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.selectionStyle = UITableViewCellSelectionStyleNone;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.backgroundView = [[UIView alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.backgroundView.backgroundColor = [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.textLabel.backgroundColor = [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.detailTextLabel.backgroundColor = [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		if (_checkImageView == nil)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//			_checkImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&amp;#34;Unselected.png&amp;#34;]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//			[self addSubview:_checkImageView];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		[self setChecked:_checked];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		_checkImageView.center = CGPointMake(-CGRectGetWidth(_checkImageView.frame) * 0.5,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//											 CGRectGetHeight(self.bounds) * 0.5);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		_checkImageView.alpha = 0.0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		[self setCheckImageViewCenter:CGPointMake(20.5, CGRectGetHeight(self.bounds) * 0.5)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//								alpha:1.0 animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		_checked = NO;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.selectionStyle = UITableViewCellSelectionStyleBlue;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		self.backgroundView = nil;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		if (_checkImageView)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//			[self setCheckImageViewCenter:CGPointMake(-CGRectGetWidth(_checkImageView.frame) * 0.5,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//													 CGRectGetHeight(self.bounds) * 0.5)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//									alpha:0.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//								 animated:animated];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;setChecked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)checked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (checked)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Selected.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;223.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;230.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;250.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		_checkImageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Unselected.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		self.backgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_checked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; checked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UIProgressView 用法</title><link>https://zhangdapeng.dev/p/ios-uiprogressview-yong-fa/</link><pubDate>Thu, 12 Jun 2025 17:44:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uiprogressview-yong-fa/</guid><description>&lt;p&gt;iOS实例-UIProgressView的简单实用方法&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ProgressViewViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIProgressView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;progressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIProgressView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;barprogressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;startButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;stopButton; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIProgressView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;progressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;IBOutlet&lt;/span&gt; UIProgressView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;barprogressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;startProgress:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;stopProgress:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ProgressViewViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; progressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; barprogressview;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.progressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.barprogressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stopButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; startButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.progressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.barprogressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidUnload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.progressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.barprogressview&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidUnload];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Release any retained subviews of the main view.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*进度条每次加0.01 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;timerChanged:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.progressview.progress &lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.01f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.barprogressview.progress &lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.01f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;startProgress:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timer&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSTimer scheduledTimerWithTimeInterval:&lt;span style="color:#ae81ff"&gt;0.03f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(timerChanged:) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userInfo:nil 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repeats:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[timer retain];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; startButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stopButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;IBAction&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;stopProgress:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [timer invalidate];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[timer release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//timer =nil;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.progressview.progress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.barprogressview.progress&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; startButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stopButton.enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里提示一点是progress的最大值为1，最小值为0&lt;/p&gt;</description></item><item><title>去掉UITableViewCell边框样式</title><link>https://zhangdapeng.dev/p/qu-diao-uitableviewcell-bian-kuang-yang-shi/</link><pubDate>Thu, 12 Jun 2025 17:19:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/qu-diao-uitableviewcell-bian-kuang-yang-shi/</guid><description>&lt;h3 id="方法-1"&gt;&lt;a class="link" href="#1" &gt;方法 1:&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果，UITableView的类型为UITableViewStyleGrounped，发现使用&lt;code&gt;_tableView.backgroundColor = [UIColor clearColor]&lt;/code&gt;后，tableView的背景色仍然是默认的色，上网查了下：&lt;br&gt;
&lt;code&gt;_tableView.backgroundView = nil;&lt;/code&gt;可以搞定。&lt;br&gt;
测试下发现确实可以，但是不知道以前的版本不确定有没有backgroundView的，所以最好加个判断吧：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (mainTableView.backgroundView)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mainTableView.backgroundView &lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果类型为UITableViewStylePlain，[UIColor clearColor]仍然有效，怪哉！&lt;br&gt;
正常情况下grouped样式（UITableViewStyleGrouped）UITableViewCell都是有边框的，如果要去掉边框可以用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tempView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIView alloc] init] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[cell setBackgroundView:tempView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[cell setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其实很简单，把backgroundView设置为一个空的View，然后就干净了。看了下UITableViewCell的文档，backgroundView在plain-style的TableView里面是nil，在grouped-style的TableView里面并不是空的，所以这里设置空就ok了，这是目前为止我见到的最完美的解决方案。&lt;/p&gt;
&lt;h3 id="方法-2"&gt;&lt;a class="link" href="#2" &gt;方法 2:&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[tableView setSeparatorColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方法-3"&gt;&lt;a class="link" href="#3" &gt;方法 3:&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.backgroundView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自定义UITableViewCell</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell/</link><pubDate>Thu, 12 Jun 2025 17:18:57 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uitableviewcell/</guid><description>&lt;p&gt;自己的应用中需要一种非普通格式的cell，于是自己就定义了一下；基本上的代码类似如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;captionCellWithIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;captionCell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//使用自定义的cell模板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; nibRegistered &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;nibRegistered){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UINib &lt;span style="color:#f92672"&gt;*&lt;/span&gt;nib &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UINib nibWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;captionCell&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personTable registerNib:nib forCellReuseIdentifier:captionCellWithIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nibRegistered &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;captionCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.personTable dequeueReusableCellWithIdentifier:captionCellWithIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[captionCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:captionCellWithIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.contentView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor grayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.firstTitle.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;3月4日 艺人新媒体指数&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.firstTitle.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.secondTitle.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;www.vlinkage.com&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.secondTitle.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectionStyle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UITableViewCellSelectionStyleNone;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自定义UIBarButtonItem</title><link>https://zhangdapeng.dev/p/zi-ding-yi-uibarbuttonitem/</link><pubDate>Thu, 12 Jun 2025 17:18:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-uibarbuttonitem/</guid><description>&lt;p&gt;因为按钮的要求，好友导航的限制，想着自己自定义一个barbuttonitem，如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.leftBtn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;70.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setTintColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [self.leftBtn setImage:[UIImage imageNamed:@&amp;#34;back_60_30&amp;#34;] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.leftBtn.layer.cornerRadius &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.leftBtn.layer.borderWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn addTarget:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(returnToPrev)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.leftBtn setTag:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationBar addSubview:self.leftBtn];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自定义NavigationBar</title><link>https://zhangdapeng.dev/p/zi-ding-yi-navigationbar/</link><pubDate>Thu, 12 Jun 2025 17:18:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/zi-ding-yi-navigationbar/</guid><description>&lt;p&gt;最近写app，在一个部分想自定义一下NavigationBar：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationBar alloc]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, width, &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationBar setBackgroundColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationBar.tintColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:self.navigationBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UINavigationItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navigationTitle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;艺人指数排行榜&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationBar pushNavigationItem:navigationTitle animated:NO];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;别忘记一个操作就是隐藏掉默认的navigationBar:&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController setNavigationBarHidden:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这行代码可以加到&lt;code&gt;didFinishLaunchingWithOptions&lt;/code&gt;中，也可以加到&lt;code&gt;viewDidLoad&lt;/code&gt;中&lt;/p&gt;</description></item><item><title>获取iphone系统版本号</title><link>https://zhangdapeng.dev/p/huo-qu-iphone-xi-tong-ban-ben-hao/</link><pubDate>Thu, 12 Jun 2025 17:18:38 +0000</pubDate><guid>https://zhangdapeng.dev/p/huo-qu-iphone-xi-tong-ban-ben-hao/</guid><description>&lt;p&gt;为了使用版本号的问题，我搜了点资料，做点记录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] name]); &lt;span style="color:#75715e"&gt;// Name of the phone as named by user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] uniqueIdentifier]); &lt;span style="color:#75715e"&gt;// A GUID like string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] systemName]); &lt;span style="color:#75715e"&gt;// &amp;#34;iPhone OS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] systemVersion]); &lt;span style="color:#75715e"&gt;// &amp;#34;2.2.1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] model]); &lt;span style="color:#75715e"&gt;// &amp;#34;iPhone&amp;#34; on both devices
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog([[UIDevice currentDevice] localizedModel]); &lt;span style="color:#75715e"&gt;// &amp;#34;iPhone&amp;#34; on both devices
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIDevice currentDevice] systemVersion] floatValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (version &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// iPhone 4.0 code here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Finishing up a navigation transition in an unexpected state</title><link>https://zhangdapeng.dev/p/finishing-up-a-navigation-transition-in-an-unexpected-state/</link><pubDate>Thu, 12 Jun 2025 17:18:35 +0000</pubDate><guid>https://zhangdapeng.dev/p/finishing-up-a-navigation-transition-in-an-unexpected-state/</guid><description>&lt;p&gt;我在做我的iOS应用中，遇到了这样的情况：错误代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-05-13 21:46:47.985 xunYi4&lt;span style="color:#f92672"&gt;[&lt;/span&gt;31694:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; nested pop animation can result in corrupted navigation bar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-05-13 21:46:48.336 xunYi4&lt;span style="color:#f92672"&gt;[&lt;/span&gt;31694:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-05-13 21:46:48.337 xunYi4&lt;span style="color:#f92672"&gt;[&lt;/span&gt;31694:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Unbalanced calls to begin/end appearance transitions &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &amp;lt;personViewController: 0x75a01b0&amp;gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使得我的运行的结果是，在调用pushViewConroller的时候出现了两次push，导致程序不能达到自己想要的效果，于是查找资料，最终我的解决方案是：如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;personViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;person &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[personViewController alloc] initWithNibName:&lt;span style="color:#e6db74"&gt;@&amp;#34;personViewController&amp;#34;&lt;/span&gt; bundle:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController popToRootViewControllerAnimated:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;person.navigationItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; button.titleLabel.text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController pushViewController:person animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;达到了我要的效果，但是问题是这个报错的信息还是存在，请求高手给予指点&lt;/p&gt;</description></item><item><title>iOS 将程序打包成ipa文件</title><link>https://zhangdapeng.dev/p/ios-jiang-cheng-xu-da-bao-cheng-ipa-wen-jian/</link><pubDate>Thu, 12 Jun 2025 17:18:29 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-jiang-cheng-xu-da-bao-cheng-ipa-wen-jian/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一步
这里需要注意，要选择真机，否则Archive 会是灰色的。
点击后，系统会自动编译一次：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第二步：
在你刚刚生成的程序上点击右键，并且点击Show in Finder。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第三步：
在打开的窗口中选择 生成的文件 右键点击，显示包内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第四步：
你会看到一个上面有圆圈禁止符号的图标，这是一个重要的文件，不要关闭窗口，我们一会儿的操作需要用到它。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第五步：
打开iTunes 把上面一步的文件 拖拽至 iTunes 中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第六步：
右键点击iTunes中生成的文件，点击Show in Finder。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第七步，也是最后一步。
现在显示的这个ipa 文件就是可以给其他机器安装的了。 如果，你安装的机器，没有在你程序的测试证书中，是不能够安装的。除非你的机器是越狱机，越狱机可以安装。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iOS 改变导航栏返回按钮的标题</title><link>https://zhangdapeng.dev/p/ios-gai-bian-dao-hang-lan-fan-hui-an-niu-de-biao-ti/</link><pubDate>Thu, 12 Jun 2025 17:18:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-gai-bian-dao-hang-lan-fan-hui-an-niu-de-biao-ti/</guid><description>&lt;p&gt;新写的App中需要使用UINavigationController对各个页面进行导航，但由于第一级页面的title较长，在进入第二级页面后返回按钮leftButtonItem的title就会变得很长，对NavigationBar空间占用很大，而且不美观，于是使用代码对leftButtonItem的title文本进行修改，无论是设置&lt;code&gt;self.navigationItem.leftBarButtonItem.title = @&amp;quot;返回&amp;quot;;&lt;/code&gt;还是&lt;code&gt;self.navigationItem.backBarButtonItem.title = @&amp;quot;返回&amp;quot;;&lt;/code&gt;都没有效果，title文本始终不会发生变化。到网上乱搜一通后，得到了以下解决方法，相对来说比较简单，特记录如下：&lt;/p&gt;
&lt;p&gt;在第一级页面的viewDidLoad方法中加入以下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;backButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;backButtonItem.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.backBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; backButtonItem;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也就是用一个新的按钮在进行导航前将原来的返回按钮替换掉就可以了。&lt;br&gt;
可以如下设置 但是这样的缺点是那个按键会变成方形 可以添加图片来进行修改。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;backButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;Back&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UIBarButtonItemStyleBordered
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(backToPrevious)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; backButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;backToPrevious&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navigationController popViewControllerAnimated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加图片的相关代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;leftButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIButtonalloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[leftButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;返回&amp;#34;&lt;/span&gt;forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[leftButton setImage:[UIImageimageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;UINavigationBar.png&amp;#34;&lt;/span&gt;] forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[leftButton setImage:[UIImageimageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;UINavigationBar.png&amp;#34;&lt;/span&gt;] forState:UIControlStateHighlighted];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[leftButton addTarget:selfaction:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(leftAction:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;leftItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItemalloc] initWithCustomView:leftButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[leftButton &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationItem.leftBarButtonItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; leftItem;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS iPhone开发中经常用到的控件尺寸大集合</title><link>https://zhangdapeng.dev/p/ios-iphone-kai-fa-zhong-jing-chang-yong-dao-de-kong-jian-chi-cun-da-ji-he/</link><pubDate>Thu, 12 Jun 2025 14:39:27 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-iphone-kai-fa-zhong-jing-chang-yong-dao-de-kong-jian-chi-cun-da-ji-he/</guid><description>&lt;p&gt;网站上搜集了一些，关于iphone的尺寸方面的资料：简单的贴到下面，喜欢的朋友可以自己查看一下：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Element&lt;/td&gt;
					&lt;td&gt;Size (in points)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Window (including status bar)&lt;/td&gt;
					&lt;td&gt;320 x 480 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Status Bar (&lt;a class="link" href="http://www.idev101.com/code/User_Interface/UIStatusBar.html" target="_blank" rel="noopener"
 &gt;How to hide the status bar&lt;/a&gt;)&lt;/td&gt;
					&lt;td&gt;20 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View inside window (visible status bar)&lt;/td&gt;
					&lt;td&gt;320 x 460&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Navigation Bar&lt;/td&gt;
					&lt;td&gt;44 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nav Bar Image/Toolbar Image&lt;/td&gt;
					&lt;td&gt;up to 20 x 20 pts (transparent PNG)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tab Bar&lt;/td&gt;
					&lt;td&gt;49 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tab Bar Icon&lt;/td&gt;
					&lt;td&gt;up to 30 x 30 pts (transparent PNGs)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Text Field&lt;/td&gt;
					&lt;td&gt;31 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Height of a view inside a navigation bar&lt;/td&gt;
					&lt;td&gt;416 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Height of a view inside a tab bar&lt;/td&gt;
					&lt;td&gt;411 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Height of a view inside a navbar &lt;em&gt;and&lt;/em&gt; a tab bar&lt;/td&gt;
					&lt;td&gt;367 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Portrait Keyboard height&lt;/td&gt;
					&lt;td&gt;216 pts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Landscape Keyboard height&lt;/td&gt;
					&lt;td&gt;140 pts&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Points vs. Pixels&lt;/strong&gt;&lt;br&gt;
The iPhone 4 introduced a high resolution display with twice the pixels of previous iPhones. However you don&amp;rsquo;t have to modify your code to support high-res displays; the coordinate system goes by points rather than pixels, and the dimensions in points of the screen and all UI elements remain the same.&lt;br&gt;
iOS 4 supports high resolution displays (like the iPhone 4 display) via the scale property on UIScreen, UIView, UIImage, and CALayer classes. If the object is displaying high-res content, its scale property is set to 2.0. Otherwise it defaults to 1.0.&lt;br&gt;
All you need to do to support high-res displays is to provide @2x versions of the images in your project. See the &lt;a class="link" href="http://www.idev101.com/code/Distribution/updating_ios4.html#l2" target="_blank" rel="noopener"
 &gt;checklist for updating to iOS4&lt;/a&gt; or Apple documentation for &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreens/SupportingHiResScreens.html" target="_blank" rel="noopener"
 &gt;Supporting High Resolution Screens&lt;/a&gt; for more info.&lt;br&gt;
&lt;strong&gt;Adjusting Sizes&lt;/strong&gt;&lt;br&gt;
Click here to see how to adjust &lt;a class="link" href="http://www.idev101.com/code/User_Interface/view_frames_bounds.html" target="_blank" rel="noopener"
 &gt;View Frames and Bounds&lt;/a&gt;.&lt;br&gt;
&lt;strong&gt;Additional References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple Documentation: &lt;a class="link" href="http://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#/apple_ref/doc/uid/TP40010156-CH14-SW7" target="_blank" rel="noopener"
 &gt;Points vs. Pixels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Apple Documentation: &lt;a class="link" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIBarButtonItem_Class/Reference/Reference.html#/apple_ref/doc/uid/TP40007519-CH3-SW3" target="_blank" rel="noopener"
 &gt;UIBarButtonItem Class Reference&lt;/a&gt; says &amp;ldquo;Typically, the size of a toolbar and navigation bar image is 20 x 20 points.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Apple Documentation: &lt;a class="link" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarItem_Class/Reference/Reference.html#/apple_ref/occ/instm/UITabBarItem/initWithTitle:image:tag:" target="_blank" rel="noopener"
 &gt;UITabBarItem Class Reference&lt;/a&gt; says &amp;ldquo;The size of an tab bar image is typically 30 x 30 points.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>改变UITableViewCell的背景颜色</title><link>https://zhangdapeng.dev/p/gai-bian-uitableviewcell-de-bei-jing-yan-se/</link><pubDate>Thu, 12 Jun 2025 11:49:43 +0000</pubDate><guid>https://zhangdapeng.dev/p/gai-bian-uitableviewcell-de-bei-jing-yan-se/</guid><description>&lt;p&gt;最有效的解决方式是: 使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt; (UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) tableView &lt;span style="color:#a6e22e"&gt;willDisplayCell:&lt;/span&gt;(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)cell &lt;span style="color:#a6e22e"&gt;forRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;托管函数中定义Cell的背景颜色值。(注意：cell.textLabel的背景颜色默认为white, 如有要自定义还是需另用代码来控制实现)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt; (UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt; (NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) indexPath {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.contentView setBackgroundColor: [UIColor redColor] ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>在popViewControllerAnimated后调用函数</title><link>https://zhangdapeng.dev/p/zai-popviewcontrolleranimated-hou-diao-yong-han-shu/</link><pubDate>Thu, 12 Jun 2025 11:49:38 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-popviewcontrolleranimated-hou-diao-yong-han-shu/</guid><description>&lt;p&gt;当你在A视图调用pushViewController:animated:，并且从B视图返回A视图的时候需要做一些操作，比如刷新数据，或者做个浏览记录的操作的时候，可以调用这个函数viewWillAppear，就可以解决问题了。&lt;/p&gt;
&lt;p&gt;在我的实例中，我在A视图做了这个操作：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationController.navigationBarHidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是在B视图我要做相反的操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.navigationController.navigationBarHidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是在返回来的时候，问题出现了，A视图达不到我想要的效果了，似乎也继承了B视图的navigationBar不隐藏的操作，但是我需要隐藏，那么结果做这个操作就好 了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;viewWillAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController.navigationBarHidden &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>让UISearchBar上英文Cancel变成中文的正确方法(改变搜索按钮文字)</title><link>https://zhangdapeng.dev/p/rang-uisearchbar-shang-ying-wen-cancel-bian-cheng-zhong-wen-de-zheng-que-fang-fa-gai-bian-sou-suo-an-niu-wen-zi/</link><pubDate>Thu, 12 Jun 2025 09:56:51 +0000</pubDate><guid>https://zhangdapeng.dev/p/rang-uisearchbar-shang-ying-wen-cancel-bian-cheng-zhong-wen-de-zheng-que-fang-fa-gai-bian-sou-suo-an-niu-wen-zi/</guid><description>&lt;p&gt;UISearchBar 在Xcode默认环境的工程中, 所有文字显示的是英文, 这让大家很不爽, 网上有修改Cancel键的上文字的办法, 就是取UISearchBar的子视图上的控件, 进行遍历, 个人认为这个办法不可取, 因为除了取消按钮外, 还有全选,粘贴显示的还是英文, 你是不是也要遍历一下呢? 我也做了这个操作，但是结果没有达到想要的。&lt;/p&gt;
&lt;h3 id="正确的处理方法"&gt;&lt;a class="link" href="#1" &gt;正确的处理方法:&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;点击工程名, 打开如下图界面&lt;br&gt;
在Localizations默认只有English这一项, 我们只需在Localizations上添加Chinese就可以了, 你还可以根据你的需要添加其他的语言.&lt;/p&gt;
&lt;p&gt;如果用户把手机语言设成英文, 那么显示的就是英文, 设置成中文,那么显示的就是中文.&lt;/p&gt;
&lt;p&gt;正确的解决的方法, 可以让我们节省很多事情, 不是么?&lt;/p&gt;</description></item><item><title>loaded the "BlueView" nib but the view outlet was not set 错误的解决办法</title><link>https://zhangdapeng.dev/p/loaded-the-blueview-nib-but-the-view-outlet-was-not-set-cuo-wu-de-jie-jue-ban-fa/</link><pubDate>Thu, 12 Jun 2025 09:56:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/loaded-the-blueview-nib-but-the-view-outlet-was-not-set-cuo-wu-de-jie-jue-ban-fa/</guid><description>&lt;p&gt;解决办法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;创建控制器. File-&amp;gt;New File-&amp;gt;Iphone OS-&amp;gt;Cocoa Touch Class-&amp;gt;UIViewController subclass;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建xib. File-&amp;gt;New File-&amp;gt;Iphone OS-&amp;gt;User Interface-&amp;gt;View XIB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定controller和view. 用Interface Builder打开xxx.xib, 点击Files&amp;rsquo; Owner, 在Identity Inspector里面的Class Identity, 选择Step 1创建的控制器类, 接着拖拽File&amp;rsquo;s Owner到View中, 选择Outlets-&amp;gt;view.先选中file&amp;rsquo;s owner(这个很重要)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;来源:http://blog.csdn.net/thebesttome/article/details/7799893&lt;/p&gt;</description></item><item><title>CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 5.0'</title><link>https://zhangdapeng.dev/p/codesign-error-code-signing-is-required-for-product-type-application-in-sdk-ios-50/</link><pubDate>Thu, 12 Jun 2025 09:56:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/codesign-error-code-signing-is-required-for-product-type-application-in-sdk-ios-50/</guid><description>&lt;p&gt;解决方法如下:&lt;/p&gt;
&lt;p&gt;选择工程－&amp;gt;Build Settings -&amp;gt; Code Signing -&amp;gt; Code Signing Identity -&amp;gt; Debug -&amp;gt; Any ios SDK 将选项改为：iPhone Developer&lt;/p&gt;</description></item><item><title>UINavigationController pop的三个方法</title><link>https://zhangdapeng.dev/p/uinavigationcontroller-pop-de-san-ge-fang-fa/</link><pubDate>Thu, 12 Jun 2025 09:56:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/uinavigationcontroller-pop-de-san-ge-fang-fa/</guid><description>&lt;p&gt;当我们在视图里面调用pushViewController的时候，有时间不想要这种默认的返回方式，或者也会用，但是有时候会遇到奇怪的问题，比如我就遇到了push之后没有返回按钮，或者说返回按钮消失了，不见了，因为我在rootViewController里面将navigationBar隐藏掉了，因为我想要我自己定义的navigationBar，之后在切换的视图里面就要自己定义这个但会按钮，然后给予他一个响应事件，来调用下面的类似代码，但是往往不知道返回到哪里&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController popToRootViewControllerAnimated:&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController popToViewController:&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;(UIViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; animated:&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController popViewControllerAnimated:&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在我的代码中，我是希望返回到到rootViewController这个视图中，那就只有调用&lt;code&gt;[self.navigationController popToRootViewControllerAnimated:&amp;lt;#(BOOL)#&amp;gt;]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个方法最适合了。结果达到了我想要的效果&lt;/p&gt;</description></item><item><title>unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法</title><link>https://zhangdapeng.dev/p/unbalanced-calls-to-beginend-appearance-transitions-for-uiviewcontroller-de-jie-jue-fang-fa/</link><pubDate>Thu, 12 Jun 2025 09:40:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/unbalanced-calls-to-beginend-appearance-transitions-for-uiviewcontroller-de-jie-jue-fang-fa/</guid><description>&lt;p&gt;由于上个uivewcontroller的动画没做完，导致下一个的页面无法顺利压栈，这个只需要上一个页面返回的时候不要做动画就可以了。（这是其中的一种情况），&lt;/p&gt;
&lt;p&gt;如果不想去掉这个动画，需要做动画的操作，该怎么办呢，我这里给出一篇文章的做法，基本上都是类似的，我这里贴出地址：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.cfanz.cn/?c=article&amp;amp;a=read&amp;amp;id=23441" target="_blank" rel="noopener"
 &gt;http://www.cfanz.cn/?c=article&amp;a=read&amp;id=23441&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS 设置CGColor颜色值</title><link>https://zhangdapeng.dev/p/ios-she-zhi-cgcolor-yan-se-zhi/</link><pubDate>Thu, 12 Jun 2025 09:35:00 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-she-zhi-cgcolor-yan-se-zhi/</guid><description>&lt;p&gt;通过Core Library的文档，我们知道创建颜色有这么几个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CGColorCreate&lt;/li&gt;
&lt;li&gt;CGColorCreateCopy&lt;/li&gt;
&lt;li&gt;CGColorCreateGenericGray&lt;/li&gt;
&lt;li&gt;CGColorCreateGenericRGB&lt;/li&gt;
&lt;li&gt;CGColorCreateGenericCMYK&lt;/li&gt;
&lt;li&gt;CGColorCreateCopyWithAlpha&lt;/li&gt;
&lt;li&gt;CGColorCreateWithPattern&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再来看一下CGColorCreate：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGColorRef &lt;span style="color:#a6e22e"&gt;CGColorCreate&lt;/span&gt; ( 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorSpaceRef colorspace, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; CGFloat components[] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们通过CGColorCreate就可以创建颜色。既然我们要用RGB表示颜色，那么colorspace这个参数我们就可以使用CGColorSpaceCreateDeviceRGB()，而我们主要来探讨components这个参数。&lt;br&gt;
这个参数是一个数组，带有4个数值：&lt;/p&gt;
&lt;p&gt;float color[]={红色分量, 绿色分量, 蓝色分量, alpha分量};&lt;/p&gt;
&lt;p&gt;这4个数值都是0-1区间，0表示黑（不发光），数字越大这种颜色的光线越强，alpha分量表示透明度。比如{1.0, 0, 0,1.0}就是纯红色而且完全不透明。&lt;/p&gt;
&lt;p&gt;最终的使用方法，如下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;55.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;137.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;195.0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面的值（55.0,137.0,195.0）可以自己选择,我是通过使用photoshop自己选择的，你也可以试试&lt;/p&gt;</description></item><item><title>iOS UIButton 做圆角效果</title><link>https://zhangdapeng.dev/p/ios-uibutton-zuo-yuan-jiao-xiao-guo/</link><pubDate>Thu, 12 Jun 2025 09:34:57 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uibutton-zuo-yuan-jiao-xiao-guo/</guid><description>&lt;p&gt;首先引入文件：&lt;strong&gt;#import &amp;lt;QuartzCore/QuartzCore.h&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;再次执行类似下面的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;moreButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;moreButton.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;, cell.contentView.frame.size.width&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, cell.contentView.frame.size.height&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[moreButton.layer setMasksToBounds:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[moreButton.layer setCornerRadius:&lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//设置矩形四个圆角半径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[moreButton.layer setBorderWidth:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//边框宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;moreButton.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UIView之间常用视图之间切换方式</title><link>https://zhangdapeng.dev/p/ios-uiview-zhi-jian-chang-yong-shi-tu-zhi-jian-qie-huan-fang-shi/</link><pubDate>Thu, 12 Jun 2025 09:34:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uiview-zhi-jian-chang-yong-shi-tu-zhi-jian-qie-huan-fang-shi/</guid><description>&lt;p&gt;在iOS开发中，经常遇到两个View之间互相切换，列举下各种方式，但是下面每种方式都要自己灵活运用，不一定就是进入下一个、后一个必须用“一”里面的方式。&lt;/p&gt;
&lt;h3 id="进入下后一个view"&gt;&lt;a class="link" href="#1" &gt;进入下/后一个View&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;A:insertSubView系列：（注意，如果你新增视图不够大，则遮不住上一层视图，即前后2个视图都存在，当然你可以做透明来查看所有，与二A对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;addSubview: （常用增加视图在本View上面）&lt;/li&gt;
&lt;li&gt;bringSubviewToFront；将新视图放在其他同级视图的top位置&lt;/li&gt;
&lt;li&gt;insertSubview:atIndex: 将新视图放在第index层，index是从底层向上数的下标位置&lt;/li&gt;
&lt;li&gt;insertSubview:aboveSubview:将新视图放在第二个参数view的上面&lt;/li&gt;
&lt;li&gt;insertSubview:belowSubview:将新视图放在第二个参数view的下面&lt;/li&gt;
&lt;li&gt;exchangeSubviewAtIndex:withSubviewAtIndex:改变新视图从第一个位置到第二个位置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B:presentViewController系列：（常用视图切换,与二B对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;presentViewController:animated:completion: 弹出，出现一个新视图 可以带动画效果，完成后可以做相应的执行函数经常为nil&lt;/li&gt;
&lt;li&gt;presentModalViewController:animated: 弹出，出现一个新视图 可以带动画效果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C:UINavigationController系列：（常用导航栏视图切换，与二C对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pushViewController:animated: 推进一个新视图到栈里，出现新视图，可以带动画效果&lt;br&gt;
例 pushViewController:animated:&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="返回上前一个view"&gt;&lt;a class="link" href="#2" &gt;返回上/前一个View&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;A:insertSubView系列：（注意，如果你新增视图不够大，则遮不住上一层视图，即前后2个视图都存在，当然你可以做透明来查看所有，与一A对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sendSubviewToBack: 将新视图放在其他同级视图的behind位置&lt;/li&gt;
&lt;li&gt;removeFromSuperview：将新视图从父视图上移除&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B:presentViewController系列：（与一B对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dismissViewControllerAnimated:completion:退出一个新视图 可以带动画效果，完成后可以做相应的执行函数经常为nil&lt;/li&gt;
&lt;li&gt;dismissModalViewControllerAnimated: 退出一个新视图 可以带动画效果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C:UINavigationController系列：（常用导航栏视图切换，与一C对应）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;popViewControllerAnimated: 从一个栈中退出视图，返回上一层，可以带动画效果&lt;/li&gt;
&lt;li&gt;popToRootViewControllerAnimated:从一个栈中退出视图，返回到navigation的RootView，可以带动画效果&lt;/li&gt;
&lt;li&gt;popToViewController:animated:从一个栈中退出视图，返回到navigation中指定的view，可以带动画效果&lt;br&gt;
基本上上面已经介绍完全部常用视图切换方式：&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="uitabbarcontroller需要先将几种视图在tabbar种设置好"&gt;&lt;a class="link" href="#3" &gt;UITabBarController：（需要先将几种视图在tabBar种设置好）&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;setViewControllers:animated:设置要出现的视图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;selectedViewController 设置要出现的视图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;selectedIndex 设置要出现的视图下标&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;来源:http://blog.csdn.net/u010335966/article/details/8858172&lt;/p&gt;</description></item><item><title>iOS 代码形式添加tabbar</title><link>https://zhangdapeng.dev/p/ios-dai-ma-xing-shi-tian-jia-tabbar/</link><pubDate>Thu, 12 Jun 2025 09:34:25 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-dai-ma-xing-shi-tian-jia-tabbar/</guid><description>&lt;p&gt;可以直接看代码，可以直接复制，自己运行：&lt;/p&gt;
&lt;p&gt;VlinkageViewController.h(实现UITabBarDelegate)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// VlinkageViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-3.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VlinkageViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITabBarDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;) UITabBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;VlinkageViewController.m（关键一点是要实现[self.tabBar setDelegate:self]，不然不起作用的）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// VlinkageViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// xunYi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-5-3.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;QuartzCore/QuartzCore.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;VlinkageViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VlinkageViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VlinkageViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; tabBar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//判断机体的宽度和高度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect screenBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; screenBounds.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; screenBounds.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#pragma 添加tabBar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tabBarHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat tabBarY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; tabBarHeight &lt;span style="color:#f92672"&gt;-&lt;/span&gt; searchBar.frame.size.height &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.tabBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITabBar alloc] initWithFrame:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, tabBarY, width, tabBarHeight)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.tabBar setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置切换title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBarItem1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITabBarItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;查找&amp;#34;&lt;/span&gt; image:nil tag:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBarItem2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITabBarItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;我的关注&amp;#34;&lt;/span&gt; image:nil tag:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBarItem3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITabBarItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;咨询&amp;#34;&lt;/span&gt; image:nil tag:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBarItem4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITabBarItem alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;更多&amp;#34;&lt;/span&gt; image:nil tag:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tabBarItem1.tag = %d&amp;#34;&lt;/span&gt;,tabBarItem1.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tabBarItem1.tag = %d&amp;#34;&lt;/span&gt;,tabBarItem2.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tabBarItem1.tag = %d&amp;#34;&lt;/span&gt;,tabBarItem3.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;tabBarItem1.tag = %d&amp;#34;&lt;/span&gt;,tabBarItem4.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//数组形式添加进 tabBar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tabBarItemArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWithObjects:tabBarItem1, tabBarItem2, tabBarItem3, tabBarItem4, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.tabBar setItems:tabBarItemArray];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.tabBar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;tabBar:&lt;/span&gt;(UITabBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tabBar &lt;span style="color:#a6e22e"&gt;didSelectItem:&lt;/span&gt;(UITabBarItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;item.tag= %d&amp;#34;&lt;/span&gt;, item.tag);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS错误之-could not load inserted library</title><link>https://zhangdapeng.dev/p/ios-cuo-wu-zhi-could-not-load-inserted-library/</link><pubDate>Thu, 12 Jun 2025 09:34:19 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cuo-wu-zhi-could-not-load-inserted-library/</guid><description>&lt;p&gt;最近写一个程序时,不知道怎么弄的,不能build到真机了,到模拟器没有什么问题,出现的错误是 : 研究可很长时间,也没有弄明白,在网上也着了很多资料,说是enable 了 guardmalloc&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;could not load inserted library: /usr/lib/libgmalloc.dylib
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在xcode里面找了很久也没有着到怎么关闭, 最后无意中 发现了关闭他的方法,问题也解决了.&lt;br&gt;
方法:&lt;br&gt;
菜单&amp;ndash;&amp;gt;Product&amp;mdash;&amp;gt;EditScheme, 左边框 有一个列表,点击 run xxx.app , 你会发现在右边 Diagnostics里 有一些checkbox, 第三行 便是 关闭 Guard Malloc,&lt;br&gt;
保险起见,clean 下工程,重新build 下 就ok了.&lt;/p&gt;</description></item><item><title>iOS UITableViewCell的基本设置</title><link>https://zhangdapeng.dev/p/ios-uitableviewcell-de-ji-ben-she-zhi/</link><pubDate>Wed, 11 Jun 2025 14:00:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uitableviewcell-de-ji-ben-she-zhi/</guid><description>&lt;h3 id="系统默认的颜色设置"&gt;&lt;a class="link" href="#1" &gt;系统默认的颜色设置&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//无色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellSelectionStyleNone; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//蓝色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellSelectionStyleBlue; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//灰色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellSelectionStyleGray;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="自定义颜色和背景设置"&gt;&lt;a class="link" href="#2" &gt;自定义颜色和背景设置&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;改变UITableViewCell选中时背景色：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIColor &lt;span style="color:#f92672"&gt;*&lt;/span&gt;color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIColoralloc]initWithRed:&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];&lt;span style="color:#75715e"&gt;//通过RGB来定义自己的颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectedBackgroundView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIView alloc] initWithFrame:cell.frame] autorelease]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectedBackgroundView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor xxxxxx];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="自定义uitableviewcell选中时背景"&gt;&lt;a class="link" href="#3" &gt;自定义UITableViewCell选中时背景&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.selectedBackgroundView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIImageView alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;cellart.png&amp;#34;&lt;/span&gt;]] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还有字体颜色&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cell.textLabel.highlightedTextColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor xxxcolor]; [cell.textLabel setTextColor:color];&lt;span style="color:#75715e"&gt;//设置cell的字体的颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置tableviewcell间的分割线的颜色"&gt;&lt;a class="link" href="#4" &gt;设置tableViewCell间的分割线的颜色&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[theTableView setSeparatorColor:[UIColor xxxx ]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITableViewCellSeparatorStyle有如下几种
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellSeparatorStyleNone,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellSeparatorStyleSingleLine,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellSeparatorStyleSingleLineEtched
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITableViewCellSeparatorStyle;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置cell中字体的颜色"&gt;&lt;a class="link" href="#5" &gt;设置cell中字体的颜色&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Customize the appearance of table view cells.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; indexPath.row)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.highlightedTextColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="定义uitableviewcell的样式"&gt;&lt;a class="link" href="#6" &gt;定义UITableViewCell的样式&lt;/a&gt;
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
accessoryType有如下几种
typedef enum {
 UITableViewCellAccessoryNone,
 UITableViewCellAccessoryDisclosureIndicator,
 UITableViewCellAccessoryDetailDisclosureButton,
 UITableViewCellAccessoryCheckmark
} UITableViewCellAccessoryType;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="设置uitableviewcell之间分隔线的颜色"&gt;&lt;a class="link" href="#7" &gt;设置UITableViewCell之间分隔线的颜色&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[chatTableViewsetSeparatorColor:[UIColor blueColor]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cell-样式"&gt;&lt;a class="link" href="#8" &gt;Cell 样式&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;An enumeration &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the various styles of cells.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellStyleDefault,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellStyleValue1,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellStyleValue2,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCellStyleSubtitle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UITableViewCellStyle;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 自制tableview的cell-可任意自定义的UITableViewCell</title><link>https://zhangdapeng.dev/p/ios-zi-zhi-tableview-de-cell-ke-ren-yi-zi-ding-yi-de-uitableviewcell/</link><pubDate>Wed, 11 Jun 2025 14:00:35 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-zhi-tableview-de-cell-ke-ren-yi-zi-ding-yi-de-uitableviewcell/</guid><description>&lt;p&gt;UITableView的强大更多程度上来自于可以任意自定义 UITableViewCell单元格。通常，UITableView中的Cell是动态的，在使用过程中，会创建一个Cell池，根据每个cell的高 度（即tableView:heightForRowAtIndexPath:返回值），以及屏幕高度计算屏幕中可显示几个cell。而进行自定义 TableViewCell无非是采用代码实现或采用IB编辑nib文件来实现两种方式，本文主要收集代码的方式实现各种cell自定义。&lt;/p&gt;
&lt;h3 id="如何动态调整cell高度"&gt;&lt;a class="link" href="#1" &gt;如何动态调整Cell高度&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Cell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc] initWithFrame:CGRectZero];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.tag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.lineBreakMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UILineBreakModeWordWrap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.highlightedTextColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.numberOfLines &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.opaque &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO; &lt;span style="color:#75715e"&gt;// 选中Opaque表示视图后面的任何内容都不应该绘制
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell.contentView addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[cell viewWithTag:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [textArray objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect cellFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [cell frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cellFrame.origin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectInset(cellFrame, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rect;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label sizeToFit];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (label.frame.size.height &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;46&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cellFrame.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; label.frame.size.height &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;46&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cellFrame.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [cell setFrame:cellFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (CGFloat)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;heightForRowAtIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self tableView:tableView cellForRowAtIndexPath:indexPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell.frame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="如何用图片自定义table-separeator分割线"&gt;&lt;a class="link" href="#2" &gt;如何用图片自定义Table Separeator分割线&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;一般地，利用类似&lt;code&gt;[tableView setSeparatorColor:[UIColor redColor]];&lt;/code&gt;语句即可修改cell中间分割线的颜色。那又如何用一个图片作为分割线背景呢？可以尝试如下：&lt;br&gt;
方法一：&lt;br&gt;
先设置cell separatorColor为clear，然后把图片做的分割线添加到自定义的custom cell上。&lt;br&gt;
方法二：&lt;br&gt;
在cell里添加一个像素的imageView后将图片载入进，之后设置&lt;code&gt;tableView.separatorStyle = UITableViewCellSeparatorStyleNone&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="自定义首行cell与其上面导航栏间距"&gt;&lt;a class="link" href="#3" &gt;自定义首行Cell与其上面导航栏间距&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tableView.tableHeaderView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;)] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自定义UITableViewCell的accessory样式&lt;/p&gt;
&lt;p&gt;默认的accessoryType属性有四种取值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UITableViewCellAccessoryNone&lt;/li&gt;
&lt;li&gt;UITableViewCellAccessoryDisclosureIndicator&lt;/li&gt;
&lt;li&gt;UITableViewCellAccessoryDetailDisclosureButton&lt;/li&gt;
&lt;li&gt;UITableViewCellAccessoryCheckmark&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果想使用自定义附件按钮的其他样式，则需使用UITableView的accessoryView属性来指定。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;button;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(isEditableOrNot) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;delete.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;,image.size.width,image.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [button setBackgroundImage:image forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; button;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; button;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上代码仅仅是定义了附件按钮两种状态下的样式，问题是现在这个自定义附件按钮的事件仍不可用。即事件还无法传递到 &lt;code&gt;UITableViewDelegate&lt;/code&gt;的&lt;code&gt;accessoryButtonTappedForRowWithIndexPath&lt;/code&gt;方法上。当我们在上述代码 中在加入以下语句：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[button addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;虽然可以捕捉到每个附件按钮的点击事件，但我们还无法进行区别到底是哪一行的附件按钮发生了点击动作！因为addTarget:方法最多允许传递两个参 数：target和event，这两个参数都有各自的用途了（target指向事件委托对象，event指向所发生的事件）。看来只依靠Cocoa框架已 经无法做到了。&lt;br&gt;
但我们还是可以利用event参数，在自定义的btnClicked方法中判断出事件发生在UITableView的哪一个cell上。因为UITableView有一个很关键的方法indexPathForRowAtPoint，可以根据触摸发生的位置，返回触摸发生在哪一个cell的indexPath。而且通过event对象，正好也可以获得每个触摸在视图中的位置。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 检查用户点击按钮时的位置，并转发事件到对应的accessory tapped事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;btnClicked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender &lt;span style="color:#a6e22e"&gt;event:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)event
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;touches &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [event allTouches];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITouch &lt;span style="color:#f92672"&gt;*&lt;/span&gt;touch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [touches anyObject];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint currentTouchPosition &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [touch locationInView:self.tableView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;indexPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.tableView indexPathForRowAtPoint:currentTouchPosition];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(indexPath &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，UITableView的accessoryButtonTappedForRowWithIndexPath方法会被触发，并且获得一个indexPath参数。通过这个indexPath参数，我们即可区分到底哪一行的附件按钮发生了触摸事件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;accessoryButtonTappedForRowWithIndexPath:&lt;/span&gt;(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;idx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; indexPath.row;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//这里加入自己的逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;摘自：http://www.cnblogs.com/ownerblood/archive/2012/08/02/2620173.html&lt;/p&gt;</description></item><item><title>iOS fonts字体类型</title><link>https://zhangdapeng.dev/p/ios-fonts-zi-ti-lei-xing/</link><pubDate>Wed, 11 Jun 2025 14:00:29 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-fonts-zi-ti-lei-xing/</guid><description>&lt;p&gt;这里给出个文档的地址：http://iosfonts.com/ ，里面包括了所有的ios的字体类型库:这里贴一下吧&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Academy Engraved LET&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AcademyEngravedLetPlain&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;American Typewriter&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter-Condensed&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter-CondensedBold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter-CondensedLight&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AmericanTypewriter-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Apple Color Emoji&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AppleColorEmoji&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Apple SD Gothic Neo&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AppleSDGothicNeo-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AppleSDGothicNeo-Medium&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ArialMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial-BoldItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial-BoldMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial-ItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial Hebrew&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ArialHebrew&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ArialHebrew-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Arial Rounded MT Bold&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ArialRoundedMTBold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Black&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-BlackOblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Book&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-BookOblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Heavy&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-HeavyOblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Light&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-LightOblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Medium&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-MediumOblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Oblique&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir-Roman&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir Next&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-Bold&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-BoldItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-DemiBold&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-DemiBoldItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-Heavy&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-HeavyItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-Italic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-Medium&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-MediumItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-Regular&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-UltraLight&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNext-UltraLightItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Avenir Next Condensed&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-Bold&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-BoldItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-DemiBold&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-DemiBoldItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-Heavy&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-HeavyItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-Italic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-Medium&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-MediumItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-Regular&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-UltraLight&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AvenirNextCondensed-UltraLightItalic&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bangla Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BanglaSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BanglaSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville-SemiBold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Baskerville-SemiBoldItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bodoni Ornaments&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniOrnamentsITCTT&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bodoni 72&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoITCTT-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoITCTT-Book&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoITCTT-BookIta&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bodoni 72 Oldstyle&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoOSITCTT-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoOSITCTT-Book&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoOSITCTT-BookIt&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BodoniSvtyTwoSCITCTT-Book&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bradley Hand&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BradleyHandITCTT-Bold&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Chalkboard SE&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ChalkboardSE-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ChalkboardSE-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ChalkboardSE-Regular&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Chalkduster&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Chalkduster&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cochin&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cochin&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cochin-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cochin-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cochin-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Copperplate&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Copperplate&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Copperplate-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Copperplate-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier-BoldOblique&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier-Oblique&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Courier New&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CourierNewPS-BoldItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CourierNewPS-BoldMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CourierNewPS-ItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CourierNewPSMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DB LCD Temp&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DBLCDTempBlack&lt;/td&gt;
					&lt;td&gt;&lt;del&gt;6.0&lt;/del&gt; 3.0&lt;/td&gt;
					&lt;td&gt;&lt;del&gt;6.0&lt;/del&gt; 4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Devanagari Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DevanagariSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DevanagariSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Didot&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Didot&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Didot-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Didot-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Euphemia UCAS&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;EuphemiaUCAS&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;EuphemiaUCAS-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;EuphemiaUCAS-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Futura&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Futura-CondensedExtraBold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Futura-CondensedMedium&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Futura-Medium&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Futura-MediumItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Geeza Pro&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GeezaPro&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GeezaPro-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Georgia&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Georgia&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Georgia-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Georgia-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Georgia-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gill Sans&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans-BoldItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GillSans-LightItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gujarati Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GujaratiSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GujaratiSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gurmukhi MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GurmukhiMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GurmukhiMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Heiti SC&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;STHeitiSC-Light&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;STHeitiSC-Medium&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Heiti TC&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;STHeitiTC-Light&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;STHeitiTC-Medium&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica-BoldOblique&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica-LightOblique&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica-Oblique&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Helvetica Neue&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-CondensedBlack&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-CondensedBold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-LightItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-Medium&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-UltraLight&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HelveticaNeue-UltraLightItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hiragino Kaku Gothic ProN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HiraKakuProN-W3&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HiraKakuProN-W6&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hiragino Mincho ProN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HiraMinProN-W3&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HiraMinProN-W6&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hoefler Text&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HoeflerText-Black&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HoeflerText-BlackItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HoeflerText-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HoeflerText-Regular&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kailasa&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kailasa&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kailasa-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kannada Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;KannadaSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;KannadaSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Malayalam Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MalayalamSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MalayalamSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Marion&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Marion-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Marion-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Marion-Regular&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Marker Felt&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MarkerFelt-Thin&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MarkerFelt-Wide&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Noteworthy&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Noteworthy-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Noteworthy-Light&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima-Bold&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima-BoldItalic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima-ExtraBlack&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima-Italic&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Optima-Regular&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Oriya Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OriyaSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OriyaSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Palatino&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Palatino-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Palatino-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Palatino-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Palatino-Roman&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Papyrus&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Papyrus&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Papyrus-Condensed&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Party LET&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PartyLetPlain&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sinhala Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SinhalaSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SinhalaSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Snell Roundhand&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SnellRoundhand&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SnellRoundhand-Black&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SnellRoundhand-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Symbol&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Symbol&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
					&lt;td&gt;6.0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tamil Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TamilSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TamilSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Telugu Sangam MN&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TeluguSangamMN&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TeluguSangamMN-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Thonburi&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Thonburi&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Thonburi-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Times New Roman&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TimesNewRomanPS-BoldItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TimesNewRomanPS-BoldMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TimesNewRomanPS-ItalicMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TimesNewRomanPSMT&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Trebuchet MS&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Trebuchet-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TrebuchetMS&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TrebuchetMS-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TrebuchetMS-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verdana&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verdana&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verdana-Bold&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verdana-BoldItalic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Verdana-Italic&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Zapf Dingbats&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ZapfDingbatsITC&lt;/td&gt;
					&lt;td&gt;5.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Zapfino&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Zapfino&lt;/td&gt;
					&lt;td&gt;3.0&lt;/td&gt;
					&lt;td&gt;4.3&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>iOS UIButton学习</title><link>https://zhangdapeng.dev/p/ios-uibutton-xue-xi/</link><pubDate>Wed, 11 Jun 2025 11:31:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uibutton-xue-xi/</guid><description>&lt;p&gt;本文实现的是一个不用拖控件，而是用代码写出一个按钮，然后点击弹出一个警告信息，有人问那么好的IB工具不用却去苦逼的写代码呢？因为IB高度集成开发工具，拖出的控件帮我省了很大麻烦，这个过程农民工也可以干，但是作为初学者，IB是个比较高层的东西，我们是不是应该了解一下IB底层的东西呢，如果一味追求方便快捷，哪天突然有人问怎么用代码写出来，咱岂不是要被鄙视了；所以吧，初学者不要学懒，多写代码提高我们的编程能力，当我们在开发项目或者在公司工作去用IB，来帮我们节省时间提高效率； 初始化视图代码，绘制了一个距原点(100,100)的140x50像素的按钮，有一点需要注意的是iphone的远点坐标是在左上角，屏幕640x480像素，不过现在用个是Retina分辨率，画质更加细腻；&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置按钮类型，此处为圆角按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;writeButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeRoundedRect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置和大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;100.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;140.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;50.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将frame的位置大小复制给Button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writeButton.frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//给Button添加标题 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [writeButton setTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;代码按钮&amp;#34;&lt;/span&gt; forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置按钮背景颜色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writeButton.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor clearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置按钮标题文字对齐方式，此处为左对齐
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writeButton.contentHorizontalAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIControlContentHorizontalAlignmentLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//使文字距离做边框保持10个像素的距离。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writeButton.contentEdgeInsets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIEdgeInsetsMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//此处类容目的掩饰代码代码操作按钮一些属性，如果设置按钮背景为图片可以将此处注释取消，注释掉上没横线范围类代码，进行测试
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置按钮背景图片
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;image&lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;background.png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [writeButton setBackgroundImage:image forState:UIControlStateNormal];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//按钮的相应事件 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [writeButton addTarget:self action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(buttonClicked:)forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:writeButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;writeButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeRoundedRect];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;设置按钮类型，按钮类型定义在一个枚举类型中&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeCustom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 没有风格
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeRoundedRect, &lt;span style="color:#75715e"&gt;// 圆角风格按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeDetailDisclosure, &lt;span style="color:#75715e"&gt;// 详情信息按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeInfoLight, &lt;span style="color:#75715e"&gt;// 明亮背景的信息按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeInfoDark, &lt;span style="color:#75715e"&gt;// 黑暗背景的信息按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButtonTypeContactAdd, &lt;span style="color:#75715e"&gt;// 添加按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} UIButtonType;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是考虑的ios开发中，为了界面美观一般设置背景图片，代替按钮的标题设置，此处推荐一个所搜icon的网址，里面有基本用的icon素材，个人觉得不错，给分享下 &lt;del&gt;&lt;a class="link" href="http://www.easyicon.cn/" target="_blank" rel="noopener"
 &gt;http://www.easyicon.cn/&lt;/a&gt;&lt;/del&gt; 点击打开链接 （已经不存在了）；&lt;/p&gt;
&lt;p&gt;在点击按钮是按钮是凹下去，然后弹起才触发起事件，按钮的状态有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDown &lt;span style="color:#75715e"&gt;// 按下 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDownRepeat &lt;span style="color:#75715e"&gt;// 多次按下 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDragInside &lt;span style="color:#75715e"&gt;// 保持按下然后在按钮及其一定的外围拖动
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDragOutside &lt;span style="color:#75715e"&gt;// 保持按下,在按钮外面拖动
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDragEnter &lt;span style="color:#75715e"&gt;// DragOutside进入DragInside触发
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchDragExit &lt;span style="color:#75715e"&gt;// in到out触发
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchUpInside &lt;span style="color:#75715e"&gt;// 在按钮及其一定外围内松开
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchUpOutside &lt;span style="color:#75715e"&gt;// 按钮外面松开
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIControlEventTouchCancel &lt;span style="color:#75715e"&gt;// 点击取消
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;弹出一个警告，一般都这样写&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;buttonClicked:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)sender
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alert &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;提示&amp;#34;&lt;/span&gt; message:&lt;span style="color:#e6db74"&gt;@&amp;#34;你点击了一个按钮&amp;#34;&lt;/span&gt; delegate:self cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK&amp;#34;&lt;/span&gt; otherButtonTitles: nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此处弹出的一个警告，主要用到UIAlertView这个类，initWithTitle初始化标题，message是弹出警告类容，提示你做了什么事，delegate是委托代理，此处不需要其他类做什么事，自个完全能搞定，所以设置为self，类似于C++中的this指针，cancelButtonTitle这个一看就能明白，取消按钮的标题是什么了，otherButtonTitles设置其他按钮，也就是说你需要更多按钮支持的时候，此处不需要，只要一个nil就好了，就如还需要其他的，你可以添加代码假如：otherButtonTitles:@&amp;ldquo;test1&amp;rdquo;,@&amp;ldquo;test2&amp;rdquo;,@&amp;ldquo;test3&amp;rdquo;,@&amp;ldquo;test4&amp;rdquo;,nil&lt;/p&gt;</description></item><item><title>iOS LLDB和GDB的区别</title><link>https://zhangdapeng.dev/p/ios-lldb-he-gdb-de-qu-bie/</link><pubDate>Wed, 11 Jun 2025 11:31:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-lldb-he-gdb-de-qu-bie/</guid><description>&lt;p&gt;在iOS开发过程中，会遇到这样的问题，就是调试。但是在对于一个初学者的方式是，去搜索，搜索来的结果大部分都是gdb的命令（command），但是我的xcode显示的是lldb，这就难道我了。于是我在搜索lldb和gdb就出结果了。其实是有对照表的，下面给出链接&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://lldb.llvm.org/lldb-gdb.html" target="_blank" rel="noopener"
 &gt;http://lldb.llvm.org/lldb-gdb.html&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="gdb-to-lldb-command-map"&gt;&lt;a class="link" href="#1" &gt;GDB to LLDB Command Map&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;Below is a table of GDB commands with the LLDB counterparts. The built in GDB-compatibility aliases in LLDB are also listed. The full lldb command names are often long, but any unique short form can be used. Instead of &amp;ldquo;&lt;strong&gt;breakpoint set&lt;/strong&gt;&amp;rdquo;, &amp;ldquo;&lt;strong&gt;br se&lt;/strong&gt;&amp;rdquo; is also acceptable.&lt;/p&gt;
&lt;h1 id="execution-commands"&gt;&lt;a class="link" href="#2" &gt;Execution Commands&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Launch a process no arguments.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; run &lt;strong&gt;(gdb)&lt;/strong&gt; r&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process launch &lt;strong&gt;(lldb)&lt;/strong&gt; run &lt;strong&gt;(lldb)&lt;/strong&gt; r&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Launch a process with arguments&lt;!-- raw HTML omitted --&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; run &lt;!-- raw HTML omitted --&gt; &lt;strong&gt;(gdb)&lt;/strong&gt; r &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process launch &amp;ndash; &lt;!-- raw HTML omitted --&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; r &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Launch a process for with arguments &lt;strong&gt;a.out 1 2 3&lt;/strong&gt; without having to supply the args every time.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;%&lt;/strong&gt; gdb &amp;ndash;args a.out 1 2 3 &lt;strong&gt;(gdb)&lt;/strong&gt; run &amp;hellip; &lt;strong&gt;(gdb)&lt;/strong&gt; run &amp;hellip;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;%&lt;/strong&gt; lldb &amp;ndash; a.out 1 2 3 &lt;strong&gt;(lldb)&lt;/strong&gt; run &amp;hellip; &lt;strong&gt;(lldb)&lt;/strong&gt; run &amp;hellip;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Launch a process with arguments in new terminal window (Mac OS X only).&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process launch &amp;ndash;tty &amp;ndash; &lt;!-- raw HTML omitted --&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; pro la -t &amp;ndash; &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Launch a process with arguments in existing terminal /dev/ttys006 (Mac OS X only).&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process launch &amp;ndash;tty=/dev/ttys006 &amp;ndash; &lt;!-- raw HTML omitted --&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; pro la -t/dev/ttys006 &amp;ndash; &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set environment variables for process before launching.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set env DEBUG 1&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; settings set target.env-vars DEBUG=1 &lt;strong&gt;(lldb)&lt;/strong&gt; set se target.env-vars DEBUG=1 &lt;strong&gt;(lldb)&lt;/strong&gt; env DEBUG=1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set environment variables for process and launch process in one command.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process launch -v DEBUG=1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Attach to a process with process ID 123.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; attach 123&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process attach &amp;ndash;pid 123 &lt;strong&gt;(lldb)&lt;/strong&gt; attach -p 123&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Attach to a process named &amp;ldquo;a.out&amp;rdquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; attach a.out&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process attach &amp;ndash;name a.out &lt;strong&gt;(lldb)&lt;/strong&gt; pro at -n a.out&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Wait for a process named &amp;ldquo;a.out&amp;rdquo; to launch and attach.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; attach -waitfor a.out&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; process attach &amp;ndash;name a.out &amp;ndash;waitfor &lt;strong&gt;(lldb)&lt;/strong&gt; pro at -n a.out -w&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Attach to a remote gdb protocol server running on system &amp;ldquo;eorgadd&amp;rdquo;, port 8000.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; target remote eorgadd:8000&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; gdb-remote eorgadd:8000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Attach to a remote gdb protocol server running on the local system, port 8000.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; target remote localhost:8000&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; gdb-remote 8000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Attach to a Darwin kernel in kdp mode on system &amp;ldquo;eorgadd&amp;rdquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; kdp-reattach eorgadd&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; kdp-remote eorgadd&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Do a source level single step in the currently selected thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; step &lt;strong&gt;(gdb)&lt;/strong&gt; s&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread step-in &lt;strong&gt;(lldb)&lt;/strong&gt; step &lt;strong&gt;(lldb)&lt;/strong&gt; s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Do a source level single step over in the currently selected thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; next &lt;strong&gt;(gdb)&lt;/strong&gt; n&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread step-over &lt;strong&gt;(lldb)&lt;/strong&gt; next &lt;strong&gt;(lldb)&lt;/strong&gt; n&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Do an instruction level single step in the currently selected thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; stepi &lt;strong&gt;(gdb)&lt;/strong&gt; si&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread step-inst &lt;strong&gt;(lldb)&lt;/strong&gt; si&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Do an instruction level single step over in the currently selected thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; nexti &lt;strong&gt;(gdb)&lt;/strong&gt; ni&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread step-inst-over &lt;strong&gt;(lldb)&lt;/strong&gt; ni&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Step out of the currently selected frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; finish&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread step-out &lt;strong&gt;(lldb)&lt;/strong&gt; finish&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Return immediately from the currently selected frame, with an optional return value.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; return &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread return &lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Backtrace and disassemble every time you stop.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target stop-hook add Enter your stop hook command(s). Type &amp;lsquo;DONE&amp;rsquo; to end. &amp;gt; bt &amp;gt; disassemble &amp;ndash;pc &amp;gt; DONE Stop hook #1 added.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="breakpoint-commands"&gt;&lt;a class="link" href="#3" &gt;Breakpoint Commands&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint at all functions named &lt;strong&gt;main&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; break main&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;name main &lt;strong&gt;(lldb)&lt;/strong&gt; br s -n main &lt;strong&gt;(lldb)&lt;/strong&gt; b main&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint in file &lt;strong&gt;test.c&lt;/strong&gt; at line &lt;strong&gt;12&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; break test.c:12&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;file test.c &amp;ndash;line 12 &lt;strong&gt;(lldb)&lt;/strong&gt; br s -f test.c -l 12 &lt;strong&gt;(lldb)&lt;/strong&gt; b test.c:12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint at all C++ methods whose basename is &lt;strong&gt;main&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; break main &lt;em&gt;(Hope that there are no C funtions named &lt;strong&gt;main&lt;/strong&gt;)&lt;/em&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;method main &lt;strong&gt;(lldb)&lt;/strong&gt; br s -M main&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint at and object C function: &lt;strong&gt;-[NSString stringWithFormat:]&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; break -[NSString stringWithFormat:]&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;name &amp;ldquo;-[NSString stringWithFormat:]&amp;rdquo; &lt;strong&gt;(lldb)&lt;/strong&gt; b -[NSString stringWithFormat:]&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint at all Objective C methods whose selector is &lt;strong&gt;count&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; break count &lt;em&gt;(Hope that there are no C or C++ funtions named &lt;strong&gt;count&lt;/strong&gt;)&lt;/em&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;selector count &lt;strong&gt;(lldb)&lt;/strong&gt; br s -S count&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint by regular expression on function name.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; rbreak regular-expression&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;func-regex regular-expression &lt;strong&gt;(lldb)&lt;/strong&gt; br s -r regular-expression&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ensure that breakpoints by file and line work for #included .c/.cpp/.m files.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; b foo.c:12&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; settings set target.inline-breakpoint-strategy always &lt;strong&gt;(lldb)&lt;/strong&gt; br s -f foo.c -l 12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a breakpoint by regular expression on source file contents.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; shell grep -e -n pattern source-file &lt;strong&gt;(gdb)&lt;/strong&gt; break source-file:CopyLineNumbers&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint set &amp;ndash;source-pattern regular-expression &amp;ndash;file SourceFile &lt;strong&gt;(lldb)&lt;/strong&gt; br s -p regular-expression -f file&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;List all breakpoints.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info break&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint list &lt;strong&gt;(lldb)&lt;/strong&gt; br l&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Delete a breakpoint.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; delete 1&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; breakpoint delete 1 &lt;strong&gt;(lldb)&lt;/strong&gt; br del 1&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="watchpoint-commands"&gt;&lt;a class="link" href="#4" &gt;Watchpoint Commands&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a watchpoint on a variable when it is written to.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; watch global_var&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; watchpoint set variable global_var &lt;strong&gt;(lldb)&lt;/strong&gt; wa s v global_var&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a watchpoint on a memory location when it is written into. The size of the region to watch for defaults to the pointer size if no &amp;lsquo;-x byte_size&amp;rsquo; is specified. This command takes raw input, evaluated as an expression returning an unsigned integer pointing to the start of the region, after the &amp;lsquo;&amp;ndash;&amp;rsquo; option terminator.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; watch -location g_char_ptr&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; watchpoint set expression &amp;ndash; my_ptr &lt;strong&gt;(lldb)&lt;/strong&gt; wa s e &amp;ndash; my_ptr&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set a condition on a watchpoint.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; watch set var global &lt;strong&gt;(lldb)&lt;/strong&gt; watchpoint modify -c &amp;lsquo;(global==5)&amp;rsquo; &lt;strong&gt;(lldb)&lt;/strong&gt; c &amp;hellip; &lt;strong&gt;(lldb)&lt;/strong&gt; bt * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out&lt;code&gt;modify + 21 at main.cpp:16, stop reason = watchpoint 1 frame #0: 0x0000000100000ef5 a.out&lt;/code&gt;modify + 21 at main.cpp:16 frame #1: 0x0000000100000eac a.out&lt;code&gt;main + 108 at main.cpp:25 frame #2: 0x00007fff8ac9c7e1 libdyld.dylib&lt;/code&gt;start + 1 &lt;strong&gt;(lldb)&lt;/strong&gt; frame var global (int32_t) global = 5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;List all watchpoints.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info break&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; watchpoint list &lt;strong&gt;(lldb)&lt;/strong&gt; watch l&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Delete a watchpoint.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; delete 1&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; watchpoint delete 1 &lt;strong&gt;(lldb)&lt;/strong&gt; watch del 1&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="examining-variables"&gt;&lt;a class="link" href="#5" &gt;Examining Variables&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the arguments and local variables for the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info args and &lt;strong&gt;(gdb)&lt;/strong&gt; info locals&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame variable &lt;strong&gt;(lldb)&lt;/strong&gt; fr v&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the local variables for the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info locals&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame variable &amp;ndash;no-args &lt;strong&gt;(lldb)&lt;/strong&gt; fr v -a&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the contents of local variable &amp;ldquo;bar&amp;rdquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; p bar&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame variable bar &lt;strong&gt;(lldb)&lt;/strong&gt; fr v bar &lt;strong&gt;(lldb)&lt;/strong&gt; p bar&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the contents of local variable &amp;ldquo;bar&amp;rdquo; formatted as hex.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; p/x bar&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame variable &amp;ndash;format x bar &lt;strong&gt;(lldb)&lt;/strong&gt; fr v -f x bar&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the contents of global variable &amp;ldquo;baz&amp;rdquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; p baz&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target variable baz &lt;strong&gt;(lldb)&lt;/strong&gt; ta v baz&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the global/static variables defined in the current source file.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;n/a&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target variable &lt;strong&gt;(lldb)&lt;/strong&gt; ta v&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Display a the variable &amp;ldquo;argc&amp;rdquo; and &amp;ldquo;argv&amp;rdquo; every time you stop.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; display argc &lt;strong&gt;(gdb)&lt;/strong&gt; display argv&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target stop-hook add &amp;ndash;one-liner &amp;ldquo;frame variable argc argv&amp;rdquo; &lt;strong&gt;(lldb)&lt;/strong&gt; ta st a -o &amp;ldquo;fr v argc argv&amp;rdquo; &lt;strong&gt;(lldb)&lt;/strong&gt; display argc &lt;strong&gt;(lldb)&lt;/strong&gt; display argv&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Display a the variable &amp;ldquo;argc&amp;rdquo; and &amp;ldquo;argv&amp;rdquo; only when you stop in the function named &lt;strong&gt;main&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target stop-hook add &amp;ndash;name main &amp;ndash;one-liner &amp;ldquo;frame variable argc argv&amp;rdquo; &lt;strong&gt;(lldb)&lt;/strong&gt; ta st a -n main -o &amp;ldquo;fr v argc argv&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Display the variable &amp;ldquo;*this&amp;rdquo; only when you stop in c class named &lt;strong&gt;MyClass&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; target stop-hook add &amp;ndash;classname MyClass &amp;ndash;one-liner &amp;ldquo;frame variable *this&amp;rdquo; &lt;strong&gt;(lldb)&lt;/strong&gt; ta st a -c MyClass -o &amp;ldquo;fr v *this&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="evaluating-expressions"&gt;&lt;a class="link" href="#6" &gt;Evaluating expressions&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Evaluating a generalized expression in the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; print (int) printf (&amp;ldquo;Print nine: %d.&amp;rdquo;, 4 + 5) or if you don&amp;rsquo;t want to see void returns: &lt;strong&gt;(gdb)&lt;/strong&gt; call (int) printf (&amp;ldquo;Print nine: %d.&amp;rdquo;, 4 + 5)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; expr (int) printf (&amp;ldquo;Print nine: %d.&amp;rdquo;, 4 + 5) or using the print alias: &lt;strong&gt;(lldb)&lt;/strong&gt; print (int) printf (&amp;ldquo;Print nine: %d.&amp;rdquo;, 4 + 5)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Creating and assigning a value to a convenience variable.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set $foo = 5 &lt;strong&gt;(gdb)&lt;/strong&gt; set variable $foo = 5 or using the print command &lt;strong&gt;(gdb)&lt;/strong&gt; print $foo = 5 or using the call command &lt;strong&gt;(gdb)&lt;/strong&gt; call $foo = 5 and if you want to specify the type of the variable: &lt;strong&gt;(gdb)&lt;/strong&gt; set $foo = (unsigned int) 5&lt;/td&gt;
					&lt;td&gt;In lldb you evaluate a variable declaration expression as you would write it in C: &lt;strong&gt;(lldb)&lt;/strong&gt; expr unsigned int $foo = 5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Printing the ObjC &amp;ldquo;description&amp;rdquo; of an object.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; po [SomeClass returnAnObject]&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; expr -o &amp;ndash; [SomeClass returnAnObject] or using the po alias: &lt;strong&gt;(lldb)&lt;/strong&gt; po [SomeClass returnAnObject]&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Print the dynamic type of the result of an expression.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set print object 1 &lt;strong&gt;(gdb)&lt;/strong&gt; p someCPPObjectPtrOrReference only works for C++ objects.&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; expr -d 1 &amp;ndash; [SomeClass returnAnObject] &lt;strong&gt;(lldb)&lt;/strong&gt; expr -d 1 &amp;ndash; someCPPObjectPtrOrReference or set dynamic type printing to be the default: &lt;strong&gt;(lldb)&lt;/strong&gt; settings set target.prefer-dynamic run-target&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Calling a function so you can stop at a breakpoint in the function.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set unwindonsignal 0 &lt;strong&gt;(gdb)&lt;/strong&gt; p function_with_a_breakpoint()&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; expr -i 0 &amp;ndash; function_with_a_breakpoint()&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Calling a function that crashes, and stopping when the function crashes.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set unwindonsignal 0 &lt;strong&gt;(gdb)&lt;/strong&gt; p function_which_crashes()&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; expr -u 0 &amp;ndash; function_which_crashes()&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="examining-thread-state"&gt;&lt;a class="link" href="#7" &gt;Examining Thread State&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the stack backtrace for the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; bt&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread backtrace &lt;strong&gt;(lldb)&lt;/strong&gt; bt&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the stack backtraces for all threads.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; thread apply all bt&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread backtrace all &lt;strong&gt;(lldb)&lt;/strong&gt; bt all&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Backtrace the first five frames of the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; bt 5&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; thread backtrace -c 5 &lt;strong&gt;(lldb)&lt;/strong&gt; bt 5 (&lt;em&gt;lldb-169 and later&lt;/em&gt;) &lt;strong&gt;(lldb)&lt;/strong&gt; bt -c 5 (&lt;em&gt;lldb-168 and earlier&lt;/em&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Select a different stack frame by index for the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; frame 12&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame select 12 &lt;strong&gt;(lldb)&lt;/strong&gt; fr s 12 &lt;strong&gt;(lldb)&lt;/strong&gt; f 12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;List information about the currently selected frame in the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame info&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Select the stack frame that called the current stack frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; up&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; up &lt;strong&gt;(lldb)&lt;/strong&gt; frame select &amp;ndash;relative=1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Select the stack frame that is called by the current stack frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; down&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; down &lt;strong&gt;(lldb)&lt;/strong&gt; frame select &amp;ndash;relative=-1 &lt;strong&gt;(lldb)&lt;/strong&gt; fr s -r-1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Select a different stack frame using a relative offset.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; up 2 &lt;strong&gt;(gdb)&lt;/strong&gt; down 3&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; frame select &amp;ndash;relative 2 &lt;strong&gt;(lldb)&lt;/strong&gt; fr s -r2 &lt;strong&gt;(lldb)&lt;/strong&gt; frame select &amp;ndash;relative -3 &lt;strong&gt;(lldb)&lt;/strong&gt; fr s -r-3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the general purpose registers for the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info registers&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register read&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Write a new decimal value &amp;lsquo;123&amp;rsquo; to the current thread register &amp;lsquo;rax&amp;rsquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; p $rax = 123&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register write rax 123&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Skip 8 bytes ahead of the current program counter (instruction pointer). Note that we use backticks to evaluate an expression and insert the scalar result in LLDB.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; jump *$pc+8&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register write pc &lt;code&gt;$pc+8&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the general purpose registers for the current thread formatted as &lt;strong&gt;signed decimal&lt;/strong&gt;. LLDB tries to use the same format characters as &lt;strong&gt;printf(3)&lt;/strong&gt; when possible. Type &amp;ldquo;help format&amp;rdquo; to see the full list of format specifiers.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register read &amp;ndash;format i &lt;strong&gt;(lldb)&lt;/strong&gt; re r -f i &lt;em&gt;LLDB now supports the GDB shorthand format syntax but there can&amp;rsquo;t be space after the command:&lt;/em&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; register read/d&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show all registers in all register sets for the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info all-registers&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register read &amp;ndash;all &lt;strong&gt;(lldb)&lt;/strong&gt; re r -a&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the values for the registers named &amp;ldquo;rax&amp;rdquo;, &amp;ldquo;rsp&amp;rdquo; and &amp;ldquo;rbp&amp;rdquo; in the current thread.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info all-registers rax rsp rbp&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register read rax rsp rbp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show the values for the register named &amp;ldquo;rax&amp;rdquo; in the current thread formatted as &lt;strong&gt;binary&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; p/t $rax&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; register read &amp;ndash;format binary rax &lt;strong&gt;(lldb)&lt;/strong&gt; re r -f b rax &lt;em&gt;LLDB now supports the GDB shorthand format syntax but there can&amp;rsquo;t be space after the command:&lt;/em&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; register read/t rax &lt;strong&gt;(lldb)&lt;/strong&gt; p/t $rax&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Read memory from address 0xbffff3c0 and show 4 hex uint32_t values.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; x/4xw 0xbffff3c0&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; memory read &amp;ndash;size 4 &amp;ndash;format x &amp;ndash;count 4 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; me r -s4 -fx -c4 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; x -s4 -fx -c4 0xbffff3c0 &lt;em&gt;LLDB now supports the GDB shorthand format syntax but there can&amp;rsquo;t be space after the command:&lt;/em&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; memory read/4xw 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; x/4xw 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; memory read &amp;ndash;gdb-format 4xw 0xbffff3c0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Read memory starting at the expression &amp;ldquo;argv[0]&amp;rdquo;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; x argv[0]&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; memory read &lt;code&gt;argv[0]&lt;/code&gt; &lt;em&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; any command can inline a scalar expression result (as long as the target is stopped) using backticks around any expression:&lt;/em&gt; &lt;strong&gt;(lldb)&lt;/strong&gt; memory read &amp;ndash;size &lt;code&gt;sizeof(int)&lt;/code&gt; &lt;code&gt;argv[0]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Read 512 bytes of memory from address 0xbffff3c0 and save results to a local file as &lt;strong&gt;text&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set logging on &lt;strong&gt;(gdb)&lt;/strong&gt; set logging file /tmp/mem.txt &lt;strong&gt;(gdb)&lt;/strong&gt; x/512bx 0xbffff3c0 &lt;strong&gt;(gdb)&lt;/strong&gt; set logging off&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; memory read &amp;ndash;outfile /tmp/mem.txt &amp;ndash;count 512 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; me r -o/tmp/mem.txt -c512 0xbffff3c0 &lt;strong&gt;(lldb)&lt;/strong&gt; x/512bx -o/tmp/mem.txt 0xbffff3c0&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Save binary memory data starting at 0x1000 and ending at 0x2000 to a file.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; dump memory /tmp/mem.bin 0x1000 0x2000&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; memory read &amp;ndash;outfile /tmp/mem.bin &amp;ndash;binary 0x1000 0x1200 &lt;strong&gt;(lldb)&lt;/strong&gt; me r -o /tmp/mem.bin -b 0x1000 0x1200&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Get information about a specific heap allocation (available on Mac OS X only).&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info malloc 0x10010d680&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; script import lldb.macosx.heap &lt;strong&gt;(lldb)&lt;/strong&gt; process launch &amp;ndash;environment MallocStackLogging=1 &amp;ndash; [ARGS] &lt;strong&gt;(lldb)&lt;/strong&gt; malloc_info &amp;ndash;stack-history 0x10010d680&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Get information about a specific heap allocation and cast the result to any dynamic type that can be deduced (available on Mac OS X only)&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; script import lldb.macosx.heap &lt;strong&gt;(lldb)&lt;/strong&gt; malloc_info &amp;ndash;type 0x10010d680&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Find all heap blocks that contain a pointer specified by an expression EXPR (available on Mac OS X only).&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; script import lldb.macosx.heap &lt;strong&gt;(lldb)&lt;/strong&gt; ptr_refs EXPR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Find all heap blocks that contain a C string anywhere in the block (available on Mac OS X only).&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; script import lldb.macosx.heap &lt;strong&gt;(lldb)&lt;/strong&gt; cstr_refs CSTRING&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble the current function for the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; disassemble&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;frame &lt;strong&gt;(lldb)&lt;/strong&gt; di -f&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble any functions named &lt;strong&gt;main&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; disassemble main&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;name main &lt;strong&gt;(lldb)&lt;/strong&gt; di -n main&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble an address range.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; disassemble 0x1eb8 0x1ec3&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;start-address 0x1eb8 &amp;ndash;end-address 0x1ec3 &lt;strong&gt;(lldb)&lt;/strong&gt; di -s 0x1eb8 -e 0x1ec3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble 20 instructions from a given address.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; x/20i 0x1eb8&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;start-address 0x1eb8 &amp;ndash;count 20 &lt;strong&gt;(lldb)&lt;/strong&gt; di -s 0x1eb8 -c 20&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Show mixed source and disassembly for the current function for the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;n/a&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;frame &amp;ndash;mixed &lt;strong&gt;(lldb)&lt;/strong&gt; di -f -m&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble the current function for the current frame and show the opcode bytes.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;n/a&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;frame &amp;ndash;bytes &lt;strong&gt;(lldb)&lt;/strong&gt; di -f -b&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Disassemble the current source line for the current frame.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;n/a&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; disassemble &amp;ndash;line &lt;strong&gt;(lldb)&lt;/strong&gt; di -l&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="executable-and-shared-library-query-commands"&gt;&lt;a class="link" href="#8" &gt;Executable and Shared Library Query Commands&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;List the main executable and all dependent shared libraries.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info shared&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image list&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Look up information for a raw address in the executable or any shared libraries.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info symbol 0x1ec4&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image lookup &amp;ndash;address 0x1ec4 &lt;strong&gt;(lldb)&lt;/strong&gt; im loo -a 0x1ec4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Look up functions matching a regular expression in a binary.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info function &amp;lt;FUNC_REGEX&amp;gt;&lt;/td&gt;
					&lt;td&gt;This one finds debug symbols: &lt;strong&gt;(lldb)&lt;/strong&gt; image lookup -r -n &amp;lt;FUNC_REGEX&amp;gt; This one finds non-debug symbols: &lt;strong&gt;(lldb)&lt;/strong&gt; image lookup -r -s &amp;lt;FUNC_REGEX&amp;gt; Provide a list of binaries as arguments to limit the search.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Find full souce line information.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info line 0x1ec4&lt;/td&gt;
					&lt;td&gt;This one is a bit messy at present. Do: &lt;strong&gt;(lldb)&lt;/strong&gt; image lookup -v &amp;ndash;address 0x1ec4 and look for the LineEntry line, which will have the full source path and line range information.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Look up functions matching a regular expression in a binary.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; info function &amp;lt;FUNC_REGEX&amp;gt;&lt;/td&gt;
					&lt;td&gt;This one finds debug symbols: &lt;strong&gt;(lldb)&lt;/strong&gt; image lookup -r -n &amp;lt;FUNC_REGEX&amp;gt; This one finds non-debug symbols: &lt;strong&gt;(lldb)&lt;/strong&gt; image lookup -r -s &amp;lt;FUNC_REGEX&amp;gt; Provide a list of binaries as arguments to limit the search.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Look up information for an address in &lt;strong&gt;a.out only.&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image lookup &amp;ndash;address 0x1ec4 a.out &lt;strong&gt;(lldb)&lt;/strong&gt; im loo -a 0x1ec4 a.out&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Look up information for for a typePointby name.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; ptype Point&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image lookup &amp;ndash;type Point &lt;strong&gt;(lldb)&lt;/strong&gt; im loo -t Point&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dump all sections from the main executable and any shared libraries.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; maintenance info sections&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image dump sections&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dump all sections in the &lt;strong&gt;a.out&lt;/strong&gt; module.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image dump sections a.out&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dump all symbols from the main executable and any shared libraries.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image dump symtab&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dump all symbols in &lt;strong&gt;a.out&lt;/strong&gt; and &lt;strong&gt;liba.so&lt;/strong&gt;.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; image dump symtab a.out liba.so&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="miscellaneous"&gt;&lt;a class="link" href="#9" &gt;Miscellaneous&lt;/a&gt;
&lt;/h1&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GDB&lt;/td&gt;
					&lt;td&gt;LLDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Echo text to the screen.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; echo Here is some text\n&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; script print &amp;ldquo;Here is some text&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Remap source file pathnames for the debug session. If your source files are no longer located in the same location as when the program was built &amp;mdash; maybe the program was built on a different computer &amp;mdash; you need to tell the debugger how to find the sources at their local file path instead of the build system&amp;rsquo;s file path.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; set pathname-substitutions /buildbot/path /my/path&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;(lldb)&lt;/strong&gt; settings set target.source-map /buildbot/path /my/path&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Supply a catchall directory to search for source files in.&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;(gdb)&lt;/strong&gt; directory /my/path&lt;/td&gt;
					&lt;td&gt;(&lt;em&gt;No equivalent command yet.)&lt;/em&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;做个备份吧，呵呵，希望没有侵权&lt;/p&gt;</description></item><item><title>iOS Objective-C EXC_BAD_ACCESS问题</title><link>https://zhangdapeng.dev/p/ios-objective-c-exc-bad-access-wen-ti/</link><pubDate>Wed, 11 Jun 2025 11:27:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-objective-c-exc-bad-access-wen-ti/</guid><description>&lt;p&gt;写程序遇到 Bug 并不可怕，大部分的问题，通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候，通过简单常规的手段很难发现问题。&lt;br&gt;
写程序遇到 Bug 并不可怕，大部分的问题，通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候，通过简单常规的手段很难发现问题。这篇文章，给大家介绍一个常用的查找 EXC_BAD_ACCESS 问题根源的方法。&lt;br&gt;
首先说一下 EXC_BAD_ACCESS 这个错误，可以这么说，90%的错误来源在于对一个已经释放的对象进行release操作。&lt;br&gt;
Objective-C 这段代码有三个致命问题：1、内存泄露；2、错误释放；3、造成 EXC_BAD_ACCESS 错误。&lt;/p&gt;
&lt;p&gt;1， NSString* s = [[NSString alloc]initWithString:@”This is a test string”]; 创建了一个 NSString Object，随后的 s = [s substringFromIndex:[s rangeOfString:@&amp;ldquo;a&amp;rdquo;].location]; 执行后，导致创建的对象引用消失，直接造成内存泄露。&lt;/p&gt;
&lt;p&gt;2，错误释放。[s release]; 这个问题，原因之一是一个逻辑错误，以为 s 还是我们最初创建的那个 NSString 对象。第二是因为从 substringFromIndex:(NSUInteger i) 这个方法返回的 NSString 对象，并不需要&lt;/p&gt;
&lt;p&gt;我们来释放，它其实是一个被 substringFromIndex 方法标记为 autorelease 的对象。如果我们强行的释放了它，那么会造成 EXC_BAD_ACCESS 问题。&lt;/p&gt;
&lt;p&gt;3， EXC_BAD_ACCESS。由于 s 指向的 NSString 对象被标记为 autorelease, 则在 NSAutoreleasePool 中已有记录。但是由于我们在前面错误的释放了该对象，则当 [pool drain] 的时候，NSAutoreleasePool&lt;/p&gt;
&lt;p&gt;又一次的对它记录的 s 对象调用了 release 方法，但这个时候 s 已经被释放不复存在，则直接导致了 EXC_BAD_ACCESS问题。&lt;/p&gt;
&lt;p&gt;查看更多的Console信息&lt;/p&gt;
&lt;p&gt;工作区-&amp;gt;Excuteables-&amp;gt;双击其分组下的文件-&amp;gt;Arguments设置运行参数&lt;/p&gt;
&lt;p&gt;1: 为工程运行时加入 NSZombieEnabled 环境变量，则在 EXC_BAD_ACCESS 发生时，XCode 的 Console 会打印出问题描述。&lt;/p&gt;
&lt;p&gt;2：加入 MallocStackLogging 来启用malloc记录&lt;/p&gt;
&lt;p&gt;做如下设置：&lt;/p&gt;
&lt;p&gt;Project -&amp;gt; Edit active executable -&amp;gt;Argument&lt;/p&gt;
&lt;p&gt;添加如下四个参数&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;NSDebugEnabled&lt;/p&gt;
&lt;p&gt;NSZombieEnabled&lt;/p&gt;
&lt;p&gt;MallocStackLogging&lt;/p&gt;
&lt;p&gt;MallocStackLoggingNoCompact&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;来源：http://blog.csdn.net/sjzsp/article/details/6386987&lt;/p&gt;</description></item><item><title>iOS 调试 解决EXC_BAD_ACCESS错误</title><link>https://zhangdapeng.dev/p/ios-tiao-shi-jie-jue-exc-bad-access-cuo-wu/</link><pubDate>Wed, 11 Jun 2025 11:27:11 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-tiao-shi-jie-jue-exc-bad-access-cuo-wu/</guid><description>&lt;p&gt;做iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash，出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源，只是在应用 Delegate 上留下像Thread 1: Program received signal:&amp;ldquo;EXC_BAD_ACCESS&amp;rdquo;，让问题无从找起。&lt;/p&gt;
&lt;p&gt;比如你对已释放的对象发送消息时就会出现，EXC_BAD_ACCESS，再如release 的对象再 release，release 那些autorelease 的对象等也会报这样的错。默认设置下 Xcode 不会给你定位具体是哪一行代码，不该去使用已释放的对象，或者release 用错了。&lt;/p&gt;
&lt;p&gt;比如下面这段代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setClearsContextBeforeDrawing: YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//画背景线条------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorRef backColorRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blackColor].CGColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat backLineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat backMiterLimit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineWidth(context, backLineWidth);&lt;span style="color:#75715e"&gt;//主线宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetMiterLimit(context, backMiterLimit);&lt;span style="color:#75715e"&gt;//投影角度 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetShadowWithColor(context, CGSizeMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;), &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, backColorRef);&lt;span style="color:#75715e"&gt;//设置双条线 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineJoin(context, kCGLineJoinRound);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineCap(context, kCGLineCapRound );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetBlendMode(context, kCGBlendModeNormal);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.charW;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.chartH;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绘制纵向的坐标线 和 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;vDesc.count; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint bPoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint ePoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(x, y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//纵坐标起始点的y坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//纵坐标起始点的x坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; vX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; vY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setCenter:CGPointMake(bPoint.x&lt;span style="color:#f92672"&gt;-&lt;/span&gt;vX, bPoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;vY)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextAlignment:NSTextAlignmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextColor:[UIColor whiteColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:[vDesc objectAtIndex:i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextMoveToPoint(context, bPoint.x, bPoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, ePoint.x, ePoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//间隔
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绘制横向的坐标线 和 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;array.count&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//横向值的y坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat hY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; chartH &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(i&lt;span style="color:#f92672"&gt;*&lt;/span&gt;vInterval&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, hY, &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.transform &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGAffineTransformMakeRotation(&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextAlignment:NSTextAlignmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextColor:[UIColor whiteColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.numberOfLines &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.adjustsFontSizeToFitWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.minimumScaleFactor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:[hDesc objectAtIndex:i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//画点线条------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorRef pointColorRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;24.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;116.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;205.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;].CGColor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat pointLineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.5f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat pointMiterLimit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineWidth(context, pointLineWidth);&lt;span style="color:#75715e"&gt;//主线宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetMiterLimit(context, pointMiterLimit);&lt;span style="color:#75715e"&gt;//投影角度 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetShadowWithColor(context, CGSizeMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;), &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, pointColorRef);&lt;span style="color:#75715e"&gt;//设置双条线 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineJoin(context, kCGLineJoinRound);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineCap(context, kCGLineCapRound );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetBlendMode(context, kCGBlendModeNormal);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//绘图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGPoint p1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[array objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] CGPointValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//坐标的基础坐标 y值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; yBase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; chartH &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGContextMoveToPoint(context, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, yBase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;[array count]; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		p1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[array objectAtIndex:i] CGPointValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint goPoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(p1.x&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, yBase&lt;span style="color:#f92672"&gt;-&lt;/span&gt;p1.y&lt;span style="color:#f92672"&gt;*&lt;/span&gt;vInterval&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		CGContextAddLineToPoint(context, goPoint.x, goPoint.y);;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加触摸点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;bt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setBackgroundColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setCenter:goPoint];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt addTarget:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(btAction:) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:bt];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGContextStrokePath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面的代码就会出现EXC_BAD_ACCESS 错误：&lt;br&gt;
错误提示是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;CoreGraphics`CGColorGetAlpha:&lt;br&gt;
0x31c1d780: vmov.i32d0, #0x0&lt;br&gt;
0x31c1d784: cmp r0, #0&lt;br&gt;
0x31c1d786: itttt ne&lt;br&gt;
0x31c1d788: ldrne r1, [r0, #28]&lt;br&gt;
0x31c1d78a: addne.wr0, r0, r1, lsl #2&lt;br&gt;
0x31c1d78e: ldrne r0, [r0, #28]&amp;lt;-&lt;br&gt;
0x31c1d790: vmovne d0, r0, r0&lt;br&gt;
0x31c1d794: vmov r0, s0&lt;br&gt;
0x31c1d798: bx lr&lt;br&gt;
0x31c1d79a: nop&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;会定位到红色的那一行，这个实在是让人头痛，不过还是有解决办法的。&lt;/p&gt;
&lt;p&gt;NSZombieEnabled环境变量可以帮我们的忙，就是当 设置NSZombieEnabled环境变量后，一个对象销毁时会被转化为_NSZombie，设置NSZombieEnabled后，当你向一个已经释 放的对象发送消息，这个对象就不会向之前那样Crash或者产生一个难以理解的行为，而是放出一个错误消息，然后以一种可预测的可以产生debug断点的 方式消失， 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。&lt;/p&gt;
&lt;p&gt;对 Xcode 设置了NSZombieEnabled 之后，&lt;/p&gt;
&lt;p&gt;错误提示是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;*** -[Not A Type retain]: message sent to deallocated instance 0x2009b480&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;应该是内存泄露的问题。&lt;/p&gt;
&lt;p&gt;修改代码后，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;drawRect:&lt;/span&gt;(CGRect)rect
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self setClearsContextBeforeDrawing: YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextRef context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIGraphicsGetCurrentContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//画背景线条------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CGColorRef backColorRef = [UIColor blackColor].CGColor;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorRef backColorRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CGColorRef)([UIColor blackColor]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat backLineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat backMiterLimit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineWidth(context, backLineWidth);&lt;span style="color:#75715e"&gt;//主线宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetMiterLimit(context, backMiterLimit);&lt;span style="color:#75715e"&gt;//投影角度 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetShadowWithColor(context, CGSizeMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;), &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, backColorRef);&lt;span style="color:#75715e"&gt;//设置双条线 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineJoin(context, kCGLineJoinRound);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineCap(context, kCGLineCapRound );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetBlendMode(context, kCGBlendModeNormal);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.charW;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.chartH;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绘制纵向的坐标线 和 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;vDesc.count; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint bPoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint ePoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(x, y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//纵坐标起始点的y坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//纵坐标起始点的x坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; vX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; vY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setCenter:CGPointMake(bPoint.x&lt;span style="color:#f92672"&gt;-&lt;/span&gt;vX, bPoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;vY)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextAlignment:NSTextAlignmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextColor:[UIColor whiteColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:[vDesc objectAtIndex:i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextMoveToPoint(context, bPoint.x, bPoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextAddLineToPoint(context, ePoint.x, ePoint.y&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;;&lt;span style="color:#75715e"&gt;//间隔
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绘制横向的坐标线 和 值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;array.count&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//横向值的y坐标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat hY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; chartH &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabel alloc]initWithFrame:CGRectMake(i&lt;span style="color:#f92672"&gt;*&lt;/span&gt;vInterval&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, hY, &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.transform &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGAffineTransformMakeRotation(&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextAlignment:NSTextAlignmentCenter];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setBackgroundColor:[UIColor clearColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setTextColor:[UIColor whiteColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.numberOfLines &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.adjustsFontSizeToFitWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label.minimumScaleFactor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [label setText:[hDesc objectAtIndex:i]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//画点线条------------------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CGColorRef pointColorRef = [UIColor colorWithRed:24.0f/255.0f green:116.0f/255.0f blue:205.0f/255.0f alpha:1.0].CGColor;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGColorRef pointColorRef &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;__bridge&lt;/span&gt; CGColorRef)[UIColor colorWithRed:&lt;span style="color:#ae81ff"&gt;24.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;116.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;205.0f&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;255.0f&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat pointLineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.5f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat pointMiterLimit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineWidth(context, pointLineWidth);&lt;span style="color:#75715e"&gt;//主线宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetMiterLimit(context, pointMiterLimit);&lt;span style="color:#75715e"&gt;//投影角度 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetShadowWithColor(context, CGSizeMake(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;), &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, pointColorRef);&lt;span style="color:#75715e"&gt;//设置双条线 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineJoin(context, kCGLineJoinRound);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetLineCap(context, kCGLineCapRound );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetBlendMode(context, kCGBlendModeNormal);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;//绘图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGPoint p1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[array objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] CGPointValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//坐标的基础坐标 y值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; yBase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; chartH &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGContextMoveToPoint(context, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, yBase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;[array count]; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		p1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[array objectAtIndex:i] CGPointValue];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint goPoint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGPointMake(p1.x&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, yBase&lt;span style="color:#f92672"&gt;-&lt;/span&gt;p1.y&lt;span style="color:#f92672"&gt;*&lt;/span&gt;vInterval&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		CGContextAddLineToPoint(context, goPoint.x, goPoint.y);;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加触摸点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;bt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIButton buttonWithType:UIButtonTypeCustom];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setBackgroundColor:[UIColor redColor]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt setCenter:goPoint];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [bt addTarget:self 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; action:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(btAction:) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forControlEvents:UIControlEventTouchUpInside];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self addSubview:bt];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	CGContextStrokePath(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一切正常了。成功了！&lt;/p&gt;
&lt;p&gt;如何设置 NSZombieEnabled 呢，在 Xcode3 和 Xcode4 下设置不一样，Xcode4 下设置很简单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Xcode3 下 NSZombieEnabled 设置方法如下：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在XCode左边那个Groups&amp;amp; Files栏中找到Executables，双击其中的一项，或者右键Get Info；&lt;/li&gt;
&lt;li&gt;切换到Arguments&lt;/li&gt;
&lt;li&gt;这里一共有两个框，在下面那个Variables to be set in theenvironment:点+号添加一项，Name里填NSZombieEnabled，Value填Yes，要保证前面的钩是选中的。&lt;br&gt;
&lt;strong&gt;Xcode4 下设置 NSZombieEnabled 的方法：&lt;/strong&gt;&lt;br&gt;
你可以点击 Xcode4 菜单 Product -&amp;gt; Edit Scheme-&amp;gt; Arguments, 然后将点击”加号”, 将 NSZombieEnabled 参数加到Environment Variables 窗口中, 后面的数值写上 ”YES”.&lt;br&gt;
或者在 Xcode4 菜单 Product -&amp;gt; EditScheme -&amp;gt; Diagnostics 设置窗口中直接勾上Enable ZombieObjects 即可，Xcode 可用 cmd＋shift＋&amp;lt; 进到这个窗口。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;讲Cocoa技术十分专业的网站之一，下面的链接详细讲了讲NSZombieEnable的原理。http://www.cocoadev.com/index.pl?NSZombieEnabled&lt;br&gt;
苹果官方的Mac OS X Debugging Magic,详细讲述了最为一个高级苹果程序员应该具备的调试技巧 &lt;a class="link" href="http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html" target="_blank" rel="noopener"
 &gt;http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html&lt;/a&gt;&lt;br&gt;
其实还可以在Instruments中开启NSZombie选项，这样就可以在Instruments中直接查看crash时候的callstack了：http://www.markj.net/iphone-memory-debug-nszombie/&lt;br&gt;
最后提醒NSZombieEnabled只能在调试的时候使用，千万不要忘记在产品发布的时候去掉，因为NSZombieEnabled不会真正去释放dealloc对象的内存，一直开启后果可想而知，自重！&lt;/p&gt;</description></item><item><title>iOS NSDateFormatter格式详细列表</title><link>https://zhangdapeng.dev/p/ios-nsdateformatter-ge-shi-xiang-xi-lie-biao/</link><pubDate>Wed, 11 Jun 2025 11:09:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nsdateformatter-ge-shi-xiang-xi-lie-biao/</guid><description>&lt;p&gt;iOS开发中NSDateFormatter是一个很常用的类，用于格式化NSDate对象，支持本地化的信息。与时间相关的功能还可能会用到NSDateComponents类和NSCalendar类等。本文主要列出NSDateFormatter常见用法。&lt;/p&gt;
&lt;p&gt;NSDate对象包含两个部分，日期（Date）和时间（Time）。格式化的时间字符串主要也是针对日期和时间的。[以下代码中开启了ARC，所以没有release。]&lt;/p&gt;
&lt;h3 id="基础用法"&gt;&lt;a class="link" href="#1" &gt;基础用法&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate&lt;span style="color:#f92672"&gt;*&lt;/span&gt; now &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter&lt;span style="color:#f92672"&gt;*&lt;/span&gt; fmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.dateStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kCFDateFormatterShortStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.timeStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kCFDateFormatterShortStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.locale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSLocale alloc] initWithLocaleIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;en_US&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; dateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fmt stringFromDate:now];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, dateString);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打印输出：10/29/12, 2:27 PM&lt;br&gt;
这使用的系统提供的格式化字符串，通过 fmt.dateStyle 和 fmt.timeStyle 进行的设置。实例中使用的参数是 kCFDateFormatterShortStyle，此外还有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CF_ENUM&lt;/span&gt;(CFIndex, CFDateFormatterStyle) { &lt;span style="color:#75715e"&gt;// date and time format styles
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterNoStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 无输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterShortStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 10/29/12, 2:27 PM
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterMediumStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Oct 29, 2012, 2:36:59 PM
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterLongStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// October 29, 2012, 2:38:46 PM GMT+08:00
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterFullStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Monday, October 29, 2012, 2:39:56 PM China Standard Time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="自定义区域语言"&gt;&lt;a class="link" href="#2" &gt;自定义区域语言&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如上实例中，我们使用的是区域语言是 en_US，指的是美国英语。如果我们换成简体中文，则代码是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.locale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSLocale alloc] initWithLocaleIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_CN&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;则对应的输出为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CF_ENUM&lt;/span&gt;(CFIndex, CFDateFormatterStyle) { &lt;span style="color:#75715e"&gt;// date and time format styles
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterNoStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 无输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterShortStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 12-10-29 下午2:52
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterMediumStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 2012-10-29 下午2:51:43
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterLongStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 2012年10月29日 GMT+0800下午2时51分08秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kCFDateFormatterFullStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 2012年10月29日星期一 中国标准时间下午2时46分49秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;世界通用的区域语言代码，详见 International Components for Unicode (ICU), &lt;a class="link" href="http://userguide.icu-project.org/formatparse/datetime" target="_blank" rel="noopener"
 &gt;http://userguide.icu-project.org/formatparse/datetime&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="自定义日期时间格式"&gt;&lt;a class="link" href="#3" &gt;自定义日期时间格式&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;NSDateFormatter提供了自定义日期时间的方法，主要是通过设置属性 dateFormat，常见的设置如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate&lt;span style="color:#f92672"&gt;*&lt;/span&gt; now &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter&lt;span style="color:#f92672"&gt;*&lt;/span&gt; fmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.locale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSLocale alloc] initWithLocaleIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_CN&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd&amp;#39;T&amp;#39;HH:mm:ss&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; dateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fmt stringFromDate:now];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, dateString);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打印输出：2012-10-29T16:08:40&lt;br&gt;
除了上面列出的，还可以指定很多格式，详见http://userguide.icu-project.org/formatparse/datetime。&lt;br&gt;
结合设置Locale，还可以打印出本地化的字符串信息。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDate&lt;span style="color:#f92672"&gt;*&lt;/span&gt; now &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSDate date];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSDateFormatter&lt;span style="color:#f92672"&gt;*&lt;/span&gt; fmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDateFormatter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.locale &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSLocale alloc] initWithLocaleIdentifier:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_CN&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt.dateFormat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;yyyy-MM-dd a HH:mm:ss EEEE&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString&lt;span style="color:#f92672"&gt;*&lt;/span&gt; dateString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [fmt stringFromDate:now];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%@&amp;#34;&lt;/span&gt;, dateString);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="自定义月份星期等字符"&gt;&lt;a class="link" href="#4" &gt;自定义月份星期等字符&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;NSDateFormatter中同样提供了相应的方式，去修改这些字符。一般情况下，使用相应区域语言下面的默认字符就OK了。但是你的确有这个需求，那么也是可以办到的。相应的方法非常多，如下：&lt;br&gt;
Managing AM and PM Symbols&lt;br&gt;
– AMSymbol&lt;br&gt;
– setAMSymbol:&lt;br&gt;
– PMSymbol&lt;br&gt;
– setPMSymbol:&lt;/p&gt;
&lt;p&gt;Managing Weekday Symbols&lt;br&gt;
– weekdaySymbols&lt;br&gt;
– setWeekdaySymbols:&lt;br&gt;
– shortWeekdaySymbols&lt;br&gt;
– setShortWeekdaySymbols:&lt;br&gt;
– veryShortWeekdaySymbols&lt;br&gt;
– setVeryShortWeekdaySymbols:&lt;br&gt;
– standaloneWeekdaySymbols&lt;br&gt;
– setStandaloneWeekdaySymbols:&lt;br&gt;
– shortStandaloneWeekdaySymbols&lt;br&gt;
– setShortStandaloneWeekdaySymbols:&lt;br&gt;
– veryShortStandaloneWeekdaySymbols&lt;br&gt;
– setVeryShortStandaloneWeekdaySymbols:&lt;/p&gt;
&lt;p&gt;Managing Month Symbols&lt;br&gt;
– monthSymbols&lt;br&gt;
– setMonthSymbols:&lt;br&gt;
– shortMonthSymbols&lt;br&gt;
– setShortMonthSymbols:&lt;br&gt;
– veryShortMonthSymbols&lt;br&gt;
– setVeryShortMonthSymbols:&lt;br&gt;
– standaloneMonthSymbols&lt;br&gt;
– setStandaloneMonthSymbols:&lt;br&gt;
– shortStandaloneMonthSymbols&lt;br&gt;
– setShortStandaloneMonthSymbols:&lt;br&gt;
– veryShortStandaloneMonthSymbols&lt;br&gt;
– setVeryShortStandaloneMonthSymbols:&lt;/p&gt;
&lt;p&gt;Managing Quarter Symbols&lt;br&gt;
– quarterSymbols&lt;br&gt;
– setQuarterSymbols:&lt;br&gt;
– shortQuarterSymbols&lt;br&gt;
– setShortQuarterSymbols:&lt;br&gt;
– standaloneQuarterSymbols&lt;br&gt;
– setStandaloneQuarterSymbols:&lt;br&gt;
– shortStandaloneQuarterSymbols&lt;br&gt;
– setShortStandaloneQuarterSymbols:&lt;/p&gt;
&lt;p&gt;Managing Era Symbols&lt;br&gt;
– eraSymbols&lt;br&gt;
– setEraSymbols:&lt;br&gt;
– longEraSymbols&lt;br&gt;
– setLongEraSymbols:&lt;/p&gt;</description></item><item><title>iOS设置程序图标</title><link>https://zhangdapeng.dev/p/ios-she-zhi-cheng-xu-tu-biao/</link><pubDate>Wed, 11 Jun 2025 11:09:43 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-she-zhi-cheng-xu-tu-biao/</guid><description>&lt;p&gt;iOS中心有图标的相关说明,地址为：https://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/ MobileHIG/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW16&lt;/p&gt;
&lt;p&gt;这里解释一下，方便自己查看：&lt;/p&gt;
&lt;h3 id="ios图标尺寸一览"&gt;&lt;a class="link" href="#1" &gt;iOS图标尺寸一览&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;iPhone专用程序:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;图标名称&lt;/th&gt;
					&lt;th&gt;大小&lt;/th&gt;
					&lt;th&gt;圆角&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;必需&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon.png&lt;/td&gt;
					&lt;td&gt;57 X 57&lt;/td&gt;
					&lt;td&gt;10px&lt;/td&gt;
					&lt;td&gt;用于程序商店和在iPhone/iPod Touch中显示&lt;/td&gt;
					&lt;td&gt;必需&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon@2x.png&lt;/td&gt;
					&lt;td&gt;114 X 114&lt;/td&gt;
					&lt;td&gt;20px&lt;/td&gt;
					&lt;td&gt;Icon.png的高清模式&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-Small.png&lt;/td&gt;
					&lt;td&gt;29 X 29&lt;/td&gt;
					&lt;td&gt;20px&lt;/td&gt;
					&lt;td&gt;用于设置和Spotlight搜索&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-Small@2x.png&lt;/td&gt;
					&lt;td&gt;58 X 58&lt;/td&gt;
					&lt;td&gt;8px&lt;/td&gt;
					&lt;td&gt;Icon-Small.png的高清模式&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ipad专用程序:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;图标名称&lt;/th&gt;
					&lt;th&gt;大小&lt;/th&gt;
					&lt;th&gt;圆角&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;必需&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-72.png&lt;/td&gt;
					&lt;td&gt;72 X 72&lt;/td&gt;
					&lt;td&gt;20px&lt;/td&gt;
					&lt;td&gt;用于在iPad桌面中显示&lt;/td&gt;
					&lt;td&gt;必需&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-50.png&lt;/td&gt;
					&lt;td&gt;50 X 50&lt;/td&gt;
					&lt;td&gt;?&lt;/td&gt;
					&lt;td&gt;用于iPad中的Spotlight搜索&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-29.png&lt;/td&gt;
					&lt;td&gt;29 X 29&lt;/td&gt;
					&lt;td&gt;10px&lt;/td&gt;
					&lt;td&gt;设置页面&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;通用程序:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;图标名称&lt;/th&gt;
					&lt;th&gt;大小&lt;/th&gt;
					&lt;th&gt;圆角&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
					&lt;th&gt;必需&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-72.png&lt;/td&gt;
					&lt;td&gt;72 X 72&lt;/td&gt;
					&lt;td&gt;20px&lt;/td&gt;
					&lt;td&gt;用于在iPad桌面中显示&lt;/td&gt;
					&lt;td&gt;必需&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon.png&lt;/td&gt;
					&lt;td&gt;57 X 57&lt;/td&gt;
					&lt;td&gt;10px&lt;/td&gt;
					&lt;td&gt;用于程序商店和在iPhone/iPod Touch中显示&lt;/td&gt;
					&lt;td&gt;必需&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-50.png&lt;/td&gt;
					&lt;td&gt;50 X 50&lt;/td&gt;
					&lt;td&gt;10px&lt;/td&gt;
					&lt;td&gt;用于iPad中的Spotlight搜索&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Icon-29.png&lt;/td&gt;
					&lt;td&gt;29 X 29&lt;/td&gt;
					&lt;td&gt;20px&lt;/td&gt;
					&lt;td&gt;用于设置和Spotlight搜索&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="取消图标上的高光"&gt;&lt;a class="link" href="#2" &gt;取消图标上的高光&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;系统会默认会在图标上自动加上半透明的高光半圆，如果我们不想要这个效果或者图标本身已经包含了这个高光效果，我们可以在项目配置里把系统的高光功能取消掉：&lt;br&gt;
&lt;strong&gt;xcode3.2x建的项目：&lt;/strong&gt;&lt;br&gt;
在info plist里加一个配置项，key为“Icon already includes gloss and bevel effects”， 类型为bool，然后打上钩就，这样系统就不会自动加高光；&lt;br&gt;
&lt;strong&gt;xcode4建的项目：&lt;/strong&gt;&lt;br&gt;
在项目target的summary标签页下找到App Icons项，在“Prerendered”打上钩&lt;br&gt;
再找到“Icon files (iOS 5)”项目（如果有的话），展开，把里面的“Icon already includes gloss effects”也设置成“YES”：这样程序中的高光效果就取消了。&lt;/p&gt;
&lt;h3 id="itunes-connect上的图标"&gt;&lt;a class="link" href="#3" &gt;itunes connect上的图标&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;我们在itunes connect网站上创建应用时也要求上传图标，上传后 itunes connect也会给图标加上高光效果。这不用担心，如果我们的程序已经取消了高光效果，在程序上传后，网站上图标的高光效果也会自动取消掉的。&lt;/p&gt;</description></item><item><title>iOS设置真机上的应用程序名称</title><link>https://zhangdapeng.dev/p/ios-she-zhi-zhen-ji-shang-de-ying-yong-cheng-xu-ming-cheng/</link><pubDate>Wed, 11 Jun 2025 11:09:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-she-zhi-zhen-ji-shang-de-ying-yong-cheng-xu-ming-cheng/</guid><description>&lt;p&gt;iOS设置真机上的应用程序名称：&lt;/p&gt;
&lt;p&gt;步骤如下:&lt;/p&gt;
&lt;p&gt;在工程文件下面的XXXX-Info.plist，修改 Bundle display name即可&lt;/p&gt;
&lt;p&gt;哈哈，好简单&lt;/p&gt;</description></item><item><title>iOS iPad iPhone程序增加启动画面</title><link>https://zhangdapeng.dev/p/ios-ipad-iphone-cheng-xu-zeng-jia-qi-dong-hua-mian/</link><pubDate>Wed, 11 Jun 2025 11:07:03 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-ipad-iphone-cheng-xu-zeng-jia-qi-dong-hua-mian/</guid><description>&lt;p&gt;为iPad和iPhone程序增加启动画面非常简单，基本思路就是增加启动图片资源Default.png即可，只是要根据不同的分辨率和旋转方向需要有不同的图片尺寸。&lt;/p&gt;
&lt;p&gt;目前的iOS设备有三种不同的分辨率：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPad 768x1024&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;iPhone4 640x960&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;iPhone 320x480&lt;/strong&gt;&lt;br&gt;
如果一个程序，既要支持iPad又要支持iPhone，那么它需要包含下面几个图片：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Default-Portrait.png iPad专用竖向启动画面 768x1024或者768x1004&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Default-Landscape.png iPad专用横向启动画面 1024x768或者1024x748&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Default-PortraitUpsideDown.png iPad专用竖向启动画面(Home按钮在屏幕上面)，可省略 768x1024或者768x1004&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Default-LandscapeLeft.png iPad专用横向启动画面(可省略), 1024x768或者1024x748&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Default-LandscapeRight.png iPad专用横向启动画面(可省略), 1024x768或者1024x748&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Default.png iPhone默认启动图片，如果没有提供上面几个iPad专用启动图片，则在iPad上运行时也使用Default.png（不推荐） 320x480或者320x460&lt;/strong&gt;
&lt;strong&gt;Default@2x.png iPhone4启动图片640x960或者640x920&lt;/strong&gt;&lt;br&gt;
为了在iPad上使用上述的启动画面，你还需要在&lt;code&gt;xxxx_info.plist&lt;/code&gt;中加入key(根据下拉菜单中的可选项选择):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UISupportedInterfaceOrientations&lt;/strong&gt; 或 &lt;strong&gt;Supported interface orientations&lt;/strong&gt;&lt;br&gt;
同时，为其加入值(根据下拉菜单中的可选项选择):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIInterfaceOrientationPortrait 或 Portrait (bottom home button)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;UIInterfacOrientationPortraitUpsideDown 或 Portrait (top home button)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;UIInterfaceOrientationLandscapeLeft 或 Landscape (left home button)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;UIInterfaceOrientationLandscapeRight 或 Landscape (right home button)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>iOS 状态栏的尺寸</title><link>https://zhangdapeng.dev/p/ios-zhuang-tai-lan-de-chi-cun/</link><pubDate>Wed, 11 Jun 2025 11:06:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhuang-tai-lan-de-chi-cun/</guid><description>&lt;p&gt;状态栏尺寸的获取方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect statusFrame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;statusFrame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIApplication sharedApplication] statusBarFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat statusHeight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; statusFrame.size.height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat statusWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; statusFrame.size.width;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UILabel(label控件)的详细使用及特殊效果</title><link>https://zhangdapeng.dev/p/ios-uilabellabel-kong-jian-de-xiang-xi-shi-yong-ji-te-shu-xiao-guo/</link><pubDate>Wed, 11 Jun 2025 10:52:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uilabellabel-kong-jian-de-xiang-xi-shi-yong-ji-te-shu-xiao-guo/</guid><description>&lt;p&gt;详细使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UILabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UILabelalloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)]; &lt;span style="color:#75715e"&gt;//声明UIlbel并指定其位置和长宽
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorclearColor]; &lt;span style="color:#75715e"&gt;//设置label的背景色，这里设置为透明色。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFont fontWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;Helvetica-Bold&amp;#34;&lt;/span&gt; size:&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//设置label的字体和字体大小。 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.transform &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGAffineTransformMakeRotation(&lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//设置label的旋转角度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; @&lt;span style="color:#960050;background-color:#1e0010"&gt;“&lt;/span&gt;helloworld&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//设置label所显示的文本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorwhiteColor]; &lt;span style="color:#75715e"&gt;//设置文本的颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.shadowColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorcolorWithWhite:&lt;span style="color:#ae81ff"&gt;0.1f&lt;/span&gt;alpha:&lt;span style="color:#ae81ff"&gt;0.8f&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//设置文本的阴影色彩和透明度。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.shadowOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;2.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2.0f&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//设置阴影的倾斜角度。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAlignmentCenter; &lt;span style="color:#75715e"&gt;//设置文本在label中显示的位置，这里为居中。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//换行技巧：如下换行可实现多行显示，但要求label有足够的宽度。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.lineBreakMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UILineBreakModeWordWrap; &lt;span style="color:#75715e"&gt;//指定换行模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.numberOfLines &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 指定label的行数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//lable的旋转
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.transform &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGAffineTransformMakeRotation(&lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//设置label的旋转角度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:label]; &lt;span style="color:#75715e"&gt;//将label载入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;label的美化和特效：&lt;/p&gt;
&lt;p&gt;这里使用FXLabel来实现特殊效果，如上图的“每日”二字就是用FXLabel来实现的，但要加入FXLbal.h和FXLabel.m两个文件，具体代码如下。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FXLabel &lt;span style="color:#f92672"&gt;*&lt;/span&gt;label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[FXLabelalloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorclearColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.font &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIFontfontWithName:&lt;span style="color:#e6db74"&gt;@&amp;#34;Helvetica-Bold&amp;#34;&lt;/span&gt;size:&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [secondTitle objectAtIndex:i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorgrayColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.shadowColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorcolorWithWhite:&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;alpha:&lt;span style="color:#ae81ff"&gt;0.8f&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.shadowOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.shadowBlur &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.innerShadowColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColorcolorWithWhite:&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;alpha:&lt;span style="color:#ae81ff"&gt;0.8f&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.innerShadowOffset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGSizeMake(&lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2.0f&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;label.textAlignment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAlignmentLeft;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[view addSubview:label];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其用法和UILabel相差不大，很好理解，代码大家可以直接调用，具体属性自己修改。&lt;/p&gt;
&lt;p&gt;FXLabel下面地址：https://github.com/nicklockwood/FXLabel&lt;/p&gt;
&lt;p&gt;来源：http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014339972/&lt;/p&gt;</description></item><item><title>iOS window（窗口）、视图（view）的学习</title><link>https://zhangdapeng.dev/p/ios-window-chuang-kou-shi-tu-view-de-xue-xi/</link><pubDate>Wed, 11 Jun 2025 10:47:28 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-window-chuang-kou-shi-tu-view-de-xue-xi/</guid><description>&lt;p&gt;要在屏幕上显示内容首先要创建一个窗口承载内容，要创建一个窗口，需要一个边框（frame），含有边框信息的底层 结构就CGRect。每个能够在屏幕上显示自己的对象都有一个边框，定义了他的显示区域，不过许多高层的视图类会自动计算这一信息。其他的那些类则在视图初始化时通过一个initWithFrame的初始化方法来设置。&lt;/p&gt;
&lt;p&gt;再来认识一个类：UIScreen。UIScreen类代表了屏幕，通过这个类我们可以获取一些想要的东东。可使用下面的代码测试一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGrect screenBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ [UIScreen mainScreen]bounds];&lt;span style="color:#75715e"&gt;//返回的是带有状态栏的Rect 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect viewBounds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ [UIScreen mainScreen]applicationFrame];&lt;span style="color:#75715e"&gt;//不包含状态栏的Rect 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//screenBounds 与 viewBounds 均是相对于设备屏幕来说的 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//所以 screenBounds.origin.x== 0.0 ; screenBounds.oringin.y = 0.0; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenBounds.size.width &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenBounds.size.height &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;480&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;或者其他分辨率有所差异&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//所以 screenBounds.origin.x== 0.0 ; screenBounds.oringin.y = 20.0;(因为状态栏的高度是20像素) 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenBounds.size.width &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screenBounds.size.height &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;480&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;UIView&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面来认识一下UIView类，这个类继承自UIResponder,看这个名字我们就知道它是负责显示的画布，如果说把window比作画框的话。我们 就是不断地在画框上移除、更换或者叠加画布，或者在画布上叠加其他画布，大小当然 由绘画者来决定了。有了画布，我们就可以在上面任意施为了。这个类在UIView.h里面。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;UIView* myView =[[ UIView alloc]initWithFrame:CGRectMake(0.0,0.0,200.0,400.0)];//这里创建了一块画布，定义了相对于父窗口的位置， 以及大小。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UIWindow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UIWindow继承自UIView，关于这一点可能有点逻辑障碍，画框怎么继承自画布呢？不要过于去专牛角尖，画框的形状不就是跟画布一样吗？拿一块画布然后用一些方法把它加强，是不是可以当一个画框用呢？这也是为什么 一个view可以直接加到另一个view上去的原因了。&lt;br&gt;
看一下系统的初始化过程（在application didFinishLauchingWithOptions里面）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor grayColor];&lt;span style="color:#75715e"&gt;//给window设置一个背景色 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.window makeKeyAndVisible];&lt;span style="color:#75715e"&gt;//让window显示出来
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实战演练一下：&lt;/p&gt;
&lt;p&gt;1)新建一个工程选择Empty Application 名字为practice&lt;/p&gt;
&lt;p&gt;2)在application didFinishLaunchingWithOptions里面，你会发现系统已经建好一个画框了，我们现在就用系统帮我们建好的画框，你当然也可以自己建一个画框，不过没这个必要了，忘了讲了，一个应用程序只能有一个画框。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;application:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application &lt;span style="color:#a6e22e"&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Override point for customization after application launch.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect bound &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;boundwith:%f boundheight:%f&amp;#34;&lt;/span&gt;,bound.size.width,bound.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;boundx:%f boundy:%f&amp;#34;&lt;/span&gt;,bound.origin.x,bound.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect appBound &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]applicationFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;appBoundwith:%f boundheight:%f&amp;#34;&lt;/span&gt;,appBound.size.width,appBound.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;appBoundx:%f boundy:%f&amp;#34;&lt;/span&gt;,appBound.origin.x,appBound.origin.y); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//画第一块画布然涂成蓝色，大小是320 X 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect CGone &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;);&lt;span style="color:#75715e"&gt;//画个矩形，初始化位置与大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;v_one &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGone];&lt;span style="color:#75715e"&gt;//初始化view
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_one.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blueColor];&lt;span style="color:#75715e"&gt;// 涂成蓝色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window addSubview:v_one];&lt;span style="color:#75715e"&gt;//直接加到画框上
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第二块注意它的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect CGtwo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;);&lt;span style="color:#75715e"&gt;//画个矩形、初始化位置与大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;v_two &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGtwo];&lt;span style="color:#75715e"&gt;//初始化view
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_two.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor redColor];&lt;span style="color:#75715e"&gt;//涂成红色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window addSubview:v_two];&lt;span style="color:#75715e"&gt;//叠加到画框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第三块注意他的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect CGthree &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;);&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;v_three &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGthree];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_three.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor greenColor];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window addSubview:v_three];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第四块注意它的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect CGfour &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;260&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;);&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;v_four &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGfour];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_four.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor orangeColor];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window addSubview:v_four];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//第五块，计算一下它的位置，看看它的效果，
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//你可以让试一下把这段代码移到第一快初始化的上面试试，会有意想不到的效果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect CGfive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;v_five &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView alloc]initWithFrame:CGfive];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_five.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor yellowColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window addSubview:v_five];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor grayColor];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//最后记得release 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_one &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_two &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_three &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_four &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v_five &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//self.window.backgroundColor = [UIColor whiteColor];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//return YES;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;取得画面工作区域的大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;iOS 可以在很多 Apple 的装置上执行，然而每个装置所提供的工作区域大小 Application Frame 也不尽香同，下面提供一个简单的方法，帮助你可以快速找出目前工作区域的画面的大小，程式码如下。&lt;/p&gt;
&lt;p&gt;1,首先是状态列 Status Bar 的部份。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取得StatusBar的位置和大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:theToolbar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect statusBarRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIApplication sharedApplication]statusBarFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(@&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;%@&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, NSStringFromCGRect(statusBarRect));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2,再来是可工作区域的大小，如果你的应用程式包含状态列，那么可工作区域的大小就会是整个画面的减去状态列所剩下的区域。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取得工作区域的位置和大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect workSpaceRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]applicationFrame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(@&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;%@&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, NSStringFromCGRect(workSpaceRect));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3,最后就是整个画面的大小&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取得整个画面的位置和大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect windowRect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog(@&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;%@&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, NSStringFromCGRect(windowRect));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述程式码皆是将取得的大小范围资讯储存在 CGRect 型态的变数中，再将此变数以字串的方式显示出来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一些 UIView 中管理 Subview 常用的方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个 UIView 里面可以包含许多的 Subview（其他的 UIView），而这些 Subview 彼此之间是有所谓的阶层关系，这有点类似绘图软体中图层的概念，下面程式码示演示了几个在管理图层（Subview）上常用的方法，其程式码如下。&lt;br&gt;
首先是大家最常使用的新增和移除 Subview。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将Subview从当前的UIView中移除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Subview removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//替UIView增加一个Subview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIView addSubview:Subview];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 UIView 中将 Subview 往前或是往后移动一个图层，往前移动会覆盖住较后层的 Subview，而往后移动则会被较上层的 Subview 所覆盖。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将Subview往前移动一个图层（与它的前一个图层对调位置）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIView bringSubviewToFront:Subview];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将Subview往后移动一个图层（与它的后一个图层对调位置）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIView sendSubviewToBack:Subview];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 UIView 中使用索引 Index 交换两的 Subview 彼此的图层层级。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//交换两个图层
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 Subview 的变数名称取得它在 UIView 中的索引值（Index ）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取得Index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSInteger index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIView subviews] indexOfObject:Subview名称];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;替 Subview 加上 NSInteger 的註记 （Tag），好让之后它们分辨彼此&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//加上註记
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Subview setTag:NSInteger];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后是取得 UIView 中所有的 Subview，呼叫此方法会传回一个 NSArray，并以由后往前的顺序列出这些 Subview，下图中是列出范例图片里 Root 中所有的 Subview。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//取的UIView下的所有Subview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[UIView subviews]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS CGRectMake方法</title><link>https://zhangdapeng.dev/p/ios-cgrectmake-fang-fa/</link><pubDate>Wed, 11 Jun 2025 10:47:23 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cgrectmake-fang-fa/</guid><description>&lt;p&gt;代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CG_INLINE CGRect 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt;(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect rect; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect.origin.x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x; rect.origin.y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; y; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect.size.width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; width; rect.size.height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; height; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; rect; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个方法就是make一个rect，定好origin（起点，左上角），宽与高，就可以画出一个位置与大小确定的rect（矩形）这个函数被声明为内联函 数，一是因为它比较小，二是因为在画界面时我们要求一定的效率。这个函数还是藏在刚刚那个头文件里面：CGGeometry.h&lt;/p&gt;</description></item><item><title>iOS 监测网络链接状态</title><link>https://zhangdapeng.dev/p/ios-jian-ce-wang-luo-lian-jie-zhuang-tai/</link><pubDate>Wed, 11 Jun 2025 10:44:13 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-jian-ce-wang-luo-lian-jie-zhuang-tai/</guid><description>&lt;p&gt;使用之前请从Apple网站下载示例：&lt;a class="link" href="https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip" target="_blank" rel="noopener"
 &gt;点此下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后将Reachability.h 和 Reachability.m 加到自己的项目中，并引用 SystemConfiguration.framework，就可以使用了。&lt;/p&gt;
&lt;p&gt;Reachability 中定义了3种网络状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// the network state of the device for Reachability 1.5.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NotReachable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;//无连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ReachableViaCarrierDataNetwork, &lt;span style="color:#75715e"&gt;//使用3G/GPRS网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ReachableViaWiFiNetwork &lt;span style="color:#75715e"&gt;//使用WiFi网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} NetworkStatus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// the network state of the device for Reachability 2.0.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NotReachable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;//无连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ReachableViaWiFi, &lt;span style="color:#75715e"&gt;//使用3G/GPRS网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ReachableViaWWAN &lt;span style="color:#75715e"&gt;//使用WiFi网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} NetworkStatus;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;比如检测某一特定站点的接续状况，可以使用下面的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reachability &lt;span style="color:#f92672"&gt;*&lt;/span&gt;r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [Reachability reachabilityWithHostName:@&lt;span style="color:#960050;background-color:#1e0010"&gt;“&lt;/span&gt;www.apple.com&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; ([r currentReachabilityStatus]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; NotReachable:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 没有网络连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; ReachableViaWWAN:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 使用3G网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; ReachableViaWiFi:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 使用WiFi网络
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检测当前网络环境：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 是否wifi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;IsEnableWIFI&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; NotReachable);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 是否3G
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;IsEnable3G&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; NotReachable);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连接状态实时通知&lt;/p&gt;
&lt;p&gt;网络连接状态的实时检查，通知在网络应用中也是十分必要的。接续状态发生变化时，需要及时地通知用户。由于Reachability1.5版与2.0版有一些变化，这里分开来说明使用方法。&lt;/p&gt;
&lt;p&gt;Reachability 1.5&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;Reachability.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyAppDelegate&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIApplicationDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NetworkStatus remoteHostStatus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; NetworkStatus remoteHostStatus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;MyAppDelegate.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyAppDelegate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; remoteHostStatus;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 更新网络状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;updateStatus&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.remoteHostStatus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[Reachability sharedReachability] remoteHostStatus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 通知网络状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;reachabilityChanged:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)note {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self updateStatus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self.remoteHostStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NotReachable) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alert &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:NSLocalizedString(&lt;span style="color:#e6db74"&gt;@&amp;#34;AppName&amp;#34;&lt;/span&gt;, nil) message:NSLocalizedString(&lt;span style="color:#e6db74"&gt;@&amp;#34;NotReachable&amp;#34;&lt;/span&gt;, nil)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:nil cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK&amp;#34;&lt;/span&gt; otherButtonTitles: nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 程序启动器，启动网络监视
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;applicationDidFinishLaunching:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 设置网络检测的站点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[Reachability sharedReachability] setHostName:&lt;span style="color:#e6db74"&gt;@&amp;#34;www.apple.com&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 设置网络状态变化时的通知函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(reachabilityChanged:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name:&lt;span style="color:#e6db74"&gt;@&amp;#34;kNetworkReachabilityChangedNotification&amp;#34;&lt;/span&gt; object:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self updateStatus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;dealloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 删除通知对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] removeObserver:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [window &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super dealloc];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reachability 2.0&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Reachability&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyAppDelegate&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UIApplicationDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Reachability &lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostReach;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;reachabilityChanged:&lt;/span&gt;(NSNotification &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)note {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Reachability&lt;span style="color:#f92672"&gt;*&lt;/span&gt; curReach &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [note object];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSParameterAssert([curReach isKindOfClass: [Reachability &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NetworkStatus status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [curReach currentReachabilityStatus];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (status &lt;span style="color:#f92672"&gt;==&lt;/span&gt; NotReachable) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alert &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;AppName&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message:&lt;span style="color:#e6db74"&gt;@&amp;#34;NotReachable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:nil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;YES&amp;#34;&lt;/span&gt; otherButtonTitles:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alert &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;applicationDidFinishLaunching:&lt;/span&gt;(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 监测网络情况
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [[NSNotificationCenter defaultCenter] addObserver:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(reachabilityChanged:)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: kReachabilityChangedNotification
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object: nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostReach &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[Reachability reachabilityWithHostName:&lt;span style="color:#e6db74"&gt;@&amp;#34;www.google.com&amp;#34;&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [hostReach startNotifer];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;来源：http://www.cnblogs.com/mrhgw/archive/2012/08/01/2617760.html&lt;/p&gt;</description></item><item><title>iOS 图表 CorePlot 折线图实例 填充图实例</title><link>https://zhangdapeng.dev/p/ios-tu-biao-coreplot-zhe-xian-tu-shi-li-tian-chong-tu-shi-li/</link><pubDate>Wed, 11 Jun 2025 10:44:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-tu-biao-coreplot-zhe-xian-tu-shi-li-tian-chong-tu-shi-li/</guid><description>&lt;p&gt;最近在搞数据展示，需要将数据用图表展示出来，结果还是没有达到自己理想的效果，先将自己的不完美版本，记录一下，直接贴出代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CorePlot-CocoaTouch.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;CPTPlotDataSource, CPTAxisDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYGraph &lt;span style="color:#f92672"&gt;*&lt;/span&gt;graph; &lt;span style="color:#75715e"&gt;//画板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTScatterPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataSourceLinePlot;&lt;span style="color:#75715e"&gt;//线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataForPlot1; &lt;span style="color:#75715e"&gt;//坐标数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timer1; &lt;span style="color:#75715e"&gt;//定时器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; r;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxX;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxY;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minX;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minY;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataForPlot1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;key;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) CPTXYGraph &lt;span style="color:#f92672"&gt;*&lt;/span&gt;graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;points;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//折线图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;lineChart&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//填充图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fillFigure&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;detailViewController.h（里面有两个函数，是分别调用折线图和填充图的）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;DetailsViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; key;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; dataForPlot1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; points;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; yArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; xArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithNibName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil &lt;span style="color:#a6e22e"&gt;bundle:&lt;/span&gt;(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//构造数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.points &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSUInteger i;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.xArr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.yArr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithFloat: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;i&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithFloat: &lt;span style="color:#ae81ff"&gt;1.2&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; rand()&lt;span style="color:#f92672"&gt;/&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt;)RAND_MAX&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.xArr addObject:x];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.yArr addObject:y];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.points addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x,&lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;,y,&lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithFloat:[x intValue]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;tmpY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithFloat:[y intValue]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MAX([tmpX intValue], maxX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MIN([tmpX intValue], minX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MAX([tmpY intValue], maxY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MIN([tmpY intValue], minY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;maxX = %d&amp;#34;&lt;/span&gt;,maxX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;minX = %d&amp;#34;&lt;/span&gt;,minX);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;maxY = %d&amp;#34;&lt;/span&gt;,maxY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;minY = %d&amp;#34;&lt;/span&gt;,minY);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;xArr = %@&amp;#34;,self.xArr);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSLog(@&amp;#34;yArr = %@&amp;#34;,self.yArr);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self lineChart];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//GridLine
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;gridLine&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//折线图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;lineChart&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTXYGraph alloc] initWithFrame:CGRectZero];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTTheme &lt;span style="color:#f92672"&gt;*&lt;/span&gt;theme &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTTheme themeNamed:kCPTDarkGradientTheme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph applyTheme:theme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGraphHostingView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostingView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置图表的边框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的的padding设置0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//坐标区域的边框设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为45.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的padding设置为40.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为5.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为80.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostingView.hostedGraph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//定义绘图空间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;plotSpace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) graph.defaultPlotSpace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.allowsUserInteraction &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置x，y坐标范围
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.xRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(minX) length:CPTDecimalFromFloat(maxX)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.yRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(minY) length:CPTDecimalFromFloat(maxY&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//散点图的绘制
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTScatterPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;boundLinePlot &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTScatterPlot alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTMutableLineStyle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTMutableLineStyle lineStyle];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.miterLimit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; boundLinePlot.dataLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lineStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; boundLinePlot.identifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;lineChart&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; boundLinePlot.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph addPlot:boundLinePlot];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置坐标轴
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;axisSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) graph.axisSet;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.xAxis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x.majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString(&lt;span style="color:#e6db74"&gt;@&amp;#34;10&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x.orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString(&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x.minorTicksPerInterval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSArray *xexclusionRanges = [NSArray arrayWithObjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(2.99) length:CPTDecimalFromFloat(0.02)], nil];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// x.labelExclusionRanges = xexclusionRanges;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.yAxis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y.majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString(&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y.orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString(&lt;span style="color:#e6db74"&gt;@&amp;#34;1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y.minorTicksPerInterval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:hostingView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//填充图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;fillFigure&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建图表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTXYGraph alloc] initWithFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//给图表添加一个主题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTTheme &lt;span style="color:#f92672"&gt;*&lt;/span&gt;theme &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTTheme themeNamed:kCPTDarkGradientTheme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph applyTheme:theme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建画板，将图表添加到画板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGraphHostingView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostingView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostingView.hostedGraph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.view addSubview:hostingView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置图表的边框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的的padding设置0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//坐标区域的边框设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为45.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的padding设置为40.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为5.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为80.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置坐标范围
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;plotSpace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)graph.defaultPlotSpace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.allowsUserInteraction &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// plotSpace.xRange = [CPTPlotRange ];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.xRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;) length:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.yRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;) length:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置坐标刻度大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;axisSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) graph.axisSet ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.xAxis ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//x 轴：不显示小刻度线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. minorTickLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 大刻度线间距： 50 单位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString (&lt;span style="color:#e6db74"&gt;@&amp;#34;50&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 坐标原点： 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.yAxis ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//y 轴：不显示小刻度线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. minorTickLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 大刻度线间距： 50 单位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;50&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 坐标原点： 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString (&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建绿色区域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTScatterPlot alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.identifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置绿色区域边框的样式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTMutableLineStyle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dataSourceLinePlot.dataLineStyle mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置线的宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置线的颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加线到绿色区域中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.dataLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lineStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置透明实现添加动画
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.opacity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置数据元代理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绿色区域添加到图表中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph addPlot:dataSourceLinePlot];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建一个颜色渐变：从 建变色 1 渐变到 无色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGradient &lt;span style="color:#f92672"&gt;*&lt;/span&gt;areaGradient &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ CPTGradient gradientWithBeginningColor :[CPTColor greenColor] endingColor :[CPTColor colorWithComponentRed:&lt;span style="color:#ae81ff"&gt;0.65&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;0.65&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;0.16&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 渐变角度： -90 度（顺时针旋转）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; areaGradient.angle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;90.0f&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建一个颜色填充：以颜色渐变进行填充
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTFill &lt;span style="color:#f92672"&gt;*&lt;/span&gt;areaGradientFill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ CPTFill fillWithGradient :areaGradient];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 为图形设置渐变区
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.areaFill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; areaGradientFill;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.areaBaseValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;0.0&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.interpolation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTScatterPlotInterpolationLinear ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataForPlot1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// j = 200;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// r = 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(dataOpt) userInfo:nil repeats:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// [timer1 fire];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self plotData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//添加数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;plotData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([dataSourceLinePlot.identifier isEqual:&lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp1, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp1, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point1 atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp2, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp2, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point2 atIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp3, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp3, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point3 atIndex:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp4, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp4, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point4 atIndex:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp5, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp5, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point5 atIndex:&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp6, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp6, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point6 atIndex:&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;110&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp7, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp7, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point7 atIndex:&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;130&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp8, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp8, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point8 atIndex:&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;135&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp9, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp9, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point9 atIndex:&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//使用CorePlot的委托方法 呈现图形 - lineChart
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;numberOfRecordsForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self.points count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;numberForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot &lt;span style="color:#a6e22e"&gt;field:&lt;/span&gt;(NSUInteger)fieldEnum &lt;span style="color:#a6e22e"&gt;recordIndex:&lt;/span&gt;(NSUInteger)index{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (fieldEnum &lt;span style="color:#f92672"&gt;==&lt;/span&gt; CPTScatterPlotFieldX &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[self.points objectAtIndex:index] valueForKey:key];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//使用CorePlot的委托方法 呈现图形 - fillFigure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return [dataForPlot1 count];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSNumber *num;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// //让视图偏移
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	if ( [(NSString *)plot.identifier isEqualToString:@&amp;#34;Green Plot&amp;#34;] ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @&amp;#34;x&amp;#34; : @&amp;#34;y&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// num = [[dataForPlot1 objectAtIndex:index] valueForKey:key];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// if ( fieldEnum == CPTScatterPlotFieldX ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//			num = [NSNumber numberWithDouble:[num doubleValue] - r];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//		}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// //添加动画效果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@&amp;#34;opacity&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	fadeInAnimation.duration = 1.0f;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	fadeInAnimation.removedOnCompletion = NO;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	fadeInAnimation.fillMode = kCAFillModeForwards;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	fadeInAnimation.toValue = [NSNumber numberWithFloat:2.0];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//	[dataSourceLinePlot addAnimation:fadeInAnimation forKey:@&amp;#34;animateOpacity&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// return num;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;dataOpt&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加随机数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([dataSourceLinePlot.identifier isEqual:&lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,j];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,(rand()&lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point1 atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//刷新画板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; j &lt;span style="color:#f92672"&gt;=&lt;/span&gt; j &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; r &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;shouldAutorotateToInterfaceOrientation:&lt;/span&gt;(UIInterfaceOrientation)interfaceOrientation{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (interfaceOrientation &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; UIInterfaceOrientationPortraitUpsideDown);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS 小提示 respondsToSelector</title><link>https://zhangdapeng.dev/p/ios-xiao-ti-shi-respondstoselector/</link><pubDate>Wed, 11 Jun 2025 10:44:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-xiao-ti-shi-respondstoselector/</guid><description>&lt;p&gt;respondsToSelector的大概方法如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([NSArray respondsToSelector:&lt;span style="color:#66d9ef"&gt;@selector&lt;/span&gt;(arrayWithObjects:)]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就是NSArray是否会执行arrayWithObjects:方法，一般在执行代理函数之前先这样respondsToSelector检测一下。&lt;/p&gt;</description></item><item><title>iOS plist文件的增删操作</title><link>https://zhangdapeng.dev/p/ios-plist-wen-jian-de-zeng-shan-cao-zuo/</link><pubDate>Tue, 10 Jun 2025 15:46:27 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-plist-wen-jian-de-zeng-shan-cao-zuo/</guid><description>&lt;p&gt;我最近在使用plist存数数据，方便后面的数据浏览&lt;/p&gt;
&lt;p&gt;很是苦恼于是自己就查遍各方资料，弄了一个简单的类函数,方便自己的更新数据&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;personIndex&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;NSObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personMulArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//清空原有数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;deletePlist&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//响应错误
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showAlert&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//获取远端数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getRemoteData&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建plist文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;createPlist&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//写入数据到plist文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;writePlist&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//解析json数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readJsonData:&lt;/span&gt;(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//下载数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;executeDown&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;personIndex.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;personIndex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; personArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; personMulArr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;executeDown&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self deletePlist];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self getRemoteData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self createPlist];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self writePlist];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将数据写入plist
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;writePlist&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([fileManager fileExistsAtPath: path]){&lt;span style="color:#75715e"&gt;//如果文件存在，写入数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建字典
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dictplist &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc ] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; item &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.personArr){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置属性值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dictplist setValue:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_name&amp;#34;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;id&amp;#34;&lt;/span&gt;]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//写入文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[dictplist writeToFile:path atomically:YES]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showAlert:&lt;span style="color:#e6db74"&gt;@&amp;#34;同步数据失败&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;] ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建字典
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dictplist &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc ] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt; item &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; self.personArr){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置属性值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dictplist setValue:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_name&amp;#34;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; forKey:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[item valueForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;id&amp;#34;&lt;/span&gt;]]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;///写入文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[dictplist writeToFile:appFile atomically:YES]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showAlert:&lt;span style="color:#e6db74"&gt;@&amp;#34;同步数据失败&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;deletePlist&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fileManager removeItemAtPath:path error:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readPlist&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithContentsOfFile: path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([fileManager fileExistsAtPath: path]){&lt;span style="color:#75715e"&gt;//如果文件存在，写入数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithContentsOfFile: path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// If the file doesn’t exist, create an empty dictionary
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//创建plist文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;createPlist&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:&lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSFileManager &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fileManager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSFileManager defaultManager];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;[fileManager fileExistsAtPath: path]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: &lt;span style="color:#e6db74"&gt;@&amp;#34;test.plist&amp;#34;&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;getRemoteData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://222.73.93.70:3002/person/actorlist?order_by=index&amp;amp;start_date=2012-06-01&amp;amp;end_date=2012-07-01&amp;amp;start=1&amp;amp;offset=10&amp;amp;app_key=KSKdzSyeb99YdLwTMrzvuLumNYCM6pzT4Z3f27R4L3qq6jCs&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestUseProtocolCachePolicy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLResponse alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRequest:request returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.personArr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self readJsonData:receivedData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readJsonData:&lt;/span&gt;(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSJSONSerialization提供了将JSON数据转换为Foundation对象（一般都是NSDictionary和NSArray）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//和Foundation对象转换为JSON数据（可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据）。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self showAlert:&lt;span style="color:#e6db74"&gt;@&amp;#34;更新数据失败&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personInfo objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;list&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; personList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readStringJsonData:&lt;/span&gt;(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSJSONSerialization提供了将JSON数据转换为Foundation对象（一般都是NSDictionary和NSArray）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//和Foundation对象转换为JSON数据（可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据）。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personInfo objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;list&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; personList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;showAlert:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)stringData{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;alrt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;同步数据失败&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message:[NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,stringData]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [alrt show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS中获取程序目录路径</title><link>https://zhangdapeng.dev/p/ios-zhong-huo-qu-cheng-xu-mu-lu-lu-jing/</link><pubDate>Tue, 10 Jun 2025 15:46:19 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zhong-huo-qu-cheng-xu-mu-lu-lu-jing/</guid><description>&lt;h3 id="获取程序documents目录路径"&gt;&lt;a class="link" href="#1" &gt;获取程序Documents目录路径&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取程序app文件所在目录路径"&gt;&lt;a class="link" href="#2" &gt;获取程序app文件所在目录路径&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSHomeDirectory();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取程序tmp目录路径"&gt;&lt;a class="link" href="#3" &gt;获取程序tmp目录路径&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSTemporaryDirectory();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取程序应用包路径"&gt;&lt;a class="link" href="#4" &gt;获取程序应用包路径&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSBundle mainBundle] resourcePath];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSBundle mainBundle] pathForResource: &lt;span style="color:#e6db74"&gt;@&amp;#34;info&amp;#34;&lt;/span&gt; ofType: &lt;span style="color:#e6db74"&gt;@&amp;#34;txt&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;来源：http://www.cnblogs.com/kaixuan/archive/2011/05/31/2064796.html&lt;/p&gt;</description></item><item><title>iOS 字典对象 常用方法总结 NSDictionary 和 NSMutableDictionary</title><link>https://zhangdapeng.dev/p/ios-zi-dian-dui-xiang-chang-yong-fang-fa-zong-jie-nsdictionary-he-nsmutabledictionary/</link><pubDate>Tue, 10 Jun 2025 15:30:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-zi-dian-dui-xiang-chang-yong-fang-fa-zong-jie-nsdictionary-he-nsmutabledictionary/</guid><description>&lt;h3 id="nsdictionary的常用方法有"&gt;&lt;a class="link" href="#1" &gt;NSDictionary的常用方法有&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+(id)dictionaryWithObjectsAndKeys:obj1,key1,obj2,key2,&amp;hellip;&amp;hellip;nil
顺序添加对象和键值来创建一个字典，注意结尾是nil&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(id)initWithObjectsAndKeys::obj1,key1,obj2,key2,&amp;hellip;&amp;hellip;nil
初始化一个新分配的字典，顺序添加对象和值，结尾是nil&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(unsigned int)count
返回字典中的记录数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(NSEnumerator*)keyNSEnumerator
返回字典中的所有键到一个 NSEnumerator 对象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(NSArray*)keysSortedByValueUsingSelector:(SEL)selector
将字典中所有键按照selector 指定的方法进行排序，并将结果返回&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(NSEnumerator*)objectEnumerator
返回字典中所有的值到一个 NSEnumetator 类型对象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(id)objectForKey:key
返回指定key 值的对象&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nsmutabledictionary的常用方法有"&gt;&lt;a class="link" href="#2" &gt;NSMutableDictionary的常用方法有：&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+(id)dictionaryWithCapacity:size
创建一个size大小的可变字典&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(id)initWithCapacity:size
初始化一个size 大小的可变字典&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(void)removeAllObjects
删除字典中所有元素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(void)removeObjectForKey:key
删除字典中key位置的元素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-(void)setObject:obj forKey:key
添加 (key , obj)到字典中去；若key已经存在，则替换值为 obj&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iOS SBJson解析Json文件</title><link>https://zhangdapeng.dev/p/ios-sbjson-jie-xi-json-wen-jian/</link><pubDate>Tue, 10 Jun 2025 15:30:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-sbjson-jie-xi-json-wen-jian/</guid><description>&lt;p&gt;最近在搞到，如何解析json文件，使用ios自带的函数很容易解析出来，但是对于中文的问题，一直困扰着我，于是查看了各种相关资料，最后我的解决方法如下：&lt;/p&gt;
&lt;p&gt;1，让我找到了一个兼容ARC机制的类库，SBJson，现在地址：https://github.com/stig/json-framework/downloads，最近的一个版本支持ARC&lt;/p&gt;
&lt;p&gt;2，将其下载过来后，引入到项目中，#import &amp;ldquo;SBJson.h&amp;rdquo;&lt;/p&gt;
&lt;p&gt;3，使用方法是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;test 开始运行&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;testString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc]initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;{&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;customer&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:[{&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;name&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;roamer&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ycount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;232.4&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;sumcount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;322.3&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;},{&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;name&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;王三&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ycount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;221.2&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;sumcount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1123.2&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;},{&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;name&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;李四&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;ycount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;1221.2&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;sumcount&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;12123.2&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}]}&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SBJsonParser &lt;span style="color:#f92672"&gt;*&lt;/span&gt;parser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[SBJsonParser alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,testString);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;root &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithDictionary:[parser objectWithString:testString error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注意转换代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SBJsonWriter &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonWriter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[SBJsonWriter alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;jsonString &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [jsonWriter stringWithObject:root];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,jsonString);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//注意转换代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt; customers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [root objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;customer&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,customers);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt; member &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; customers){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;,[[member objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;name&amp;#34;&lt;/span&gt;] description]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面只是一个，自己写的json格式的字符串，自己可以使用来自远程获取的数据，做一下测试&lt;/p&gt;</description></item><item><title>iOS Objective-C 判断对象的类型</title><link>https://zhangdapeng.dev/p/ios-objective-c-pan-duan-dui-xiang-de-lei-xing/</link><pubDate>Tue, 10 Jun 2025 15:29:18 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-objective-c-pan-duan-dui-xiang-de-lei-xing/</guid><description>&lt;p&gt;所有继承 NSObject 的的对象可以调用isKindOfClass 方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)isKindOfClass:(&lt;span style="color:#66d9ef"&gt;Class&lt;/span&gt;)aClass
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt; test &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [obj isKindOfClass:[SomeClass &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS NSURLConnection 同步下载获取数据</title><link>https://zhangdapeng.dev/p/ios-nsurlconnection-tong-bu-xia-zai-huo-qu-shu-ju/</link><pubDate>Tue, 10 Jun 2025 15:14:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nsurlconnection-tong-bu-xia-zai-huo-qu-shu-ju/</guid><description>&lt;p&gt;同步下载（交互不好，容易出现卡死现象，一般下载数据较小或有特定需求才使用）。 发送同步请求后，程序将停止用户交互，直到服务器返回数据完成后，才进行下一步的操作。&lt;/p&gt;
&lt;p&gt;步骤：&lt;/p&gt;
&lt;h3 id="创建nsurl"&gt;&lt;a class="link" href="#1" &gt;创建NSURL&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://www.baidu.com/&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="通过url创建nsurlrequest"&gt;&lt;a class="link" href="#2" &gt;通过URL创建NSURLRequest&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;cachePolicy 缓存协议是个枚举类型：&lt;/p&gt;
&lt;p&gt;NSURLRequestUseProtocolCachePolicy 基础策略&lt;/p&gt;
&lt;p&gt;NSURLRequestReloadIgnoringLocalCacheData 忽略本地缓存&lt;/p&gt;
&lt;p&gt;NSURLRequestReturnCacheDataElseLoad 首先使用缓存，如果没有本地缓存，才从原地址下载&lt;/p&gt;
&lt;p&gt;NSURLRequestReturnCacheDataDontLoad 使用本地缓存，从不下载，如果本地没有缓存，则请求失败。此策略多用于离线操作&lt;/p&gt;
&lt;p&gt;NSURLRequestReloadIgnoringLocalAndRemoteCacheData 无视任何的缓存策略，无论是本地还是远程，总是从原地址重新下载&lt;/p&gt;
&lt;p&gt;NSURLRequestReloadRevalidatingCacheData 如果本地缓存是有效的则不下载。其他任何情况都从原地址重新下载&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="#3" &gt;建立网络连接NSURLConnection，同步请求数据&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRwquest:request returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上三步后，就需要将receivedData进行解析，一般是XML/JSON&lt;/p&gt;
&lt;p&gt;实例演示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDelegate,UITableViewDataSource&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//生成content的key值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;keys;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//生成content的value值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//列表内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//艺人的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//艺人的数组数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;person;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;vlinkagePersonViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; personData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; person;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://xxx.xxx.xxx.xxx:xxx/person/actorlist?order_by=index&amp;amp;start_date=2012-06-01&amp;amp;end_date=2012-07-01&amp;amp;start=1&amp;amp;offset=10&amp;amp;app_key=KSKdzSyeb99YdLwTMrzvuLumNYCM6pzT4Z3f27R4L3qq6jCs&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestUseProtocolCachePolicy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLResponse alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSError alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;receivedData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[NSURLConnection sendSynchronousRequest:request returningResponse:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;response error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.person &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self readJsonData:receivedData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.person isKindOfClass:[NSDictionary &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;NSDictionary&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([self.person isKindOfClass:[NSArray &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;]]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;NSArray&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readJsonData:&lt;/span&gt;(NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSJSONSerialization提供了将JSON数据转换为Foundation对象（一般都是NSDictionary和NSArray）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//和Foundation对象转换为JSON数据（可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据）。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personInfo objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;list&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; personList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self.person count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Cell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell&lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[self.person objectAtIndex:indexPath.row];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[dic objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;zh_name&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果还会将数据显示到table中&lt;/p&gt;</description></item><item><title>iOS NSURLConnection异步下载数据</title><link>https://zhangdapeng.dev/p/ios-nsurlconnection-yi-bu-xia-zai-shu-ju/</link><pubDate>Tue, 10 Jun 2025 15:14:42 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nsurlconnection-yi-bu-xia-zai-shu-ju/</guid><description>&lt;p&gt;异步下载支持应用程序在后台下载数据，在等待下载完成的过程中不会阻塞代码的运行&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;UITableViewDelegate,UITableViewDataSource&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//生成content的key值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;keys;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//生成content的value值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//列表内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//艺人的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;vlinkagePersonViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vlinkagePersonViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; personData;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view, typically from a nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURL &lt;span style="color:#f92672"&gt;*&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURL alloc] initWithString:&lt;span style="color:#e6db74"&gt;@&amp;#34;http://xxx.xxx.xxx.xxx:xxx/person/actorlist?order_by=index&amp;amp;start_date=2012-06-01&amp;amp;end_date=2012-07-01&amp;amp;start=1&amp;amp;offset=10&amp;amp;app_key=KSKdzSyeb99YdLwTMrzvuLumNYCM6pzT4Z3f27R4L3qq6jCs&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLRequest &lt;span style="color:#f92672"&gt;*&lt;/span&gt;request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLRequest alloc] initWithURL:url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cachePolicy:NSURLRequestReloadIgnoringCacheData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeoutInterval:&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;connection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSURLConnection alloc] initWithRequest:request delegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;connection){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;链接失败!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.personData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableData data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDictionary alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;content = %@&amp;#34;&lt;/span&gt;,self.content);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//回掉方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveResponse:&lt;/span&gt;(NSURLResponse &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)response{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;didReceiveResponse&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personData setLength:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//将接收到的数据存储到字符串中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didReceiveData:&lt;/span&gt;(NSData &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;didReceiveData&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personData appendData:data];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//下载已经完成
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;connectionDidFinishLoading:&lt;/span&gt; (NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) connection{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;connectionDidFinishLoading&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//调用函数解析下载到的json格式的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self readJsonData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;content %@&amp;#34;&lt;/span&gt;,self.content);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//下载失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;connection:&lt;/span&gt;(NSURLConnection &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)connection &lt;span style="color:#a6e22e"&gt;didFailWithError:&lt;/span&gt;(NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)error{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIAlertView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;errorAlert &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIAlertView alloc] initWithTitle:[error localizedDescription]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message:[error localizedFailureReason]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delegate:self
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cancelButtonTitle:&lt;span style="color:#e6db74"&gt;@&amp;#34;OK!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; otherButtonTitles:nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [errorAlert show];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;readJsonData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSJSONSerialization提供了将JSON数据转换为Foundation对象（一般都是NSDictionary和NSArray）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//和Foundation对象转换为JSON数据（可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据）。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSError &lt;span style="color:#f92672"&gt;*&lt;/span&gt;error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personDictionary &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSJSONSerialization JSONObjectWithData:self.personData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options:NSJSONReadingMutableContainers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error:&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;error];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personInfo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personDictionary objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;data&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;personList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [personInfo objectForKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;list&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; personList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;personList %@&amp;#34;&lt;/span&gt;,personList);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSInteger)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;numberOfRowsInSection:&lt;/span&gt;(NSInteger)section{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(UITableViewCell&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;tableView:&lt;/span&gt;(UITableView&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView &lt;span style="color:#a6e22e"&gt;cellForRowAtIndexPath:&lt;/span&gt;(NSIndexPath&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;CellIdentifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Cell&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell&lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reuseIdentifier:CellIdentifier];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.accessoryType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellAccessoryDisclosureIndicator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;@&amp;#34;话题&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出的结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.174 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.501 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; didReceiveResponse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.501 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; didReceiveData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.502 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; connectionDidFinishLoading
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.502 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; personList &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 175;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.84948333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5b59\U4fea&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 1582;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.78961667&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U949f\U6c49\U826f&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 17577;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.69375000&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5f20\U6839\U7855&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 35;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.60104167&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U6768\U5e42&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3880;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.56774167&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U6797\U4f9d\U6668&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 94;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.56668333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U674e\U5c0f\U7490&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 504;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.48178333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5f20\U6aac&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3571;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.46722500&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U9a6c\U5929\U5b87&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 228;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.45210000&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5b8b\U4e39\U4e39&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 329;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.44270833&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U80e1\U6b4c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2013-04-26 16:45:55.503 vlinkagePerson3&lt;span style="color:#f92672"&gt;[&lt;/span&gt;67809:c07&lt;span style="color:#f92672"&gt;]&lt;/span&gt; content &lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 175;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.84948333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5b59\U4fea&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 1582;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.78961667&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U949f\U6c49\U826f&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 17577;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.69375000&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5f20\U6839\U7855&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 35;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.60104167&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U6768\U5e42&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3880;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.56774167&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U6797\U4f9d\U6668&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 94;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.56668333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U674e\U5c0f\U7490&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 504;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.48178333&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5f20\U6aac&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3571;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.46722500&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U9a6c\U5929\U5b87&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 228;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.45210000&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U5b8b\U4e39\U4e39&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 329;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;is_attention&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.44270833&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;zh_name&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\U80e1\U6b4c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>一些iOS高效开源类库</title><link>https://zhangdapeng.dev/p/yi-xie-ios-gao-xiao-kai-yuan-lei-ku/</link><pubDate>Tue, 10 Jun 2025 13:43:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/yi-xie-ios-gao-xiao-kai-yuan-lei-ku/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;KissXml——xml解析库&lt;br&gt;
相关教程：http://www.iteye.com/topic/625849&lt;br&gt;
&lt;a class="link" href="http://sencho.blog.163.com/blog/static/83056228201151743110540/" target="_blank" rel="noopener"
 &gt;http://sencho.blog.163.com/blog/static/83056228201151743110540/&lt;/a&gt;&lt;br&gt;
很方便的一个xml解析器，支持Xpath查询。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;skpsmtpmessage——Quick SMTP邮件发送&lt;br&gt;
svn checkout &lt;a class="link" href="http://skpsmtpmessage.googlecode.com/svn/trunk/" target="_blank" rel="noopener"
 &gt;http://skpsmtpmessage.googlecode.com/svn/trunk/&lt;/a&gt; skpsmtpmessage-read-only&lt;br&gt;
github: git clone &lt;a class="link" href="https://github.com/kailoa/iphone-smtp.git" target="_blank" rel="noopener"
 &gt;https://github.com/kailoa/iphone-smtp.git&lt;/a&gt;&lt;br&gt;
相关教程：http://disanji.net/2011/01/28/skpsmtpmessage-open-source-framework/&lt;br&gt;
skpsmtpmessage 是由Skorpiostech, Inc.为我们带来的一个SMTP协议的开源实现，使用Objective-c 实现，iOS系统的项目可以直接调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jsonframework——JSON支持&lt;br&gt;
相关教程：http://blog.csdn.net/xiaoguan2008/article/details/6732683&lt;br&gt;
它是一个开源框架，基于BSD协议发布。由于json-framework是开放源代码的，当你需要使用它时你只需将json的源代码加入到你的工程中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ASIHttpRequest——HTTP Network库&lt;br&gt;
ASIHttpRequest库极大的简化了网络通 信，提供更先进的工具，例如文件上传工具，重定向处理工具、验证工具、等等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MBProgressHUD——进展指示符库&lt;br&gt;
苹果的应用程序一般都会用一种优雅的，半透明的进度显示效果，不过这个API是不公开的，因此你要是用了，很可能被清除出AppStore。而 MBProgressHUD提供了一个替代方案，而且在用户角度上，实现的效果根本看不出和官方程序有什么差别。同时还提供了其他附加功能，比如虚拟进展 指示符，以及完成提示信息。整合到项目里也很容易，这里不细谈了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;zxing——二维码扫描库&lt;br&gt;
支持条形码/二维码扫描的图形处理库，这是一个java库，在android上的功能比较完整。同时该库也支持ios，但只能支持二位条形码的扫描。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kal——iPhone日历控件&lt;br&gt;
一个类似于ios系统默认日历开源日历库，支持添加事件，自定义日历样式等功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook iOS SDK——Facebook API类库&lt;br&gt;
大体来讲就是iPhone上的Facebook login，完全支持Facebook Graph API和the older REST api。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;shareKit——分享库&lt;br&gt;
相关demo：http://www.cocoachina.com/bbs/read.php?tid-71760.html&lt;br&gt;
分享到开心，豆瓣，腾讯，新浪微博的api所用到的强大的分享库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SDWebImage——简化网络图片处理&lt;br&gt;
用SDWebImage调用网站上的图片，跟本地调用内置在应用包里的图片一样简单。操作也很简单。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GData client——iPhone上所有Google相关服务的类库&lt;br&gt;
名字就说明一切了。跟Google相关的，值得一提的是，这个项目很开放。有很多示例程序供下载。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CorePlot——2D图形绘图仪&lt;br&gt;
CorePlot有很多解决方案将你的数据可视。同时也会提供各种迷人的图形效果，比如棒状图、饼状图、线状图等等，在他们网站上也提供了大量的范例图形，很多股票价格应用，游戏分数，个人财务管理都在用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three20——类似于Facebook的优秀的UI库&lt;br&gt;
Three20类库是Facebook自己做的，大而全是他最大的特色。把他整合到已有的项目中可能得费点周折，不过如果一开始你就用上了Three20，尤其是牵扯到很多web相关的项目的时候，你就能深刻体会到神马叫给力了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FMDatabase——SQLite的Objective-C封装
是SQLite的C API對初學者來說實在太麻煩太瑣碎，難度太高。FMDB說穿了其實只是把C API包裝成簡單易用的Objective-C类。對于SQLite初學者來說，大大減低了上手的難度。有了FMDB，寫程式時只要專心在SQLite的語法上，而不用去理那堆有看沒有懂的C API，實在是件快樂的事情。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;来源:http://blog.csdn.net/jiarusun000/article/details/7170577&lt;/p&gt;</description></item><item><title>iOS 演示使用Core</title><link>https://zhangdapeng.dev/p/ios-yan-shi-shi-yong-core/</link><pubDate>Tue, 10 Jun 2025 13:42:06 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-yan-shi-shi-yong-core/</guid><description>&lt;p&gt;Core-Plot的安装见我的另外一篇文章 &lt;a class="link" href="https://www.gowhich.com/blog/52" target="_blank" rel="noopener"
 &gt;iOS 使用 Core Plot 绘制统计图表入门&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;创建图表以及将图表放到视图上的方法是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;title = %@&amp;#34;&lt;/span&gt;,self.title);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建图表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTXYGraph alloc] initWithFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//给图表添加一个主题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTTheme &lt;span style="color:#f92672"&gt;*&lt;/span&gt;theme &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTTheme themeNamed:kCPTDarkGradientTheme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph applyTheme:theme];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建画板，将图表添加到画板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGraphHostingView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostingView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTGraphHostingView alloc] initWithFrame:self.view.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostingView.hostedGraph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[self.view addSubview:hostingView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置图表的边框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的的padding设置0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	graph.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//坐标区域的边框设置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//左边的padding设置为45.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingLeft &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//顶部的padding设置为40.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//右边的padding设置为5.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingRight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//底部的padding设置为80.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graph.plotAreaFrame.paddingBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80.0&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置坐标范围
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;plotSpace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)graph.defaultPlotSpace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.allowsUserInteraction &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.xRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;) length:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.yRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;) length:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;200.0&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置坐标刻度大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;axisSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYAxisSet &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) graph.axisSet ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.xAxis ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//x 轴：不显示小刻度线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. minorTickLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 大刻度线间距： 50 单位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString (&lt;span style="color:#e6db74"&gt;@&amp;#34;50&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 坐标原点： 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x. orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYAxis &lt;span style="color:#f92672"&gt;*&lt;/span&gt;y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; axisSet.yAxis ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//y 轴：不显示小刻度线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. minorTickLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nil ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 大刻度线间距： 50 单位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. majorIntervalLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;50&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 坐标原点： 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y. orthogonalCoordinateDecimal &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString (&lt;span style="color:#e6db74"&gt;@&amp;#34;0&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建绿色区域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTScatterPlot alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.identifier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置绿色区域边框的样式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTMutableLineStyle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;lineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [dataSourceLinePlot.dataLineStyle mutableCopy];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置线的宽度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineWidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置线的颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lineStyle.lineColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTColor greenColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加线到绿色区域中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.dataLineStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lineStyle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置透明实现添加动画
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.opacity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置数据元代理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//绿色区域添加到图表中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph addPlot:dataSourceLinePlot];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建一个颜色渐变：从 建变色 1 渐变到 无色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGradient &lt;span style="color:#f92672"&gt;*&lt;/span&gt;areaGradient &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ CPTGradient gradientWithBeginningColor :[CPTColor greenColor] endingColor :[CPTColor colorWithComponentRed:&lt;span style="color:#ae81ff"&gt;0.65&lt;/span&gt; green:&lt;span style="color:#ae81ff"&gt;0.65&lt;/span&gt; blue:&lt;span style="color:#ae81ff"&gt;0.16&lt;/span&gt; alpha:&lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 渐变角度： -90 度（顺时针旋转）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; areaGradient.angle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;90.0f&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 创建一个颜色填充：以颜色渐变进行填充
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTFill &lt;span style="color:#f92672"&gt;*&lt;/span&gt;areaGradientFill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ CPTFill fillWithGradient :areaGradient];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 为图形设置渐变区
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.areaFill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; areaGradientFill;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.areaBaseValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTDecimalFromString ( &lt;span style="color:#e6db74"&gt;@&amp;#34;0.0&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSourceLinePlot.interpolation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CPTScatterPlotInterpolationLinear ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataForPlot1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self plotData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面调用了一个方法:plotData&lt;/p&gt;
&lt;p&gt;有了上面的操作，其他的就是添加数据和显示数据了&lt;/p&gt;
&lt;p&gt;下面给出方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//添加数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;plotData&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([dataSourceLinePlot.identifier isEqual:&lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp1, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp1, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point1 atIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp2, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp2, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point2 atIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp3, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp3, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point3 atIndex:&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp4, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp4, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point4 atIndex:&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point5 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp5, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp5, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point5 atIndex:&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point6 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp6, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp6, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point6 atIndex:&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;110&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point7 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp7, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp7, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point7 atIndex:&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;130&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point8 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp8, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp8, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point8 atIndex:&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;xp9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;yp9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSString stringWithFormat:&lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;135&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;point9 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableDictionary alloc] initWithObjectsAndKeys:xp9, &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt;, yp9, &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dataForPlot1 insertObject:point9 atIndex:&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSUInteger)&lt;span style="color:#a6e22e"&gt;numberOfRecordsForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [dataForPlot1 count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;numberForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot &lt;span style="color:#a6e22e"&gt;field:&lt;/span&gt;(NSUInteger)fieldEnum &lt;span style="color:#a6e22e"&gt;recordIndex:&lt;/span&gt;(NSUInteger)index{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (fieldEnum &lt;span style="color:#f92672"&gt;==&lt;/span&gt; CPTScatterPlotFieldX &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;x&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;@&amp;#34;y&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//让视图偏移
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( [(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot.identifier isEqualToString:&lt;span style="color:#e6db74"&gt;@&amp;#34;Green Plot&amp;#34;&lt;/span&gt;] ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[dataForPlot1 objectAtIndex:index] valueForKey:key];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ( fieldEnum &lt;span style="color:#f92672"&gt;==&lt;/span&gt; CPTScatterPlotFieldX ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithDouble:[num doubleValue] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; r];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加动画效果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CABasicAnimation &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fadeInAnimation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CABasicAnimation animationWithKeyPath:&lt;span style="color:#e6db74"&gt;@&amp;#34;opacity&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fadeInAnimation.duration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fadeInAnimation.removedOnCompletion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fadeInAnimation.fillMode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kCAFillModeForwards;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fadeInAnimation.toValue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSNumber numberWithFloat:&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	[dataSourceLinePlot addAnimation:fadeInAnimation forKey:&lt;span style="color:#e6db74"&gt;@&amp;#34;animateOpacity&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;头文件的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CorePlot-CocoaTouch.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;CPTPlotDataSource, CPTAxisDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYGraph &lt;span style="color:#f92672"&gt;*&lt;/span&gt;graph; &lt;span style="color:#75715e"&gt;//画板
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTScatterPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataSourceLinePlot;&lt;span style="color:#75715e"&gt;//线
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataForPlot1; &lt;span style="color:#75715e"&gt;//坐标数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSTimer &lt;span style="color:#f92672"&gt;*&lt;/span&gt;timer1; &lt;span style="color:#75715e"&gt;//定时器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; r;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;retain&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataForPlot1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS plist的使用</title><link>https://zhangdapeng.dev/p/ios-plist-de-shi-yong/</link><pubDate>Tue, 10 Jun 2025 11:52:11 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-plist-de-shi-yong/</guid><description>&lt;p&gt;1，创建&lt;br&gt;
按command +N快捷键创建，或者File —&amp;gt; New —&amp;gt; New File，选择Mac OS X下的Property List&lt;br&gt;
创建plist文件名为plistdemo。&lt;/p&gt;
&lt;p&gt;打开plistdemo文件，在空白出右键,右键选择Add row 添加数据,添加成功一条数据后，在这条数据上右键看到 value Type选择Dictionary。点加号添加数据。&lt;/p&gt;
&lt;p&gt;创建完成之后用source code查看到plist文件是一个xml格式的文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;plist&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;one&lt;span style="color:#f92672"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;chenglong&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;lilianjie&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zhenzidan&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;shixiaolong&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;two&lt;span style="color:#f92672"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;liushishi&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;tangyan&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zhangziyi&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#f92672"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;yangmi&lt;span style="color:#f92672"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;读取数据的方式，和方法可以参考下面的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//取得person.plist绝对路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//person.plist本身是一个NSDictionary,以键-值的形式存储字符串数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSBundle mainBundle] pathForResource:&lt;span style="color:#e6db74"&gt;@&amp;#34;person&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#e6db74"&gt;@&amp;#34;plist&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//转换成NSDictionary对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dict&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSDictionary alloc] initWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.names&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dict;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//重置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resetSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//重新载入数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.table reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我是直接放在了viewDidLoad这个方法中&lt;/p&gt;</description></item><item><title>iOS使用Core Plot绘制统计图表入门</title><link>https://zhangdapeng.dev/p/ios-shi-yong-core-plot-hui-zhi-tong-ji-tu-biao-ru-men/</link><pubDate>Tue, 10 Jun 2025 11:34:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-shi-yong-core-plot-hui-zhi-tong-ji-tu-biao-ru-men/</guid><description>&lt;p&gt;iOS(iPhone/iPad) 下图形组件有两个有名的，&lt;strong&gt;s7graphview&lt;/strong&gt; 和 &lt;strong&gt;Core Plot&lt;/strong&gt; ，它们都是在Google上托管的代码，听说 Core Plot 比较强，因为前者仅支持曲线图，后者呢曲线图、饼图、柱状图等通吃，且较活跃。那就专注下 Core Plot 的使用。它提供了 MacOSX 和 iOS 下的组件库，我只用到它的 iOS 图表库。&lt;/p&gt;
&lt;p&gt;Core Plot能画出来图表的效果应该多看看：&lt;code&gt;http://code.google.com/p/core-plot/wiki/PlotExamples&lt;/code&gt;，相信看过之后绝大多数的 iOS下的图表可以用它来满足你了。&lt;/p&gt;
&lt;p&gt;配置其实很简单的，先从 &lt;code&gt;http://code.google.com/p/core-plot/downloads/list&lt;/code&gt;下载最新版的CorePlot，比如当前是：CorePlot_0.4.zip，解压开，然后就两步：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把目录 CorePlot_0.4/Binaries/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iOS中的libCorePlotCocoaTouch.a和整个子目录CorePlotHeaders从Finder中一并拖入到当前项目中，选择Copyitem into destination group&amp;rsquo;s folder (if needed)，Add to targets里选上相应的target。此时你可以在项目的target中Build Phases页里 Link Binary With Libraries中看到有了libCorePlot-CocoaTouch.a.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;再到相应Target的 Build Settings页里，Other Linker Flags项中加上 -ObjC -all_load&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择新项目的“info-&amp;gt;Build”，在“Header Search Paths”中添加Core Plot头文件搜索路径，如：/Users/davidzhang/project/core-plot/framework。注意要选中“Recursive”小勾（英文原文中没有提这一点）。同时，在Other Linker Flags中要增加两个选项：-ObjC和-all_load（英文原文中遗漏了第2个选项）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原文档的安装说明是：&lt;/p&gt;
&lt;p&gt;Install Binaries for iOS&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copy the &lt;strong&gt;CorePlotHeaders&lt;/strong&gt; to your Xcode project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy &lt;strong&gt;libCorePlotCocoaTouch.a&lt;/strong&gt; to your Xcode project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add to &lt;strong&gt;Other Linker Flags&lt;/strong&gt; in your target build settings:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;-ObjC -all_load&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;
&lt;p&gt;Add the &lt;strong&gt;QuartzCore&lt;/strong&gt; framework to the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a &lt;strong&gt;CPTGraph&lt;/strong&gt; to your application. See the example apps in Source Code to see how, or read the documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;贴一下我的实例代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;CorePlot-CocoaTouch.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt; : &lt;span style="color:#a6e22e"&gt;UIViewController&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;CPTPlotDataSource, CPTAxisDelegate&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;title;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@property&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;strong&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nonatomic&lt;/span&gt;) NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;DetailsViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@implementation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DetailsViewController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@synthesize&lt;/span&gt; title,dataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidAppear:&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;BOOL&lt;/span&gt;)animated{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//初始化数组，并放入十个 0 － 20 间的随机数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.dataArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.dataArray addObject:[NSNumber numberWithInt:rand()&lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CGRectMake(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//图形要放在一个 CPTGraphHostingView 中，CPTGraphHostingView 继承自 UIView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTGraphHostingView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;hostView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTGraphHostingView alloc] initWithFrame:frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把 CPTGraphHostingView 加到你自己的 View 中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:hostView];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor blueColor];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//在 CPTGraph 中画图，这里的 CPTXYGraph 是个曲线图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//要指定 CPTGraphHostingView 的 hostedGraph 属性来关联
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYGraph &lt;span style="color:#f92672"&gt;*&lt;/span&gt;graph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTXYGraph alloc] initWithFrame:hostView.frame];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hostView.hostedGraph &lt;span style="color:#f92672"&gt;=&lt;/span&gt; graph;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTScatterPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;scatterPlot &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CPTScatterPlot alloc] initWithFrame:graph.bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [graph addPlot:scatterPlot];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scatterPlot.dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; &lt;span style="color:#75715e"&gt;//设定数据源，需应用 CPTPlotDataSource 协议
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//设置 PlotSpace，这里的 xRange 和 yRange 要理解好，它决定了点是否落在图形的可见区域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//location 值表示坐标起始值，一般可以设置元素中的最小值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//length 值表示从起始值上浮多少，一般可以用最大值减去最小值的结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//其实我倒觉得，CPTPlotRange:(NSRange) range 好理解些，可以表示值从 0 到 20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;plotSpace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (CPTXYPlotSpace &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) scatterPlot.plotSpace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.xRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; length:CPTDecimalFromFloat([self.dataArray count]&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plotSpace.yRange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; length:CPTDecimalFromFloat(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//下面省去了坐标与线型及其他图形风格的代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [plotSpace release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [graph release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// [hostView release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//询问有多少个数据，在 CPTPlotDataSource 中声明的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSUInteger) &lt;span style="color:#a6e22e"&gt;numberOfRecordsForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self.dataArray count];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//询问一个个数据值，在 CPTPlotDataSource 中声明的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (NSNumber &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;numberForPlot:&lt;/span&gt;(CPTPlot &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)plot &lt;span style="color:#a6e22e"&gt;field:&lt;/span&gt;(NSUInteger)fieldEnum &lt;span style="color:#a6e22e"&gt;recordIndex:&lt;/span&gt;(NSUInteger)index {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(fieldEnum &lt;span style="color:#f92672"&gt;==&lt;/span&gt; CPTScatterPlotFieldY){ &lt;span style="color:#75715e"&gt;//询问 Y 值时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self.dataArray objectAtIndex:index];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{ &lt;span style="color:#75715e"&gt;//询问 X 值时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [NSNumber numberWithInt:index];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;id&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;initWithNibName:&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil &lt;span style="color:#a6e22e"&gt;bundle:&lt;/span&gt;(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Custom initialization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;viewDidLoad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSLog(&lt;span style="color:#e6db74"&gt;@&amp;#34;title = %@&amp;#34;&lt;/span&gt;,self.title);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;didReceiveMemoryWarning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS运行时xcode出现"nib but the view outlet was not set."错误</title><link>https://zhangdapeng.dev/p/ios-yun-xing-shi-xcode-chu-xian-nib-but-the-view-outlet-was-not-set-cuo-wu/</link><pubDate>Tue, 10 Jun 2025 10:21:31 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-yun-xing-shi-xcode-chu-xian-nib-but-the-view-outlet-was-not-set-cuo-wu/</guid><description>&lt;p&gt;出现的问题如标题：&lt;/p&gt;
&lt;p&gt;问题原因是：&lt;/p&gt;
&lt;p&gt;xib 中, 没有对File&amp;rsquo;s Owner 的Outlets view 进行绑定, 导致在父视图中插入子视图时出错, 在IB中拖拽Files&amp;rsquo; Owner到view, 添加绑定后, 运行成功!&lt;br&gt;
总结一下创建视图和绑定的步骤:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;创建控制器. File-&amp;gt;New File-&amp;gt;Iphone OS-&amp;gt;Cocoa Touch Class-&amp;gt;UIViewController subclass;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建xib. File-&amp;gt;New File-&amp;gt;Iphone OS-&amp;gt;User Interface-&amp;gt;View XIB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定controller和view. 用Interface Builder打开xxx.xib, 点击Files&amp;rsquo; Owner, 在Identity Inspector里面的Class Identity, 选择Step 1创建的控制器类, 接着拖拽File&amp;rsquo;s Owner到View中, 选择Outlets-&amp;gt;view.先选中file&amp;rsquo;s owner(这个很重要)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;资源来自：&lt;a class="link" href="http://blog.csdn.net/thebesttome/article/details/7799893" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/thebesttome/article/details/7799893&lt;/a&gt;&lt;/p&gt;</description></item><item><title>iOS SearchBar的使用方法</title><link>https://zhangdapeng.dev/p/ios-searchbar-de-shi-yong-fang-fa/</link><pubDate>Tue, 10 Jun 2025 10:12:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-searchbar-de-shi-yong-fang-fa/</guid><description>&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;属性&lt;/td&gt;
					&lt;td&gt;作用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UIBarStyle barStyle&lt;/td&gt;
					&lt;td&gt;控件的样式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;id delegate&lt;/td&gt;
					&lt;td&gt;设置控件的委托&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NSString *text&lt;/td&gt;
					&lt;td&gt;控件上面的显示的文字&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NSString *prompt&lt;/td&gt;
					&lt;td&gt;显示在顶部的单行文字，通常作为一个提示行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NSString *placeholder&lt;/td&gt;
					&lt;td&gt;半透明的提示文字，输入搜索内容消失&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL showsBookmarkButton&lt;/td&gt;
					&lt;td&gt;是否在控件的右端显示一个书的按钮(没有文字的时候)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL showsCancelButton&lt;/td&gt;
					&lt;td&gt;是否显示cancel按钮&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL showsSearchResultsButton&lt;/td&gt;
					&lt;td&gt;是否在控件的右端显示搜索结果按钮(没有文字的时候)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL searchResultsButtonSelected&lt;/td&gt;
					&lt;td&gt;搜索结果按钮是否被选中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UIColor *tintColor&lt;/td&gt;
					&lt;td&gt;bar的颜色(具有渐变效果)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL translucent&lt;/td&gt;
					&lt;td&gt;指定控件是否会有透视效果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UITextAutocapitalizationType &lt;!-- raw HTML omitted --&gt;autocapitalizationType&lt;/td&gt;
					&lt;td&gt;设置在什么的情况下自动大写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UITextAutocorrectionType &lt;!-- raw HTML omitted --&gt;autocorrectionType&lt;/td&gt;
					&lt;td&gt;对于文本对象自动校正风格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UIKeyboardType &lt;!-- raw HTML omitted --&gt;keyboardType&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="#" &gt;键盘&lt;/a&gt;的样式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NSArray *scopeButtonTitles&lt;/td&gt;
					&lt;td&gt;搜索栏下部的选择栏，数组里面的内容是按钮的标题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NSInteger selectedScopeButtonIndex&lt;/td&gt;
					&lt;td&gt;搜索栏下部的选择栏按钮的个数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BOOL showsScopeBar&lt;/td&gt;
					&lt;td&gt;控制搜索栏下部的选择栏是否显示出来&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="代理列表"&gt;&lt;a class="link" href="#1" &gt;代理列表：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;编辑代理&lt;br&gt;
– searchBar:textDidChange:&lt;br&gt;
– searchBar:shouldChangeTextInRange:replacementText:&lt;br&gt;
– searchBarShouldBeginEditing:&lt;br&gt;
– searchBarTextDidBeginEditing:&lt;br&gt;
– searchBarShouldEndEditing:&lt;br&gt;
– searchBarTextDidEndEditing:&lt;/p&gt;
&lt;p&gt;点击按钮&lt;br&gt;
– searchBarBookmarkButtonClicked:&lt;br&gt;
– searchBarCancelButtonClicked:&lt;br&gt;
– searchBarSearchButtonClicked:&lt;br&gt;
– searchBarResultsListButtonClicked:&lt;/p&gt;
&lt;p&gt;范围代理&lt;br&gt;
– searchBar:selectedScopeButtonIndexDidChange:&lt;/p&gt;
&lt;h3 id="searchbar使用小技巧"&gt;&lt;a class="link" href="#2" &gt;searchBar使用小技巧&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;searchBar的范围控件showsScopeBar，官方学名叫Scope Buttons。&lt;br&gt;
首先就要设置这个属性：&lt;br&gt;
&lt;code&gt;self.searchBar.showsScopeBar = YES;&lt;/code&gt;
然后要给他添加按钮。比如说，这样：&lt;code&gt;self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@&amp;quot;BOY&amp;quot;,@&amp;quot;GIRL&amp;quot;,@&amp;quot;ALL&amp;quot;,nil]; &lt;/code&gt;
还有一个很重要的事情就是我们要实现这个代理UISearchBarDelegate里的这个方法&lt;code&gt;searchBar:selectedScopeButtonIndexDidChange:&lt;/code&gt;。告诉表格，你选择的范围是啥。&lt;br&gt;
还有要是设置默认选择哪个按钮的话，要设置这个属性,像这样就是默认选中第1个啦。&lt;br&gt;
&lt;code&gt;self.searchBar.selectedScopeButtonIndex = 0;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在实现搜索功能时，界面使用UISearchBar比较好，它实现了很多搜索时使用到的东西，但是默认的风格可能和现有的风格不一致，所以需要我们想办法去修改一下默认的外观。&lt;/p&gt;
&lt;h4 id="修改uisearchbar的背景颜色"&gt;&lt;a class="link" href="#2-1" &gt;修改UISearchBar的背景颜色&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;UISearchBar是由两个subView组成的，一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性。&lt;br&gt;
方法是直接将 UISearchBarBackGround移去
第一种解决方案：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seachBar&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[UISearchBar alloc] init]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seachBar.backgroundColor&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[UIColor clearColor]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;subview &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; seachBar.subviews) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([subview isKindOfClass:NSClassFromString(&lt;span style="color:#e6db74"&gt;@&amp;#34;UISearchBarBackground&amp;#34;&lt;/span&gt;)]) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [subview removeFromSuperview]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二种解决的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[searchbar.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]removeFromSuperview];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="为uisearchbar添加背景图片"&gt;&lt;a class="link" href="#2-2" &gt;为UISearchBar添加背景图片&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISearchBar&lt;span style="color:#f92672"&gt;*&lt;/span&gt; m_searchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;41&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.barStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIBarStyleBlackTranslucent; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.autocorrectionType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocorrectionTypeNo; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.autocapitalizationType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocapitalizationTypeNone; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.placeholder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; _(&lt;span style="color:#e6db74"&gt;@&amp;#34;Search&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_searchBar.keyboardType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UIKeyboardTypeDefault; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//为UISearchBar添加背景图片 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;segment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [m_searchBar.subviews objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UIImageView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;bgImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIImageView alloc] initWithImage:[UIImage imageNamed:&lt;span style="color:#e6db74"&gt;@&amp;#34;Images/search_bar_bg.png&amp;#34;&lt;/span&gt;]]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[segment addSubview: bgImage]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//&amp;lt;---背景图片 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:m_searchBar]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[m_searchBar &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="取消uisearchbar调用的键盘"&gt;&lt;a class="link" href="#2-3" &gt;取消UISearchBar调用的键盘&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[searchBar resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一种方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;mySearchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc] 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, self.view.bounds.size.width, &lt;span style="color:#ae81ff"&gt;45&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySearchBar.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySearchBar.showsCancelButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySearchBar.barStyle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIBarStyleDefault; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySearchBar.placeholder&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;@&amp;#34;Enter Name or Categary&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mySearchBar.keyboardType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;UIKeyboardTypeNamePhonePad; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:mySearchBar]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mySearchBar &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二种方法，在tableview上添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//add Table 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myBeaconsTableView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableView alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, self.view.bounds.size.width, self.view.bounds.size.height&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;) style:UITableViewStylePlain]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;myBeaconsTableView.backgroundColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIColor whiteColor]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;myBeaconsTableView.delegate&lt;span style="color:#f92672"&gt;=&lt;/span&gt;self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;myBeaconsTableView.dataSource&lt;span style="color:#f92672"&gt;=&lt;/span&gt;self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myBeaconsTableView setRowHeight:&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Add searchbar 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;searchBar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UISearchBar alloc] initWithFrame:CGRectMake(&lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, self.view.bounds.size.width, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;)]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;searchBar.placeholder&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;@&amp;#34;Enter Name&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;searchBar.delegate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;myBeaconsTableView.tableHeaderView &lt;span style="color:#f92672"&gt;=&lt;/span&gt; searchBar; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;searchBar.autocorrectionType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocorrectionTypeNo; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;searchBar.autocapitalizationType &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITextAutocapitalizationTypeNone; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[searchBar &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.view addSubview:myBeaconsTableView]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[myBeaconsTableView &lt;span style="color:#66d9ef"&gt;release&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS NSLog的定义</title><link>https://zhangdapeng.dev/p/ios-nslog-de-ding-yi/</link><pubDate>Tue, 10 Jun 2025 10:01:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nslog-de-ding-yi/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;format, &lt;span style="color:#960050;background-color:#1e0010"&gt;…&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本上，NSLog很像printf，同样会在console中输出显示结果。不同的是，传递进去的格式化字符是NSString的对象，而不是char *这种字符串指针。&lt;/p&gt;
&lt;p&gt;实例：&lt;/p&gt;
&lt;p&gt;NSLog可以如下面的方法使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;this is a test&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;string is :%@&amp;#34;&lt;/span&gt;, string);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog (&lt;span style="color:#e6db74"&gt;@&amp;#34;x=%d, y=%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是下面的写法是不行的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12345&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog( &lt;span style="color:#e6db74"&gt;@&amp;#34;%@&amp;#34;&lt;/span&gt;, i );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因是， %@需要显示对象，而int i明显不是一个对象，要想正确显示，要写成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-objectivec" data-lang="objectivec"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12345&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSLog( &lt;span style="color:#e6db74"&gt;@&amp;#34;%d&amp;#34;&lt;/span&gt;, i )&lt;span style="color:#960050;background-color:#1e0010"&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;NSLog的格式如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;%@ 对象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%d, %i 整数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%u 无符整形&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%f 浮点/双字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%x, %X 二进制整数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%o 八进制整数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%zu size_t%p 指针&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%e 浮点/双字 （科学计算）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%g 浮点/双字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%s C 字符串&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%.*s Pascal字符串&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%c 字符&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%C unicha&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;r%lld 64位长整数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（long long）%llu 无符64位长整数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;%Lf 64位双字&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iOS代码段分享</title><link>https://zhangdapeng.dev/p/ios-dai-ma-duan-fen-xiang/</link><pubDate>Mon, 09 Jun 2025 11:49:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-dai-ma-duan-fen-xiang/</guid><description>&lt;p&gt;收集的一些实用的ios代码段&lt;/p&gt;
&lt;h3 id="去除顶部状态栏后的分辨率"&gt;&lt;a class="link" href="#1" &gt;去除顶部状态栏后的分辨率&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen] applicationFrame];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取当前sim卡的手机号码私有api"&gt;&lt;a class="link" href="#2" &gt;获取当前SIM卡的手机号码（私有API）&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;首先引入官方的CoreTelephony库，然后使用如下函数返回用户手机号码即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;CTSettingCopyMyPhoneNumber&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;telNum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CTSettingCopyMyPhoneNumber&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="获取当前运营商名称及相关描述信息"&gt;&lt;a class="link" href="#3" &gt;获取当前运营商名称及相关描述信息&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;首先引入官方的CoreTelephony库，然后添加相应的头文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;CoreTelephony/CTCarrier.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;CoreTelephony/CTTelephonyNetworkInfo.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接着使用CTTelephonyNetworkInfo与CTCarrier这两个类获取运营商相关信息，并将其保存到一个CTCarrier对象中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CTTelephonyNetworkInfo &lt;span style="color:#f92672"&gt;*&lt;/span&gt;info &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[CTTelephonyNetworkInfo alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CTCarrier &lt;span style="color:#f92672"&gt;*&lt;/span&gt;carrier &lt;span style="color:#f92672"&gt;=&lt;/span&gt; info.subscriberCellularProvider;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@”&lt;/span&gt;description:&lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@”&lt;/span&gt;,[carrier description]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@”&lt;/span&gt;carrier:&lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@”&lt;/span&gt;, carrier.carrierName);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CTCarrier &lt;span style="color:#f92672"&gt;(&lt;/span&gt;0x1a0200&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Carrier name: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;中国联通&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Mobile Country Code: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;460&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Mobile Network Code:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;01&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ISO Country Code:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;cn&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allows VOIP? &lt;span style="color:#f92672"&gt;[&lt;/span&gt;YES&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;carrier:中国联通
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS的controller的跳转 pushViewController/presentModalViewController/addSubView</title><link>https://zhangdapeng.dev/p/ios-de-controller-de-tiao-zhuan-pushviewcontrollerpresentmodalviewcontrolleraddsubview/</link><pubDate>Mon, 09 Jun 2025 11:27:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-de-controller-de-tiao-zhuan-pushviewcontrollerpresentmodalviewcontrolleraddsubview/</guid><description>&lt;ol&gt;
&lt;li&gt;用UINavigationController的时候用pushViewController:animated（在调用的函数里面添加如下类似代码）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;teleplayViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;teleplay &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[teleplayViewController alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self.navigationController pushViewController:teleplay animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;其他时候用presentModalViewController:animated（在调用的函数里面添加如下类似代码）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self presentModalViewController:controller animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时不要忘记在另一个视图中调用函数dismissViewControllerAnimated（代码类似如下）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self dismissViewControllerAnimated:YES completion:NULL];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;切换视图一般用不到addSubview&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;UINavigationController是导航控制器，如果pushViewController的话，会跳转到下一个ViewController，点返回会回到现在这个ViewController；&lt;/p&gt;
&lt;p&gt;如果是addSubview的话，其实还是对当前的ViewController操作，只是在当前视图上面又“盖”住了一层视图，其实原来的画面在下面呢，看不到而已。（当然，也可以用insertSubView atIndex那个方法设置放置的层次)&lt;/p&gt;</description></item><item><title>iOS搜索栏UISearchBarDelegate委托常用方法</title><link>https://zhangdapeng.dev/p/ios-sou-suo-lan-uisearchbardelegate-wei-tuo-chang-yong-fang-fa/</link><pubDate>Fri, 06 Jun 2025 18:07:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-sou-suo-lan-uisearchbardelegate-wei-tuo-chang-yong-fang-fa/</guid><description>&lt;p&gt;请看下面的实例代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//点击键盘上的search按钮时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchBarSearchButtonClicked:(UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchBar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchTerm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; searchBar.text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self handleSearchForTerm:searchTerm];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//输入文本实时更新时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchBar:(UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchBar textDidChange:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchText
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (searchText.length &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resetSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [table reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self handleSearchForTerm:searchText];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//cancel按钮点击时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchBarCancelButtonClicked:(UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchBar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isSearching &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; search.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self resetSearch];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [table reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [searchBar resignFirstResponder];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//点击搜索框时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchBarTextDidBeginEditing:(UISearchBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)searchBar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isSearching &lt;span style="color:#f92672"&gt;=&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [table reloadData];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UISearchBar上按钮的默认文字为Cancel，如果想改为其他文字请调用以下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(id cc in [searchtext subviews]){ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;([cc isKindOfClass:[UIButton class]]){ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;btn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (UIButton &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)cc; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [btn setTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;取消&amp;#34;&lt;/span&gt; forState:UIControlStateNormal]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS uitableview uitableviewcell简单举例</title><link>https://zhangdapeng.dev/p/ios-uitableview-uitableviewcell-jian-dan-ju-li/</link><pubDate>Fri, 06 Jun 2025 18:04:09 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uitableview-uitableviewcell-jian-dan-ju-li/</guid><description>&lt;p&gt;我学过网页制作，多多少少的能理解一下table这个元素，关于ios的uitableview应该也有这些类似的东西，觉得在uitableview中，都能够找与table对应的部分，看下面代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MasterViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// vlinkagePerson
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-4-14.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;MasterViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;interface &lt;span style="color:#a6e22e"&gt;MasterViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;implementation MasterViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;synthesize navbar,navItem,searchButton,attentionButton,personTable,keys,objects,content;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (id)initWithNibName:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil bundle:(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Custom initialization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)viewDidLoad
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view from its nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.keys &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mainTitleKey&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;secondaryTitleKey&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;imageKey&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.objects &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;How&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Are&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;You&amp;#34;&lt;/span&gt;,nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//表格添加内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个导航栏
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navbar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationBar alloc] initWithFrame:&lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个导航栏集合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;艺人列表&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//在这个集合Item中添加标题，按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//style:设置按钮的风格，一共有三种选择
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//action：@selector:设置按钮的点击事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个左边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;搜索&amp;#34;&lt;/span&gt; style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;selector&lt;/span&gt;(searchEvent)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个右边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.attentionButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;我的关注&amp;#34;&lt;/span&gt; style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;selector&lt;/span&gt;(attentionList)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把导航栏集合添加到导航栏中，设置动画关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navbar pushNavigationItem:self.navItem animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把左右两个按钮添加到导航栏集合中去
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navItem setLeftBarButtonItem:self.searchButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navItem setRightBarButtonItem:self.attentionButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//添加UITableView
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.personTable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableView alloc] initWithFrame:&lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;460&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style:UITableViewStyleGrouped];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personTable setDataSource:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.personTable setDelegate:self];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将标题栏中的内容全部添加到主视图当中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.navbar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将表格添加到主视图中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.personTable];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchEvent{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) attentionList{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Section总数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)sectionIndexTitlesForTableView:(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self.objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//每个section显示的标题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//设置caption
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView:(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView titleForHeaderInSection:(NSInteger)section{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;大家好&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//指定有多少个分区(Section)，默认为1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//需要多少个table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(NSInteger) numberOfSectionsInTableView:(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//指定每个分区中有多少行，默认为1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//table的行数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(NSInteger) tableView:(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView numberOfRowsInSection:(NSInteger)section{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//绘制Cell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//为每个表格赋值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;) tableView:(UITableView &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)tableView cellForRowAtIndexPath:(NSIndexPath &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)indexPath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITableViewCell &lt;span style="color:#f92672"&gt;*&lt;/span&gt;cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [tableView dequeueReusableCellWithIdentifier:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;MyIdentifier&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cell &lt;span style="color:#f92672"&gt;==&lt;/span&gt; nil) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;MyIdentifier&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.selectionStyle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; UITableViewCellSelectionStyleNone;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.textLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.content objectForKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mainTitleKey&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.detailTextLabel.text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self.content objectForKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;secondaryTitleKey&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSBundle mainBundle] pathForResource:[self.content objectForKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;imageKey&amp;#34;&lt;/span&gt;] ofType:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UIImage &lt;span style="color:#f92672"&gt;*&lt;/span&gt;theImage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [UIImage imageWithContentsOfFile:path];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cell.imageView.image &lt;span style="color:#f92672"&gt;=&lt;/span&gt; theImage;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cell;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)didReceiveMemoryWarning
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS NSDictionary操作简介</title><link>https://zhangdapeng.dev/p/ios-nsdictionary-cao-zuo-jian-jie/</link><pubDate>Fri, 06 Jun 2025 18:01:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-nsdictionary-cao-zuo-jian-jie/</guid><description>&lt;p&gt;iOS NSDictionary 操作代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)loopThrough
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt; keys&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSArray arrayWithObjects:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;key1“，@&amp;#34;&lt;/span&gt;key2&lt;span style="color:#e6db74"&gt;&amp;#34;,@&amp;#34;&lt;/span&gt;key3&lt;span style="color:#e6db74"&gt;&amp;#34;,nill];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSArray arrayWithOjbects:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;how&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;are&amp;#34;&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;you&amp;#34;&lt;/span&gt;,nill];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSDictionary dictionaryWithObjects:objects,forKeys:keys];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//loop 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(id key in dic)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;key:%@,value:%@&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;，&lt;/span&gt;key,[dic objectForKey:key]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//loop 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSEnumerator &lt;span style="color:#f92672"&gt;*&lt;/span&gt;enumerator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id key;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enumerator&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[dic keyEnumerator];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;((key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[enumerator nextObject]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;key:%@,value:%@&amp;#34;&lt;/span&gt;,key,objectForKey:key]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)testNsMutableDictionary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;dic&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[NSMutableDictionary dictionaryWithCapacity:&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//dictionaryWithObjectsAndKeys:[NSMuble numberWithInt:1] @&amp;#34;math1&amp;#34;,[NSMuble numberWithInt:2] @&amp;#34;math2&amp;#34;];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setObject:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dog&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setObject:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;two&amp;#34;&lt;/span&gt; forKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;cat&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic setValue:[NSString stringWithFormat:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;three&amp;#34;&lt;/span&gt;] forKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;pig&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic removeObjectForkey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;cat&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic removeAllObjects];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray arraylist&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[[NSMutableArray alloc] init];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [arrarlist addObject:dic];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [dic release];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS创建navigationbar</title><link>https://zhangdapeng.dev/p/ios-chuang-jian-navigationbar/</link><pubDate>Fri, 06 Jun 2025 11:44:14 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-chuang-jian-navigationbar/</guid><description>&lt;p&gt;使用代码创建自己的navigationbar：&lt;/p&gt;
&lt;p&gt;环境:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xcode:Version 4.6.1 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;4H512&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;simulater:iPhone6.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接上代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MasterViewController.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// vlinkagePerson
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-4-14.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;lt;UIKit/UIKit.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;interface MasterViewController : UIViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//导航栏
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;property&lt;/span&gt; (strong, nonatomic) UINavigationBar &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navbar;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//导航栏集合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;property&lt;/span&gt; (strong, nonatomic) UINavigationItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;navItem;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//左边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;property&lt;/span&gt; (strong, nonatomic) UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;searchButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//右边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;property&lt;/span&gt; (strong, nonatomic) UIBarButtonItem &lt;span style="color:#f92672"&gt;*&lt;/span&gt;attentionButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//自定义方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//搜索操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchEvent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) attentionList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// MasterViewController.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// vlinkagePerson
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Created by david on 13-4-14.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Copyright (c) 2013年 david. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#import &amp;#34;MasterViewController.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;interface &lt;span style="color:#a6e22e"&gt;MasterViewController&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;implementation MasterViewController
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;synthesize navbar,navItem,searchButton,attentionButton;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (id)initWithNibName:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibNameOrNil bundle:(NSBundle &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)nibBundleOrNil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Custom initialization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)viewDidLoad
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super viewDidLoad];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Do any additional setup after loading the view from its nib.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个导航栏
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navbar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationBar alloc] initWithFrame:&lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;320&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;44&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个导航栏集合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navItem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UINavigationItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;艺人列表&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//在这个集合Item中添加标题，按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//style:设置按钮的风格，一共有三种选择
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//action：@selector:设置按钮的点击事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个左边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.searchButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;搜索&amp;#34;&lt;/span&gt; style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;selector&lt;/span&gt;(searchEvent)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//创建一个右边按钮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.attentionButton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIBarButtonItem alloc] initWithTitle:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;我的关注&amp;#34;&lt;/span&gt; style:UIBarButtonItemStylePlain target:self action:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;selector&lt;/span&gt;(attentionList)];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把导航栏集合添加到导航栏中，设置动画关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navbar pushNavigationItem:self.navItem animated:YES];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//把左右两个按钮添加到导航栏集合中去
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navItem setLeftBarButtonItem:self.searchButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.navItem setRightBarButtonItem:self.attentionButton];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//将标题栏中的内容全部添加到主视图当中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.view addSubview:self.navbar];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) searchEvent{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) attentionList{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)didReceiveMemoryWarning
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [super didReceiveMemoryWarning];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Dispose of any resources that can be recreated.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS CGFloat CGPoint CGSize和CGRect</title><link>https://zhangdapeng.dev/p/ios-cgfloat-cgpoint-cgsize-he-cgrect/</link><pubDate>Fri, 06 Jun 2025 10:35:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cgfloat-cgpoint-cgsize-he-cgrect/</guid><description>&lt;p&gt;CGGeometry类定义几何元素的结构和操作几何元素的函数。&lt;/p&gt;
&lt;h3 id="1数据类型"&gt;&lt;a class="link" href="#1" &gt;1、数据类型：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;CGFloat: 浮点值的基本类型&lt;/p&gt;
&lt;p&gt;CGPoint: 表示一个二维坐标系中的点&lt;/p&gt;
&lt;p&gt;CGSize: 表示一个矩形的宽度和高度&lt;/p&gt;
&lt;p&gt;CGRect: 表示一个矩形的位置和大小&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;typedef float CGFloat;// 32-bit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;typedef double CGFloat;// 64-bit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;struct CGPoint &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;typedef struct CGPoint CGPoint;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;struct CGSize &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;typedef struct CGSize CGSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;struct CGRect &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGPoint origin;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGSize size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;typedef struct CGRect CGRect;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：CGRect数据结构的高度和宽度可以是负数。例如，一个矩形的原点是[0.0，0.0]和大小是[10.0,10.0]。这个矩形完全等同原点是[10.0，10.0]和大小是[-10.0，-10.0]的矩形。&lt;/p&gt;
&lt;h3 id="2使用值来创建几何元素的方法"&gt;&lt;a class="link" href="#2" &gt;2、使用值来创建几何元素的方法&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGPoint &lt;span style="color:#a6e22e"&gt;CGPointMake&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat x,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGSize &lt;span style="color:#a6e22e"&gt;CGSizeMake&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat height
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect &lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat x,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat y,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat width,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGFloat height
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGFloat ten&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGPoint point &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CGPointMake&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGSize size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CGSizeMake&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGRect rect &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CGRectMake&lt;/span&gt;(point.x, point.y, size.width, size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ten: %f&amp;#34;&lt;/span&gt;, ten);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;point: %@&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;NSStringFromCGPoint&lt;/span&gt;(point));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;size: %@&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;NSStringFromCGSize&lt;/span&gt;(size));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;rect: %@&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;NSStringFromCGRect&lt;/span&gt;(rect));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS UIScreen（屏幕）UIWindow（画框)UIView(画布)didFinishLaunchingWithOptions的概念</title><link>https://zhangdapeng.dev/p/ios-uiscreen-ping-mu-uiwindow-hua-kuang-uiview-hua-bu-didfinishlaunchingwithoptions-de-gai-nian/</link><pubDate>Fri, 06 Jun 2025 10:33:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-uiscreen-ping-mu-uiwindow-hua-kuang-uiview-hua-bu-didfinishlaunchingwithoptions-de-gai-nian/</guid><description>&lt;p&gt;didFinishLaunchingWithOptions 方法：顾名思义。在app开始运行时会调用里面的方法。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (BOOL)application:(UIApplication &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)application didFinishLaunchingWithOptions:(NSDictionary &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)launchOptions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//返回的是带有状态栏的矩形
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect bound &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]bounds]; &lt;span style="color:#75715e"&gt;//返回的是不带有状态栏的Rect
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;boundwith:%f boundheight:%f&amp;#34;&lt;/span&gt;,bound.size.width,bound.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;boundx:%f boundy:%f&amp;#34;&lt;/span&gt;,bound.origin.x,bound.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//2012-08-03 23:21:45.716 DinkMixer[599:c07] boundwith:320.000000 boundheight:480.000000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//2012-08-03 23:21:45.719 DinkMixer[599:c07] boundx:0.000000 boundy:0.000000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGRect appBound &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[UIScreen mainScreen]applicationFrame]; &lt;span style="color:#75715e"&gt;//返回的是带有状态栏的Rect
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;appBoundwith:%f boundheight:%f&amp;#34;&lt;/span&gt;,appBound.size.width,appBound.size.height);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;appBoundx:%f boundy:%f&amp;#34;&lt;/span&gt;,appBound.origin.x,appBound.origin.y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//2012-08-03 23:21:45.720 DinkMixer[599:c07] appBoundwith:320.000000 boundheight:460.000000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//2012-08-03 23:21:45.720 DinkMixer[599:c07] appBoundx:0.000000 boundy:20.000000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//很明显状态栏占用了空间20像素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MasterViewController &lt;span style="color:#f92672"&gt;*&lt;/span&gt;masterViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[MasterViewController alloc] initWithNibName:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;MasterViewController&amp;#34;&lt;/span&gt; bundle:nil] autorelease];&lt;span style="color:#75715e"&gt;//根据nib文件的名称来创建一个视图控制器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.navigationController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];&lt;span style="color:#75715e"&gt;//创建一个导航控制器，并指定该导航控制器的根视图控制器为上面建立的masterViewController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.window.rootViewController &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self.navigationController;&lt;span style="color:#75715e"&gt;//窗体（window）有一个根视图控制器——这个视图控制器负责配置当窗体显示时最先显示的视图。要让你的视图控制器的内容显示在窗体中，需要去设置窗体的根视图控制器为你的视图控制器。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self.window makeKeyAndVisible];&lt;span style="color:#75715e"&gt;//这行代码会让包含了视图控制器视图的Window窗口显示在屏幕上。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS存储方式</title><link>https://zhangdapeng.dev/p/ios-cun-chu-fang-shi/</link><pubDate>Thu, 05 Jun 2025 11:06:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-cun-chu-fang-shi/</guid><description>&lt;h3 id="第一种nskeyedarchiver加密形式"&gt;&lt;a class="link" href="#1" &gt;第一种:NSKeyedArchiver（加密形式）&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;代码很简单就不多解释了直接上代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//=================NSKeyedArchiver========================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;我是&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;数据&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:saveStr1, saveStr2, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//----Save
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//这一句是将路径和文件名合成文件完整路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;Path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;filename &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [Path stringByAppendingPathComponent:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;saveDatatest&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[NSKeyedArchiver archiveRootObject:array toFile:filename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//用于测试是否已经保存了数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;hhhhhhiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;mmmmmmiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//----Load
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;str:%@&amp;#34;&lt;/span&gt; ,saveStr1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;astr:%@&amp;#34;&lt;/span&gt; ,saveStr2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="第二种nsuserdefaults"&gt;&lt;a class="link" href="#2" &gt;第二种:NSUserDefaults&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;举个简单的例子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//=================NSUserDefaults========================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;我是&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;数据&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:saveStr1, saveStr2, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Save
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[saveDefaults setObject:array forKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SaveKey&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//用于测试是否已经保存了数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;hhhhhhiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;mmmmmmiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//---Load
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [saveDefaults objectForKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SaveKey&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [array objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;str:%@&amp;#34;&lt;/span&gt; ,saveStr1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;astr:%@&amp;#34;&lt;/span&gt; ,saveStr2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="第三种write写入方式"&gt;&lt;a class="link" href="#3" &gt;第三种:Write写入方式&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;举个例子，也很简单的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//=================Write写入方式========================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;我是&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;数据&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSArray arrayWithObjects:saveStr1, saveStr2, nil];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//----Save
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;documentsDirectory) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;没找到&amp;#34;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveDataArray&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nil;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Savedatas.plist&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[NSArray arrayWithObjects:array,nil] writeToFile:appFile atomically:NO];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//用于测试是否已经保存了数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;hhhhhhiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;mmmmmmiiii&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//----Load
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ([[NSFileManager defaultManager] fileExistsAtPath:appFile]){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; saveDataArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithContentsOfFile:appFile];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; saveDataArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Savedatas&amp;#34;&lt;/span&gt; ofType:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;plist&amp;#34;&lt;/span&gt; ]];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;strArray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [saveDataArray objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [strArray objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [strArray objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;str:%@&amp;#34;&lt;/span&gt; ,saveStr1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;astr:%@&amp;#34;&lt;/span&gt; ,saveStr2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="第四种sqlite3"&gt;&lt;a class="link" href="#4" &gt;第四种:SQLite3&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在使用sqlite3之前 你需要将libsqlite3.dylib这个类库加入到你的项目中&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; (NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)dataFilePath{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:kFilename];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;//首先得到应用程序沙盒中Document文件夹的路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:kFilename]&lt;span style="color:#75715e"&gt;//返回你指定文件的路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开数据库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 &lt;span style="color:#f92672"&gt;*&lt;/span&gt;database;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sqlite3_open&lt;/span&gt;([filePath UTF8String], &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;database)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_close&lt;/span&gt;(database);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSAssert&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Failed to open database&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建数据库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;errorMsg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;createSQL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY,FIELD_DATA TEXT);&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_exec&lt;/span&gt;(database, [createSQL UTF8String], NULL, NULL, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;errorMsg)&lt;span style="color:#f92672"&gt;!=&lt;/span&gt;SQLITE_OK) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_close&lt;/span&gt;(database);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSAssert1&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Error creating table:%s&amp;#34;&lt;/span&gt;,errorMsg);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数据查询&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3_stmt &lt;span style="color:#f92672"&gt;*&lt;/span&gt;statement;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_prepare_v2&lt;/span&gt;(database, [query UTF8String], &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;statement, nil)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;SQLITE_OK) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_step&lt;/span&gt;(statement)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;SQLITE_ROW) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_column_int&lt;/span&gt;(statement, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;rowData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#a6e22e"&gt;sqlite3_column_text&lt;/span&gt;(statement, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSString *fieldName = [[NSString alloc] initWithFormat:@&amp;#34;field&amp;amp;d&amp;#34;,row];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//UITextField *field = [self valueForKey:fieldName];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//field.text = fieldValue;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[fieldName release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//[fieldValue release];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_finalize&lt;/span&gt;(statement);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sqlite3_close&lt;/span&gt;(database);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数据插入／更新&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 &lt;span style="color:#f92672"&gt;*&lt;/span&gt;database;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_open&lt;/span&gt;([[self dataFilePath] UTF8String], &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;database)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_close&lt;/span&gt;(database);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSAssert&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Failed to open database&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fieldName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[NSString alloc] initWithFormat:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;field%d&amp;#34;&lt;/span&gt;,i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; UITextField &lt;span style="color:#f92672"&gt;*&lt;/span&gt;field &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self valueForKey:fieldName];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [fieldName release];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;errorMsg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;update &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;INSERT OR REPLACE INTO FIELDS (ROW,FIELD_DATA) VALUES(?,?);&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//这里插入的值可以用nsstring替换，但是最好的做法是使用绑定，如果遇到特殊字符 这是不二选择
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sqlite3_stmt &lt;span style="color:#f92672"&gt;*&lt;/span&gt;stmt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_prepare_v2&lt;/span&gt;(database, update, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;stmt, nil)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;SQLITE_OK) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_bind_int&lt;/span&gt;(stmt, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, i);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_bind_text&lt;/span&gt;(stmt, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, [[field text] UTF8String], &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, NULL);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sqlite3_step&lt;/span&gt;(stmt)&lt;span style="color:#f92672"&gt;!=&lt;/span&gt;SQLITE_DONE) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSAssert&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Error updating table:%s&amp;#34;&lt;/span&gt;,errorMsg);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqlite3_finalize&lt;/span&gt;(stmt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sqlite3_close&lt;/span&gt;(database);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;#######################可爱分割线#############################&lt;/p&gt;
&lt;p&gt;对Write写入方式保存数据和读取数据封装了两个方法：&lt;/p&gt;
&lt;p&gt;封装的函数如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//保存游戏数据 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//参数介绍： 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// (NSMutableArray *)data ：保存的数据 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// (NSString *)fileName ：存储的文件名 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(BOOL) saveGameData:(NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)data saveFileName:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;documentsDirectory) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Documents directory not found!&amp;#34;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; NO; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:fileName]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ([data writeToFile:appFile atomically:YES]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//读取游戏数据 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//参数介绍： 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// (NSString *)fileName ：需要读取数据的文件名 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(id) loadGameData:(NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)fileName 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;paths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NSSearchPathForDirectoriesInDomains&lt;/span&gt;(NSDocumentDirectory, NSUserDomainMask, YES); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;documentsDirectory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [paths objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;appFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [documentsDirectory stringByAppendingPathComponent:fileName]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;myData &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [[[NSMutableArray alloc] initWithContentsOfFile:appFile] autorelease]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; myData; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以使用类似下面的例子进行使用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;测试保存读取&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSString &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveStr2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;两个函数&amp;#34;&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSMutableArray arrayWithObjects:saveStr1, saveStr2, nil]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[self saveGameData:array saveFileName:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Himi&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSMutableArray&lt;span style="color:#f92672"&gt;*&lt;/span&gt;temp &lt;span style="color:#f92672"&gt;=&lt;/span&gt;(NSMutableArray&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)[self loadGameData:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Himi&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;NSLog&lt;/span&gt;(&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;%@--%@&amp;#34;&lt;/span&gt;,[temp objectAtIndex:&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;],[temp objectAtIndex:&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有两点需要注意的地方：&lt;/p&gt;
&lt;p&gt;1，取出数据的时候需要注意&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults]; NSMutableArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arraySaveData &lt;span style="color:#f92672"&gt;=&lt;/span&gt;[saveDefaults objectForKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;OhSaveData&amp;#34;&lt;/span&gt;]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//NSMutableArray *arraySaveData=[NSMutableArray arrayWithArray:[saveDefaults objectForKey:@&amp;#34;OhSaveData&amp;#34;]];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二句代码是通过一个文件名获取你存储的数据，返回数据数组，但是！一定要注意这里返回的数据数组是不可修改的！及时你将读取的数据赋给一个可修改的数组中也一样无法修改其中的数据，所以如果你想将取出的数据进行修改那么这里需要要使用第三行代码来获取&lt;/p&gt;
&lt;p&gt;2，修改已经的存储文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NSUserDefaults &lt;span style="color:#f92672"&gt;*&lt;/span&gt;saveDefaults &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [NSUserDefaults standardUserDefaults]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[saveDefaults setObject:arraySaveData forKey:&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;已经存在的文件名&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>iOS开发是否应该使用ARC</title><link>https://zhangdapeng.dev/p/ios-kai-fa-shi-fou-ying-gai-shi-yong-arc/</link><pubDate>Tue, 03 Jun 2025 16:43:01 +0000</pubDate><guid>https://zhangdapeng.dev/p/ios-kai-fa-shi-fou-ying-gai-shi-yong-arc/</guid><description>&lt;p&gt;关于ARC的介绍文章网上已经很多，苹果的官方文档也不少。担心使用ARC会带来问题的同学主要的理由有以下5点:&lt;/p&gt;
&lt;p&gt;1.担心这个技术方案不靠谱。苹果大多数时候的技术方案都是比较靠谱的，但也有一些技术方案有很多坑，例如storyboard。&lt;/p&gt;
&lt;p&gt;2.原有的项目在非ARC环境下运行良好，担心迁移成本或引入新的问题。&lt;/p&gt;
&lt;p&gt;3.苹果以前手工管理内存需要非常小心，稍微不注意应用程序就崩溃了。有过这段经历的iOS开发老手，心里上还是觉得自己手工管理内存更踏实一些。&lt;/p&gt;
&lt;p&gt;4.使用ARC需要了解ARC的一些细节，还需要引入_bridge等新的关键字，学习成本还是有的。&lt;/p&gt;
&lt;p&gt;5.以为ARC只能支持iOS5.0以上（这是非常大的误解）。&lt;/p&gt;
&lt;p&gt;对于上面提到5点问题，我认为相应的回答如下:&lt;/p&gt;
&lt;p&gt;1.ARC是WWDC2011大会时提出的技术，离现在已经快2年了，而且苹果现在将MacOS上的垃圾回收机制废弃(Deprecated)，采用ARC替代，无疑证明了ARC是成熟的了。&lt;/p&gt;
&lt;p&gt;2.确实有一些迁移成本，但苹果在Xcode中专门集成了迁移工具，成本已经非常小了。如下图就是Xcode集成的将非ARC工程转换成ARC工程的工具。另外，为了兼容第三方的非ARC开源库，你也可以在工程中随意使用编译参数：-fno-objc-arc ,这个参数允许对部分文件关闭ARC。&lt;/p&gt;
&lt;p&gt;3.手工管理内存虽然踏实，但是泄露很容易发生。常常开发完成后，需要使用Instruments来检测泄露。但用了ARC后，基本不会出现泄露了，我在 开发粉笔网iPhone客户端时，由于使用了ARC，花三个月开发完的应用，用instruments检测后，没有发现任何内存泄漏问题。这在没有使用 ARC的工程中是不可想象的。&lt;/p&gt;
&lt;p&gt;4.确实有学习成本。但是非常值得学习，能省不少开发精力。&lt;/p&gt;
&lt;p&gt;5.虽然ARC是与iOS5一同推出，但是由于ARC的实现机制是在编译期完成，所以使用ARC之后App仍然可以支持iOS4.3。稍微需要注意的是， 如果要在ARC开启的情况下支持iOS4.3，需要将weak关键字换成 __unsafe_unretained，另外还有一些细节需要处理&lt;/p&gt;
&lt;p&gt;所以，希望大家都能在项目中使用ARC，一旦你感受到它带来的好处，你就离不开它了。它也能让你从繁琐的内存管理代码中解放出来，将精力更多关注于代码结构、设计模式而不是底层的内存管理。&lt;/p&gt;</description></item></channel></rss>