這個系列的目錄:html
Swift做爲如今蘋果極力推廣的語言,發展的很是快。這個語言就和她的名字同樣,比OC減小了不少的文件和代碼量。頭文件,bye bye啦,再不用查個代碼上下的頭文件源文件切換了。並且語言自己也增長了不少的安全性的考慮,好比類的初始化個階段的檢查等。不按照規定的寫就不能編譯經過!本文假定你有必定的編程基礎,和必定的Swift基礎。若是木有的話,請看這裏迅速補起。服務器
本文就用Swif寫一個APP,讓各位一塊兒來體會一下Swift究竟是好在了哪裏。爲了簡單,教程會使用Storyboard,而不是手動的添加Controller以及Controller的View的各類視圖。使用Storyboard能夠減小不少的代碼量。這個會在以後的教程中體現出來。任何的視圖跳轉都是按下Ctrl以後的連線,都是Segue。這些標準的跳轉都不用寫一行代碼。網絡
如今的APP,沒有哪一個是孤立的存在在用戶的手機裏的。除了,額,相似於2048這樣的APP沒有明顯的鏈接後臺的服務器,可是,你的位置等信息都傳到了後臺的服務器。因此,咱們的教程還要涉及到網絡鏈接。先用SDK內置的,而後再講解如今十分流行的AFNetworking。框架
這個天氣預報的APP看起來會是這樣的:spa
如今進入正題,建立咱們的項目:3d
選擇一個Single View的模版。而後:代理
以後填寫項目名稱,Swift Weather以及其餘的如,組織名稱等。以後一直下一步,肯定就建立了項目。
這個時候你會看到除了Storyboard竟然會有一個xib文件。這個xib文件不是用來在APP中結合使用ViewController的。而是專門用來適配不一樣個屏幕分辨率的。也就是有了這個叫作LaunchScreen.xib的文件,就不用在每個分辨率下都作一張LaunchImage的圖片了。
這裏有一點須要注意。這個LaunchScreen的nib文件是不能像以前咱們經常使用到的xib文件同樣設置File Owner以後綁定IBOutlet和IBAction的。由於這個nib文件在加載的時候APP尚未加載完成,因此即便綁定了File Owner的ViewControler也是用不了的。
下面咱們開始在Storyboard中穿件不一樣的Scene(對應到一個UIViewController)並把他們鏈接起來。在這以前須要明白咱們的這個APP會如何工做呢?這裏,咱們的比較簡單,不要想成新浪天氣、墨跡天氣。由於,這個是課後做業。看完教程之後由你本身去實現一個相似的活着更好的天氣預報的客戶端。咱們的Demo天氣預報APP相對簡單。用戶打開APP後直接進入APP天氣的主界面查看天氣。以後用戶能夠點擊導航欄左側的「City」按鈕更換城市活着點擊右側的「Refresh」按鈕來實時的刷新天氣數據。
主界面的頭看起來會是這個樣子的:
好的,回到Storyboard上來。首先從右側動Utilities邊欄中拖動一個UINavigationController:
到Storyboard上來,並設定位Initial Controller, 如圖:
拖動一個UINavigationController會自帶一個RootViewController上來。選中這個Controller刪了。咱們要用本身的Controller做爲RootViewController。刪了以後從右側到菜單中選擇一個ViewController,並把鼠標放到UINavigationController上,而後按下Ctrol鍵,用鼠標緩緩的拖一條藍藍的細線到你新家上來的ViewController上。放開Ctrl。在彈出的菜單裏選擇最下面的relationship->rootViewController。鏈接完成以後就會產生一個segue。
這個APP已經能夠運行起來了,按下Command+R,模擬器中就會出現這個APP。雖然如今的界面仍是很簡單的。
基本的結構已經有了,下面添加主界面元素。仔細觀察界面,能夠發現一個規律:
大致的結構是在最上面顯示地點,下面的大太陽是當前的天氣情況,再下面是當前的溫度。在主界面下面的一排小圖是分時段的天氣和溫度。顯示的順序都是時間,當時天氣的圖片和當時的溫度。小的結構都是上面文字,中間圖片,下面又是文字。最大的不一樣在於主界面的大圖部分上面顯示的是地名,而下面分時間顯示天氣部分,顯示的是時間。因此,正題的結構都差不過,從上到下的順序顯示了文字圖片而後文字。先記住這個,在後面會用到這個規律。如今先按照這樣的規律把界面上須要的元素拖動到ViewController的View上。使用快捷鍵Option+Command+L,以後輸入label。你會在右側的邊欄裏出現UILabel這個控件,拖動到View上。其餘的依次都拖動到主界面上。而後在Storyboard中綁定Controller文件。主界面對應的代碼文件是MainViewController,並在代碼中加入各個控件對應的IBOutlet。就像這樣:
@IBOutlet weak var icon : UIImageView! @IBOutlet weak var temperature : UILabel! @IBOutlet weak var loading : UILabel! @IBOutlet weak var location : UILabel! @IBOutlet weak var time1: UILabel! @IBOutlet weak var time2: UILabel! @IBOutlet weak var time3: UILabel! @IBOutlet weak var time4: UILabel! @IBOutlet weak var image1: UIImageView! @IBOutlet weak var image2: UIImageView! @IBOutlet weak var image3: UIImageView! @IBOutlet weak var image4: UIImageView! @IBOutlet weak var temp1: UILabel! @IBOutlet weak var temp2: UILabel! @IBOutlet weak var temp3: UILabel! @IBOutlet weak var temp4: UILabel!
如今就能夠綁定Storyboard的控件和MainViewController中的IBoutlet了。綁定的順序:先、在Storyboard中選中主界面的Scene,2、點一下圈住的地方,這個時候在有邊欄裏就會發現有IBOutlet的一個section裏面就都是咱們剛剛在代碼中定義的屬性。如左圖,有icon這個屬性就是在上面的代碼中有提到的定義的屬性。
綁定的時候把鼠標放到好比icon的後面的小圈圈上面,而後按住Ctrl鍵,拖動鼠標到你要綁定的控件上,放開Ctrl鍵綁定就完成了。就像左圖中的textLabel同樣的效果。點那個小叉叉就能夠斷開控件和代碼中的對應屬性的綁定。
綁定好以後就能夠在代碼中修改這些控件的值等屬性了。綁定好的:
這裏假定你已經把界面的元素都按照主界面樣子擺好了,設定好,而且已經綁定。若是有任何問題,請參考源代碼。
這裏必須提一件事。之因此不少公司的開發都不使用nib文件和如今的storyboard。就是由於,你們也看到了,使用nib或者storyboard文件會有不少的名稱,稍微的修改就可能忘記了什麼地方沒有從新綁定。沒有綁定控件的,運行起來的時候可能就會出現崩潰的狀況。由於,根據key-value的方式存取控件的時候,沒有綁定的找不到。其餘還有不少須要設定名稱的地方還包括IBAction還有Segue等。雖然,Storyboard有這個很差的地方。不過對於我的開發者是切實的減小了代碼量。也大大的提升了開發速度!因此Storyboard的優勢仍是很明顯的。
當所有的控件都擺好以後看起來就是這個樣子的了。
以上的內動幾乎都在說界面的事情了。你會看到還有兩個地方沒有提到。一個是City,一個是Refresh。這兩個按鈕式用來更換城市和刷新數據的。點了City以後彈出界面,用戶能夠選擇一個另外的城市,查看該地的天氣信息。點擊Refresh以後能夠從新獲取當地的天氣數據,並刷新主界面的數據。在City按鈕的界面元素中會涉及到一個「unwind segue」的知識點。比較簡單。放在下面的教程中繼續講解。
我們的天氣都是根據用戶所在的位置來獲取和顯示的。至少在用戶第一次進入APP的時候,APP自動獲取用戶的地理位置信息,並根據這個位置信息訪問服務器信息獲取天氣數據。因此,首要的問題就是後去用戶的地理位置,也就是經緯度。
詳細的關於在iOS8下獲取地理位置的方法能夠看這篇。這裏簡單的說一下。獲取位置信息都是用到CoreLocation框架。在Xcode6中無需再專門的作引入框架的操做。只要在代碼中用import 看框架名稱就能夠。
import UIKit import CoreLocation //獲取地理位置
要獲取用戶的地理位置是須要用戶的贊成的,因此首先須要在代碼中請求用戶的贊成(在iOS8中)。請求用戶的贊成時的文字則必定要在項目的plist文件中配置。這個plist中的配置是必須的!不然,APP運行起來也獲取不了用戶的地理位置。
獲取地理位置的方法和iOS的其餘版本都是同樣的,設定代理,在代理中獲取地理位置,或者處理獲取信息中產生的錯誤。
class ViewController: UIViewController, CLLocationManagerDelegate
上面是實現LocationManagerDelegate,下面是指定代理,設置精度和請求用戶贊成等。
self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest self.locationManager.distanceFilter = kCLLocationAccuracyKilometer if self.locationManager.respondsToSelector("requestAlwaysAuthorization") { println("requestAlwaysAuthorization") self.locationManager.requestAlwaysAuthorization() }
這一句if self.locationManager.respondsToSelector("requestAlwaysAuthorization")是爲了和iOS8以前的系統兼容。
最後看看LocationManager的代理如何獲取地理位置和如何處理錯誤。
//MARK: CoreLocationManagerDelegate func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){ println("get location") var location:CLLocation = locations[locations.count-1] as CLLocation if (location.horizontalAccuracy > 0) { self.locationManager.stopUpdatingLocation() println(location.coordinate) self.textLabel.text = "latitude \(location.coordinate.latitude) longitude \(location.coordinate.longitude)" } } func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { println(error) self.textLabel.text = "get location error" }
這裏的錯誤處理,只是在顯示具體的經緯度的Label中顯示了出錯的文字。爲了更好的用戶體驗,錯誤的提示能夠採用更友好的方法。這裏只簡單說到這裏。
這個APP的第一部分就先介紹到這裏。更多內容會在後面的教程中繼續解說。