Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩美女一区二区三区,99国产精品久久,日韩精品在线播放

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          從零搭建react-native開發環境-避坑指南

          從零搭建react-native開發環境-避坑指南

          最近前同事問我react-native方面的問題,幾年前我粗略地學習過react-native的開發,時至今日,差不多又還回去了。于是就搜索react-native方面的文章看??吹竭@篇文章,對評論區一個掘友的留言很好奇,這款用react-native開發的仿掘金APP的應用,界面到底長什么樣子?文中的作者并沒有截屏展示。于是打算把文中的項目下載下來,運行一下,看看效果。過程沒有我想得那么順利,一波三折,踩了一些坑,好在最后跑起來了,在Android Studio模擬器中的運行效果如下圖所示?,F在我們回溯一個過程,把遇到的問題的解決方法給大家分享一下。

          創建項目

          npx react-native init react-native-junjin

          生成的目錄結構如下圖所示:

          react-native-junjin/
          ├── __tests__/                // 測試目錄,包含測試文件
          ├── android/                  // Android 項目的原生代碼
          ├── ios/                      // iOS 項目的原生代碼
          ├── node_modules/             // Node.js 模塊目錄,包含所有依賴包
          ├── .eslintrc.js              // ESLint 配置文件,用于 JavaScript 代碼風格檢查
          ├── .gitignore                // Git 忽略文件配置
          ├── .prettierrc.js            // Prettier 配置文件,用于代碼格式化
          ├── .watchmanconfig           // Watchman 配置文件,用于監視文件變化
          ├── App.tsx                   // 主要的 React 組件文件,使用 TypeScript 編寫
          ├── app.json                  // 應用的配置文件
          ├── babel.config.js           // Babel 配置文件,用于 JavaScript 轉譯
          ├── index.js                  // JavaScript 入口文件,注冊根組件
          ├── metro.config.js           // Metro bundler 配置文件
          ├── package.json              // 項目的包管理配置文件,定義項目依賴及腳本
          ├── README.md                 // 項目說明文件
          ├── yarn.lock                 // Yarn 鎖定文件,確保依賴版本一致
          ├── .bundle/                  // 這個文件夾通常包含打包配置和緩存,用于優化打包過程
          ├── Gemfile                   // Ruby 的依賴管理文件,,通常與 CocoaPods 一起使用,以管理 iOS 項目的依賴。
          ├── jest.config.js            // Jest 配置文件,用于測試設置
          ├── tsconfig.json             // TypeScript 配置文件
          └── .yarnrc.yml               // Yarn 配置文件,定義 Yarn 的行為

          別的文件都好理解,對于初學者,可能不知道Metro和Gemfile是干什么的。

          Metro 是 React Native 項目中開發工具鏈的重要組成部分。Metro 是 React Native 的 JavaScript 打包器,將所有的 JavaScript 文件打包成一個或多個文件,以便應用程序可以在設備或模擬器上運行。它會解析項目中的依賴關系樹,將所有依賴項捆綁在一起,生成一個高效的包。它具有快速增量構建、熱重載和代碼拆分等功能使得開發過程更加高效和便捷。項目的根目錄下有一個 metro.config.js 文件,用于配置 Metro 的行為。這個文件可以包含如下配置:

          • Transformer 配置:指定如何轉譯文件。
          • Resolver 配置:定義如何解析模塊路徑。
          • Cache 配置:配置緩存的行為。
          • Server 配置:配置開發服務器的選項。

          配置示例:

          module.exports={
            transformer: {
              babelTransformerPath: require.resolve('react-native-typescript-transformer'),
            },
            resolver: {
              sourceExts: ['jsx', 'js', 'ts', 'tsx'], // 支持的文件擴展名
            },
          };

          Gemfile 在一個 React Native 項目中,Gemfile 通常用于管理 iOS 開發所需的 RubyGems。RubyGems 是 Ruby 的包管理系統,Gemfile 的主要作用是列出項目所依賴的所有 gems(RubyGems所管理的包或者依賴,我們稱之為 gem),并確保在不同環境下這些依賴項的一致性,其中一個比較重要的gem是 CocoaPods,這是一個流行的依賴管理器,用于管理和集成 iOS 項目的第三方庫。

          一個典型的 Gemfile 文件結構如下:

          # 指定 gem 的源,這通常是 `https://rubygems.org`,這是官方的 RubyGems 倉庫
          source "https://rubygems.org"
          
          # 指定 Ruby 版本
          ruby ">=2.6.10"
          
          # 指定項目所需的 gem 及其版本
          gem 'cocoapods', '>=1.13', '< 1.15'
          gem 'activesupport', '>=6.1.7.5', '< 7.1.0'
          
          # 可以定義不同的組,例如開發環境和測試環境
          group :development, :test do
            gem "rspec"
          end
          

          安裝Android開發工具鏈

          先介紹一個檢測工具react-native doctor ,它是 React Native 開發環境中一個非常有用的命令行工具,能幫助開發者檢測和修復本機系統中的各種開發工具和依賴項,確保安裝正確且版本合適。會檢查 Node.js、yarn, Metro,JDK,Android Studio、Android SDK,Xcode 以及其它相關工具,并提供自動修復問題的選項。如果 doctor 無法自動解決問題,它將顯示消息和鏈接,說明如何手動修復此問題。

          執行下面的命令,就會開始檢查React Native開發依賴的大多數軟件和工具是否正確安裝且版本正確

          npx react-native doctor

          這是檢查結果,因為筆者已經安裝好了各種軟件和工具,所以只有一項是打叉的。這一項打叉是因為沒有在Android Studio中啟動模擬器。

          要在PC端運行一下Android應用,如果你是初學者,百分之百會遇到一些跟Android平臺相關的專業名詞如JDK、Android Studio,Android SDK,Gradle、Gradlew,不知道這些名稱概念的含義的話,就算效果運行正確,也不代表你會了。別人對你談起這些名詞,你會感覺一頭霧水,不知所以然, 無法與別人交流。所以我們先夯實一下基礎,了解一下這些名詞概念。

          在 React Native 和 Android 開發中,JDK、Android Studio、Android SDK 和 Gradle 是幾個核心組件,它們之間相互關聯,為開發和構建 Android 應用提供完整的支持。它們各自的功能和彼此的關系如下:

          JDK (Java Development Kit)

          • 功能:JDK 是開發 Java 應用的核心工具包,包含了 Java 編譯器(javac)、Java 運行時環境(JRE)以及其他工具。
          • 關系:JDK 是編譯和構建 Android 應用的必要工具,因為 Android 應用開發和 Gradle 構建工具需要使用 Java 編寫的腳本和配置文件。

          Android Studio

          • 功能:Android Studio 是 Android 應用開發的官方集成開發環境(IDE),提供了代碼編輯、調試、測試和構建等一站式解決方案。
          • 關系:Android Studio 包含了 Android SDK、Gradle 插件和其他開發工具,簡化了應用開發和構建過程。它也需要依賴 JDK 來運行和編譯項目。

          Android SDK (Software Development Kit)

          • 功能:Android SDK 提供了開發 Android 應用所需的所有工具和 API,包括模擬器、調試工具和平臺庫。
          • 關系:Android SDK 是 Android Studio 的一部分,但也可以獨立安裝。開發者通過 Android SDK 訪問設備和平臺功能,在應用中使用這些功能。

          Gradle and Gradlew

          • Gradle
            • 功能:Gradle 是一個靈活的構建自動化工具,主要用于項目構建、依賴管理和部署。它支持多種編程語言和項目類型。
            • 關系:在 Android 開發中,Gradle 通過 Android 插件支持編譯、打包和測試應用。Gradle 腳本(build.gradle)用于定義項目的構建邏輯和依賴項。
          • Gradlew (Gradle Wrapper):
            • 功能:Gradlew 是 Gradle 的包裝器,確保項目使用特定版本的 Gradle 構建,而不依賴于系統中安裝的 Gradle 版本。
            • 關系:Gradlew 提供了跨平臺一致的構建環境。它與項目一起分發,使任何開發者都能使用正確版本的 Gradle 構建項目,而無需手動安裝 Gradle。

          總結一下就是:

          • JDK:提供 Java 編譯和運行環境,是構建 Android 應用的基礎工具。
          • Android Studio:集成開發環境,包含了 Android SDK 和 Gradle 插件,簡化了開發和構建過程。
          • Android SDK:包含開發 Android 應用所需的所有工具和 API。
          • Gradle/Gradlew:構建自動化工具,用于編譯、打包和管理項目依賴,Gradlew 確保項目使用特定版本的 Gradle。

          它們共同構成了 Android 應用開發和構建的完整工具鏈,相互依賴且緊密集成。

          環境搭建中遇到的問題

          1.本地運行時,報JAVA_HOME環境變量找不到

          ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

          去Oracle官網,下載win版的jdk安裝包 。注意版本jdk版本,doctor提示jdk的版本必須是>=17,<=20, 去官網一看, 只有22,21,17三個版本可以下載,那只能選擇jdk17。衍生問題-jdk下載過慢。解決方法: 將下載鏈接的協議頭由https改成http,由于下載時默認是https,所以會慢一些,使用http之后會好很多,速度能穩定在400k左右,十分鐘之內就可以下完,速度還可以。另外,配置JAVA_HOME環境變量的時候,路徑后面不能帶bin。

          2. Android Studio軟件在國內無法下載

          安裝Android Studio時,直接搜索Android Studio下載地址,去官網下載,發現國內用戶直接下載不了。訪問這個地址,界面的語言默認是英文,卻可以正常下載,默認打開的Android Studio頁面語言是中文的話,就下載不了。莫非是美國佬不讓大陸開發者使用Android Stduio.

          3.找不到模擬器Failed to launch emulator. Reason: No emulators found as an output of emulator -list-avds?

          安裝好Android Studio之后,需要創建一個模擬器。就不會報這個錯誤了。Android模擬器查看和啟動方法

          emulator -list-avds
          emulator -avd 模擬起名稱

          4.JDK已安裝,用react-native doctor檢查的時候,報未安裝

          用 java -version命令查看發現返回為空,是因為安裝了兩個版本的JDK所致。一個是本次在Android Studio安裝中,一個是以前手動安裝的。要刪除一個。刪除jdk時,搜索的應用名稱應該是Java,此外,手動刪除JDK的安裝目錄文件,是不行的,必須用系統的軟件卸載功能進行卸載。

          5. Android Studio已安裝,執行react-native doctor命令,提示未安裝

          安裝Android Studio時不要自定義安裝路徑,安裝到默認路徑。

          6. 執行react-native run-android,拋錯 Exception in thread "main" java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-8.6-all.zip failed: timeout (10000ms)?

          出現這個報錯是因為下載gradle-8.6-all.zip包超時引起的,可以修改一下項目根目錄下的 android\gradle\wrapper\gradle-wrapper.properties文件配置,把gradle的下載路徑改成本地路徑,然后手動下載這個壓縮包,放到配置的本地路徑中。

          distributionUrl=gradle-8.6-all.zip

          7. 運行拋錯java.io.UncheckedIOException: Could not move temporary workspace (項目路徑XXX\android\.gradle.6\dependencies-accessors3f0288fa7dffe069445ffa4b72952b4629a15a-c90c8f8d-2e55-4686-acd5-6452418d6048) to immutable location (項目路徑XXX\android\.gradle.6\dependencies-accessors3f0288fa7dffe069445ffa4b72952b4629a15a)

          這個錯誤的意思是在 Gradle 構建過程中,嘗試將臨時工作空間移動到最終位置時出錯,錯誤原因通常與文件系統權限或路徑問題有關。默認配置下載的gradle-8.6-all.zip會報這個錯誤,將gradle工作包降級為gradle-8.5-bin.zip后,此問題消失。

          distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip

          8. 卸載Android Studio之后,再次安裝打開后,不提示SDK安裝彈窗,手動安裝SDK的方法

          操作菜單路徑 File==> Settings==> Languages & Frameworks==>Android SDK==>Edit,如下圖所示。

          SDK安裝目錄為:

          C:\Users\Administrator\AppData\Local\Android\Sdk

          9. 報配置文件中引用的@react-native-community/cli-platform-android @react-native/gradle-plugin npm包不存在

          如果用pnpm安裝會出現這個問題,用yarn安裝則不會,因為yarn會安裝自動隱式依賴。

          Settings file 'D:\juejin-main\android\settings.gradle' line: 2 apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) Could not read script '項目路徑\node_modules@react-native-community\cli-platform-android\native_modules.gradle' as it does not exist.

          補充安裝這兩個包

          pnpm add -D  @react-native-community/cli-platform-android @react-native/gradle-plugin

          10. NDK(Native Development Kit)未安裝報錯

          What went wrong: A problem occurred configuring project ':react-native-screens'. [CXX1101] NDK at C:\Users\Administrator\AppData\Local\Android\Sdk\ndk.1.10909125 did not have a source.properties file

          Android NDK(Native Development Kit)是一個工具集,允許開發者使用 C 和 C++ 代碼來構建 Android 應用程序的一部分。NDK 提供了構建和打包原生代碼的工具和庫,幫助開發者創建高性能的應用程序,尤其是在涉及到計算密集型任務時,如游戲、圖形處理和信號處理等。

          通過 Android Studio 安裝 NDK,操作步驟:

          1. 打開 Android Studio。
          2. 選擇 SDK Manager(工具欄上的小安卓圖標)。
          3. 在 SDK Manager 中,選擇 SDK Tools 選項卡。
          4. 勾選 NDK (Side by side) 和 CMake。
          5. 點擊 Apply 并等待下載和安裝完成。

          注意下載版本要與報錯的NDK版本保持一致。

          11. 運行react-native run-android,發現會下載許多jar包,如果某個jar包下載超時,就會導致程序中途退出。

          解決方法:修改項目下的android\build.gradle項目依賴項的像源地址。添加阿里云鏡像地址,并配置在前面,優先使用。

          buildscript {
              // 定義了 Gradle 構建腳本所需的依賴項應該從哪些存儲庫中獲取。常見的存儲庫有 `google()` 和 `mavenCentral()`。
              repositories {
                
                  maven { url "https://maven.aliyun.com/repository/public" }
                  maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter" }
                  maven { url "https://maven.aliyun.com/nexus/content/repositories/google" }
                  google()
                  jcenter()
                  mavenCentral()
              }
              // ...
          }
          
          allprojects {
              // 定義了所有子項目在解析依賴項時使用的存儲庫
              repositories {
                  maven { url "https://maven.aliyun.com/repository/public" }
                  maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter" }
                  maven { url "https://maven.aliyun.com/nexus/content/repositories/google" }
                  google()
                  jcenter()
                  mavenCentral()
              }
          }
          apply plugin: "com.facebook.react.rootproject"

          最后

          沒動手實踐之前,本以為依葫蘆畫瓢,能很快把效果做出來。實際在做的時候,發現自己把這件事想得簡單了。在運行項目的過程中,出現了許多報錯,上面的這些問題我把解決方法都記錄下來了,有些也遺漏了。我踩過的坑,希望你看完這篇文章之后,就不要再重蹈覆轍了。這樣才能體現出你閱讀本文的價值。還有就是看完一篇技術文章,不能看一看就覺得自己會了,最好動手做一做。有許多潛在的技術問題在看的過程中是無法暴露出來的,你以為你會了,實操的時候還是會遇到一大堆問題,平時有時間的話要提前掃雷, 這樣將來遇到相關問題時就不會手忙腳亂。




          原文:https://juejin.cn/post/7382891974942048282

          息的怎樣了?是否已經迫不及待的想要繼續新的學習了呢?

          好吧,接下來我們就做點實際的事情。

          添加其它控件

          到目前為止,我們的界面上只有以背景和一個按鈕,接下來還是添加一些其它界面控件吧。下面是我們所創建的界面的最終效果。

          如你所見,我在部分標簽處放了一些占位用的數值(比如999)。之所以這樣做,是為了方便查看標簽實際使用時在界面上的顯示效果。玩家的得分可能會非常高(永遠不要低估或高估玩家的智商~),因此最好預留足夠的空間。

          好了,現在該你自己出手了。如果你是個設計人員,相信你會喜歡下面的操作。打開Main.storyboard,嘗試從Xcode的對象庫拖曳不同的控件放到視圖上。也不用那么精確。

          實際上,要添加的三種界面元素是Label,Button和Slider。

          需要注意的是,在這些標簽里面我放了一些占位用的標簽(比如999999),這樣是為了預留足夠多的空間,以便玩家實際體驗的時候有足夠的發揮空間~

          為了調整界面中UI控件元素的設置,我們需要用到所謂的Attributes inspector。我們可以在Xcode的右側面板中找到該視圖,也就是Inspector(檢視)視圖。

          Inspector(檢視)視圖中會顯示所選中的視覺元素的各種屬性,其中Attributes inspector可以用來更改表情的背景顏色,或是按鈕上的文字大小。另外我們之前曾在Connections inspector視圖中檢查按鈕的動作方法連接。當你逐漸熟悉Interface Builder之后,可能會用到各種Inspector視圖。

          提示:

          1.需要注意的是,類似”i”形狀的界面元素其實也是一個Button,只是需要把它的類型設置為Info Light。

          2.如何設置滑動條的數值。

          選中Slider,切換到Attributes Inspector,把它的最小數值設為1,最大數值設為100,當前數值設為50.

          當你完成以上操作后,界面已經有了12個用戶界面元素:1個滑動條,3個按鈕,還有一堆標簽。怎么樣,很有成就感吧。

          點擊Run運行應用,然后好好玩上一會兒。除了之前的按鈕,其它控件現在還做不了具體的事情,不過起碼你可以拖著滑動條來回玩。

          到目前為止,我們已經完成了界面的基本布局,而且不需要寫一行代碼。如果你是一個設計師,肯定要為此歡呼雀躍。可惜好日子到頭了,很快我們就需要使用Swift編寫代碼讓這些控件變得可交互。

          喬幫主到目前為止對你的工作還比較滿意,暫時沒有召喚你去天國猛批一頓的意思。

          不過按照他一向的完美標準,你還有很多工作要做。

          讓滑動條變得可交互

          在我們to-do list上的下一個待辦項目是:當玩家觸碰按鈕時讀取滑動條上的數值。

          如果你在Interface Builder的時候沒有故意搞一些麻煩,比如裝作不經意間把按鈕和showAlert動作的關聯取消,那么此時就可以更改代碼讓應用在彈出警告框中顯示滑動條的數值。(如果你的確取消了按鈕到動作的關聯,那么首先需要再次將其關聯起來。)

          還記得如何在視圖控制器中添加一個動作,從而讓它可以識別用戶對按鈕的觸碰嗎?對于滑動條我們可以做同樣的事情。一旦用戶拖曳滑動條的手柄,就會觸發這個動作。

          要實現這一切,跟之前的操作幾乎完全相同。

          首先在Xcode中點擊ViewController.swift,然后在最后一個花括號前面添加下面的代碼:

           @IBAction func sliderMoved(_ slider: UISlider){
           print("滑動條的當前數值是: \(slider.value)")
           }
          

          再次強調:輸入代碼的時候一定要注意全角和半角的切換,特別是代碼中既有中文又有英文的時候,要切記代碼一律用半角,要打印或輸出的中文(包含標點)才用全角。這個問題是新手開發者甚至是部分老手很容易犯的錯誤。

          注意到此時@IBAction func sliderMoved(slider:UISlider)這行代碼的左側有個空心圓,代表它還沒有跟storyboard中的界面元素關聯起來。

          此時在Xcode中點擊Main.storyboard,按住Ctrl鍵不放,點擊鼠標左鍵從視圖中的slider滑動條上拖一條線到對象面板(Outline pane)的View Controller(注意不是View Controller Scene)上,然后從彈出菜單中選擇sliderMoved:。

          此時如果你通過Xcode右側的面板切換到Connections inspector,就可以看到sliderMoved:動作和滑動條的Value Changed事件關聯在一起。

          這就意味著每當滑動條的數值發生變化時(用戶拖動滑動條),就會調用sliderMoved()方法。

          再次提醒大家,在Interface Builder的canvas左側,是所謂的Document Outline,其中列出了當前視圖中的所有視覺元素。

          記住,如果你看不到Document Outline,可以點擊Xcode窗口底部的小圖標來顯示:

          現在點擊Run運行游戲,然后拖動滑動條看看反應。

          一旦你開始拖動,Xcode窗口會在底部打開一個新面板,也就是傳說中的Debug Area(調試區),然后顯示下面的信息:

          如果你把滑動條拖到最左邊,會看到上面顯示的數值變成1.0,如果拖到最右邊,那么顯示的數值變成100.0.

          print()函數可以幫忙我們了解應用的邏輯是否正常。它的作用就是在Debug調試區顯示一條文本信息。這里我們用它來驗證滑動條是否和指定的動作關聯在一起。在我每次要添加新的功能前,我都會用print()來確保之前一切都OK.

          提醒:

          你是否注意到sliderMoved:方法的名稱后面有一個冒號,而showAlert卻沒有?這是因為sliderMoved:方法有一個參數slider,而showAlert則沒有任何參數。如果某個動作方法有一個參數,那么Interface Builder就會在名稱后面添加一個冒號。很快我們就將了解更多關于參數的問題。

          科普時間

          好了,馬上又要到科普時間了。這樣免得你太累,不過如果還是那句話,如果你對理論知識無愛,可以跳過去無視。

          首先我們來科普幾個東西,所謂的iOS開發,App Store,Mac開發,Xcode,Objective-C, Swift,Cocoa, Cocoa Touch究竟是什么關系。

          在我初學蘋果開發的時候,經常把這些東西搞混,因為早期的各種編程書籍中既有iOS開發,又有Objective-C開發,還有Cocoa 開發。

          程序猿最NB之處,同時也是最讓人討厭的地方就是,喜歡用各種術語,各種縮寫讓你覺得自己是個白癡。雖然我們的目標不是成為最NB的程序猿,但了解一些相關的開發術語沒有壞處。

          我并不指望你一下子就看懂它們的真正用處和區別,但起碼先留下點印象,然后在后面的教程中再逐步熟悉。對于教程中的其它抽象概念,哥也是類似的做法,先簡單介紹,然后讓你反復接觸,直到徹底進入你的盜夢空間。

          iOS開發,在2010年推出iPad之前其實就是iPhone開發。所以很多早期的iOS教程都寫的是iPhone應用開發。相信大家都知道2007年macworld上幫主的那次驚天地泣鬼神的神級演講,如果沒看過的強烈建議去重溫一下,絕對是我心目中商業產品發布演講中無可爭議的第一。

          2008年前第三方只允許開發Safari上的網頁應用。2008年開始,蘋果在當時的SVP Scott Forstall的帶領下向開發者正式推出了iPhone SDK,并直接打造了一個完整的生態系統。

          2010年幫主發布了耶穌之本iPad,同年的WWDC上將iPhone OS更名為iOS。iOS基于Mac OS X系統開發,但針對移動設備特有的硬件特性做了大量的改善和優化。

          如今的iOS開發泛指針對所有安裝了iOS操作系統的設備(當然只限蘋果生產)開發應用或游戲。主要包括:iPhone全系列,iPod touch全系列,iPad全系列。當然,相信還在用iPod touch的童鞋已經不多了,這又是一條注定會消失在歷史中的產品線~

          目前除了iOS,還有了針對Apple Watch的Watch OS,還有針對Apple TV的TV OS,不過它們都是基于iOS衍生而來的~

          App Store,顧名思義就是蘋果賣針對iOS設備上應用和游戲的軟件商城。

          Mac開發,指的是開發Mac操作系統下的應用和游戲軟件。在iOS和App Store取得了巨大的成功后,蘋果把iOS的一些成功特性開始反哺給Mac操作系統,同時在2011年推出Mac版的 App Store。

          不過目前看來Mac開發并沒有吸引足夠多的開發者。也沒有多少非常成功的案例。

          Cocoa和Cocoa Touch上一次的內容中提過,同樣是編程環境,一個用于Mac開發,一個用于iOS開發。

          Swift和Objective-C屬于編程語言,和C,C++,Java,C#,Javascript,PHP,Python,Ruby等相似。

          Xcode是Mac 平臺下的軟件開發環境,可以開發Mac和iOS應用。

          如果和其它開發平臺做一下對比,可能很多人就明白了。

          Xcode類似于Visual Studio或者Eclipse

          Swift和Objective-C類似于C,C++,Java,C#這些開發語言,

          Cocoa 和Cocoa Touch 類似于微軟開發中的MFC或.NET.

          Swift/Objective-C和Cocoa/Cocoa Touch的關系類似于C++和MFC,或者C#和.NET的關系。

          繼續科普-什么是字符串

          在剛才的print()那行代碼里,我們用到了這樣的一個東西,

          "滑動條的當前數值是: \(slider.value)"
          

          這就是個字符串,到目前為止我們已經用了好幾個類似的東西。比如UIAlertController(提示對話框)里面的就是字符串。

          通常來說,這樣一連串的文字被成為字符串,因為我們可以把文字看做字母,數字,標點符號的一個序列,就好像用串在一起的珠子。

          在我們開發應用的過程中,將會大量使用字符串,所以很快你就會熟悉它的用法。

          在Swift里面,為了創建一個字符串,只需要把文字放到雙引號里面就好了。這個@符號很重要!如果你之前用其它的編程語言寫過代碼,或許在生成字符串的時候可以使用雙引號或單引號(比如python),但是Swift只能使用雙引號。

          而且很重要的一點是你必須使用半角輸入,不要使用中文輸入法的全角雙引號。

          總結一下:

          // 在Swift 中正確使用字符串的方法:

          "I am a good string"

          // 下面都是錯的:

          'I should have double quotes'

          ''Two single quotes do not make a double quote’'

          “My quotes are too fancy”

          @"I am an Objective-C string"

          在print()這行代碼里面,用到的字符串是"滑動條的當前數值是: \(slider.value)”

          所有在符號 \(…)之間的字符串都是特殊的占位符。

          比如下面的這個占位符:"滑動條的當前數值是:: X”,這里的X將被滑動條的數值所替代。

          讓變量來幫忙

          在調試面板中用print()打印信息對于開發和測試非常有用,不過玩家對這種消息可是毫無興趣。因此讓我們來改進一下這個動作方法,讓它在一個提示對話框里面顯示滑動條的數值。那么我們該如何把滑動條的數值送給showAlert()呢?

          當我們在sliderMoved()中讀取滑動條的數值時,一旦這個動作方法結束,這個數據信息也就丟失了。我們需要記住這個數據,直到玩家觸碰了按鈕為止。

          幸運的是,Swift(其它語言也是)為我們提供了一個很好的工具-變量。

          在Xcode中打開ViewController.swift,在class ViewController這行代碼的下面添加一行代碼:

          var currentValue: Int=0
          

          添加完成后的代碼如下:

          import UIKit
          class ViewController: UIViewController { 
           var currentValue: Int=0 //定義了一個變量
           override func viewDidLoad() {
           …
           }
           override func didReceiveMemoryWarning() {
           …
           }
           @IBAction func showAlert(){
           …
           }
           @IBAction func sliderMoved(slider: UISlider){
           …
           }
          }
          

          注意:上面唯一添加注釋的代碼是剛剛新添加的代碼,其它一切都保持不變。省略號…其實就是之前的代碼內容,千萬不要以為哥把那些代碼都刪掉了。如果你不確定的話,最簡單的方式就是參考本章的參考項目源代碼,對比下就知道了~

          現在我們就添加了一個名為currentValue的變量到視圖控制器中。變量被添加到方法的上面,通常我們需要讓這行代碼縮進顯示,使用tab鍵或者用空格鍵。

          至于使用兩個空格還是4個空格取決于你的個人習慣,我們可以通過Xcode的偏好設置來設置這一點。在Xcode的頂部菜單中點擊Xcode -Preferences..-Text Editing,然后跳轉到Indentation選項卡即可。

          還記得幫主當年的話嗎?由內到外都要美。哪怕是代碼的縮進顯示這樣小的細節,以后也會給你節省很多時間,讓你讀代碼沒那么累。更重要的是,真正的美,由內到外。

          很多偷懶的程序猿在這方面都過于隨意,我毫不奇怪他們的代碼里面經常會出現各種bug。這個無關技術,和心態有關。用心做,才能成為食神;用心演,才能成為喜劇之王~

          很多事情談不上需要多高深的技巧,談不上拼爹和干爹,談不上苦逼和潛規則,唯用心與否而已。

          在之前的教程中曾提過視圖控制器,或是任何一個對象都有自己的數據和功能。

          showAlert()和sliderMoved()動作就是功能的典型例子,而currentValue變量則是數據的一部分。

          通過使用變量,可以讓我們的應用擁有記憶。你可以把變量看做是存儲某個數據的臨時儲物箱。正如儲物箱有各種類型和尺寸的一樣,數據也五花八門。

          你不能把東西扔到儲物箱里面然后撒手不管,因為經常會放入一些新的東西。當你的應用需要記住一些變化時,就需要把舊的數據拿出來,然后把新的數據放進去。

          這就是變量(variable)的本質-變(vary)。比如說,每次玩家拖動滑動條的時候,我們都會使用滑動條的當前位置來更新currentValue。

          儲物箱的大小和變量可以保存的數值種類由datatype(數據類型)決定。這里我們指定currentValue這個變量的數據類型為Int(也就是integer),意味著儲物箱里面可以放入整數(又稱為integer),范圍在正負20億之間。Int是最經常用到的數據類型,不過很快我們會接觸到其它的類型。

          變量就象小孩的玩具積木一樣:

          我們需要把正確的形狀放到正確的儲物箱里面。儲物箱就是變量,而它的數據類型(datatype)決定了里面能放什么形狀的東西。形狀就是你可以放入變量的可能數值。

          我們可以隨后更改每個箱子里面的內容,可以拿出藍色的方塊積木,放進紅色的方塊積木,但前提是它們都是方塊形狀的。你不能把方塊積木放到一個圓孔里面去:數值的數據類型和變量的數據類型必須是匹配的。

          剛才也說了,變量是一個臨時的儲物箱。既然是臨時,那么能保存多久呢?每個變量都有自己的生命周期(或者叫scope,術語狗滾粗),它的生命長短取決于你在程序的哪個位置定義變量。在這里,currentValue的聲明和它的擁有者一樣長,它的擁有者是ViewController。它們的命運交織在一起。在這里,只要我們不退出應用,這個視圖控制器,還有currentValue就會活著。當然,很快我們就會了解到壽命很短的變量。

          在程序這樣一個虛擬世界中,每個變量,每個視圖控制器都是一個虛擬的生命。世界毀了,所有的生命都會消亡。世界沒有毀,有的生命也會消亡。這方面似乎可以和人類與宇宙的關系類比。

          八卦時間:

          剛才在談到變量的時候,舉了個例子,說是’不能把方塊積木放到一個圓孔里面去’,英文原文是,you can’t put a square in a round hole

          這讓我想到了蘋果著名的品牌廣告Think Different的臺詞,人跟變量終究還是不同的。

          變量不能做到隨心所欲不逾矩,而人需要與眾不同。

          Think Different

          Here's to the crazy ones.獻給狂放不羈的一群人

          The misfits. 他們是:不和主流的怪才

          The rebels. 叛逆傳統的勇士

          The troublemakers. 制造麻煩的一小撮

          The round pegs in the square holes. 方鑿圓枘、特立獨行

          The ones who see things differently. 他們觀察問題與眾不同

          They are not fond of rules. 他們不喜歡條條框框

          And they have no respect for the status quo. 更不把正統放在眼里

          You can quote them, 你可以引用他們,

          disagree with them, 也可以否決他們,

          glorify or vilify them. 贊揚或是詆毀他們

          About the only thing you can't do, 但只有一件事你不能做

          is ignore them. 那就是漠視他們

          Because they change things. 因為他們改變了事物

          They push the human race forward. 他們推動了人類的進程

          And while some see them as the crazy ones, 雖然有些人把他們當作瘋子

          We see genius. 但我們看見的卻是天才

          Because the people who are crazy enough to think 因為只有那些足夠瘋狂認為

          they can change the world, 可以改變世界的人

          Are the ones who do. 才能真正做到這一點

          本人聯系方式:

          微信:iseedo

          郵件:eseedo@gmail.com

          QQ討論群: 375143733

          示例項目:eseedo/iOSCourse

          如有疑問,請先發送郵件到我的郵箱:eseedo@gmail.com

          我會在收到郵件后盡早答復。

          也可以加微信,但可能不是很合適的答疑途徑。

          另外,為了節省大家的寶貴時間,提高溝通效率,請在提問的時候盡量附上項目源代碼以及以下信息

          1.開發環境(系統版本,Xcode和iOS版本)

          2.問題描述及重現(想實現什么效果,結果是怎樣的,具體涉及到什么操作)

          3.為解決問題所做的努力(做了哪些嘗試,分別是怎樣的結果)

          迎繼續我們的iPhone開發學習,接下來的內容應該是產品和設計人員的最愛-美化界面。

          為了讓玩家得到更好的沉浸體驗,我們必須讓產品的外在和內在一樣美,甚至更美。

          在這部分的內容中,我們將完成三個小的任務:

          1.繼續優化橫屏顯示

          2.使用定制化的UI替代系統默認的界面

          3.添加一個關于界面,來介紹這款應用~

          在本篇內容中,我們首先完成第一個小任務- 優化橫屏顯示。

          還記得我們的to-do list(待辦事務清單)嗎?里面有一條是“讓應用在橫屏模式下運行“。我們已經完成了這一任務,不過還可以進一步的優化。

          在橫屏狀態下運行的應用不會顯示IPhone的狀態欄,除非我們強制顯示。這一點會給我們的應用帶來更多的展示空間,這當然是好事。

          不過即便系統會自動隱藏狀態欄,但我們仍然可以改進這款游戲處理狀態欄的方式。

          在Xcode中點擊TARGETS下面的BullsEye,并在General設置的Deployment Info中找到Status Bar Style,然后勾選Hide status bar。

          當應用運行時隱藏狀態欄是比較恰當的做法。操作系統需要花上一會兒將應用加載到內存中并將其啟動,在這段時間里狀態欄會保持可見,除非我們通過這個選項將其隱藏。

          雖然這只是一個很小的可能不為人所注意的細節,不過真正偉大的應用和平庸之作的區別就在于這些細節。

          好了,搞定了。

          點擊Run跑一下,會看到游戲界面的狀態欄已經消失了。

          接下來是科普時間,如果你是新手,很可能會看不懂。你可以選擇現在來攻堅,也可以選擇等以后熟悉iOS開發了再深入去了解。

          科普:關于Info.plist文件

          在任何一個iOS應用或游戲中,如同AppDelegate類一樣,都有一個以項目名稱開頭的Info.plist文件,比如這里的Info.plist文件。

          Info.plist是每個iOS應用都會有的配置文件,比如設備的朝向、狀態欄是否在啟動時可見等等,這些信息其實都保存在Info.plist文件中。

          在之前的Xcode版本中,我們經常需要手動來編輯Info.plist文件。不過從Xcode之后基本上不需要這么做了,我們可以直接從剛才的Project Setting界面上完成。

          不過了解下Info.plist的作用倒也沒有什么壞處。

          在Project navigator中找到Info.plist,點擊并查看其中的內容:

          它的內容通常由三列組成,最左邊是Information Property List(屬性列表),中間是Type(屬性值的類型),而最右邊則是Value(屬性值)。

          Info.plist文件其實是一個XML文檔。XML其實就是可擴展性標記語言(extensible markup language),它并非iOS中所特有的,在幾乎任何一種編程語言的使用過程中,我們都會碰到XML文檔。XML是所謂標準通用標記語言(SGML)的子集,其作用是以規范的形式(成對出現的標記)來保存數據。XML與傳統的Access,Oracle,SQL Server, MySQL數據庫不同。傳統的數據庫功能強大,提供了強大的數據存儲和分析能力,而XML僅僅用來存儲數據,需要自行編寫代碼來進行數據的分析和處理。但XML的好處是它超級簡單易用,可以在任何語言編寫的任何應用程序中讀寫數據,已經成了網絡數據交互的唯一公共語言。

          你可能不知道XML文檔,但或許多半聽說過HTML文檔吧。XML文檔只不過是HTML文檔的規范式表達。它們的區別在于,XML的核心是數據內容本身,而HTML的核心是如何顯示數據。

          plist文件的本質就是XML文檔,只不過其中的內容都和iOS應用的相關設置有關。

          在Xcode中右鍵單擊Info.plist,選中open as,選中source code,就可以看到下面的內容:

          很顯然,plist文檔其實就是滿足蘋果DTD標準的XML文檔。

          那么,Info.plist文件中這些鍵值的作用是什么呢?

          這里大概說明一下,更詳細的可以參考蘋果的官方文檔( https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html )

          Localization native development region --- 本地化相關,如果用戶所在地沒有相應的語言資源,則用這個key的value來作為默認.

          Executable file -- 程序安裝包的名稱

          Bundle identifier --- 該束的唯一標識字符串,該字符串的格式類似com.yourcompany.yourapp,如果使用模擬器跑你的應用,這個字段沒有用處,如果你需要把你的應用部署到設備上,你必須生成一個證書,而在生成證書的時候,在apple的網站上需要增加相應的app IDs.這里有一個字段Bundle identifier,如果這個Bundle identifier是一個完整字符串,那么文件中的這個字段必須和后者完全相同,如果app IDs中的字段含有通配符*,那么文件中的字符串必須符合后者的描述。

          設置程序安裝后顯示的名稱。應用程序名稱限制在10-12個字符,如果超出,將被顯示縮寫名稱。

          InfoDictionary Version- Info.plist格式的版本信息

          Bundle name-產品名稱

          Bundle OS Type code-用來標識束類型的四個字母長的代碼,

          Bundle version string, short- 面向用戶市場的束的版本字符串

          Bundle version-應用程序版本號,每次部署應用程序的一個新版本時,將會增加這個編號,在app store上用的。

          Application requires iPhone environment-用于指示程序包是否只能運行在iPhone OS 系統上。Xcode自動加入這個鍵,并將它的值設置為true。您不應該改變這個鍵的值。

          Launch screen interface file base name -啟動界面的文件名稱

          Main storyboard file base name- 一個字符串,指定應用的主storyboard文件名稱

          Required device capabilities-跟設備相關的屬性設置

          Status bar is initially hidden-這個字符串的作用應該很清楚了,就是剛才是否隱藏狀態欄

          Supported interface orientations- 程序默認支持的方向。

          Supported interface orientations(iPad)- 程序默認支持的方向(iPad)。

          好了,又見福利時間。

          本人聯系方式:

          微信:iseedo

          郵件:eseedo@gmail.com

          QQ討論群: 375143733

          不喜歡QQ的童鞋可以加微信,然后進群。


          主站蜘蛛池模板: 日韩精品中文字幕无码一区| 3d动漫精品一区视频在线观看| 日本一区二区不卡在线| 无码少妇一区二区三区| 人妻免费一区二区三区最新| 一区三区三区不卡| 一区二区三区中文字幕| 在线观看国产区亚洲一区成人| 亚洲AV无码一区二区乱子伦 | 乱精品一区字幕二区| 国产激情无码一区二区| 97se色综合一区二区二区| 女人18毛片a级毛片一区二区| 精品视频一区二区观看| 国产精品一区在线播放| 国产SUV精品一区二区88L| а天堂中文最新一区二区三区| 无码精品人妻一区二区三区人妻斩| 精品人伦一区二区三区潘金莲| 天堂一区二区三区在线观看| 国产成人综合精品一区| 91精品福利一区二区三区野战| 国产91精品一区| 麻豆AV一区二区三区| 日韩精品一区二区三区在线观看| 国产suv精品一区二区33| 99偷拍视频精品一区二区| 亚洲人成人一区二区三区| 无码国产精品一区二区免费I6| 国产不卡视频一区二区三区| 亚洲日韩中文字幕一区| 亚洲欧洲∨国产一区二区三区| 国产免费av一区二区三区| 无码人妻精品一区二区三18禁| 精品在线一区二区| 午夜性色一区二区三区免费不卡视频| 精品国产免费一区二区三区 | 国产福利电影一区二区三区,亚洲国模精品一区 | 精品国产日产一区二区三区 | 国产综合精品一区二区三区| 成人丝袜激情一区二区|