日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > [Swift]Day18&19:一個簡單的例子

[Swift]Day18&19:一個簡單的例子

來源:程序員人生   發布時間:2014-12-09 08:10:33 閱讀次數:4404次

Swift90Days - 1個簡單的小利用 

第0步:明確任務

經過前面基礎語法的學習,我們終究可以真槍實彈的來1發了。以這篇小雞雞小貓貓小狗狗為例,我們將會創建1個簡單的利用:

  • 通過 UITableView 展現3種小動物
  • 通過 NSUserDefaults 進行數據持久化
  • 通過 UIWebView 從維基百科加載更多數據

由于時間有限,這篇博客其實不是教程或翻譯,只是1個關鍵思路的整理和記錄,完全的源代碼在文末有鏈接,如果有任何疑問歡迎與我聯系,謝謝。

第1步:創建項目

創建1個新的項目,模板選擇 Single View Application ,項目名稱叫做:BirdsCatsDogs。

第2步:簡單重構

系統為我們自動生成了 ViewController.swift ,將其改成SpeciesViewController.swift ,記得也改下類的名字。然后在 StoryBoard (以后簡稱為 SB 希望不要誤解) 中設置 custum class,如果設置正確在輸入的時候是有自動補全的,回車便可。

第3步:添加導航

拖拽1個 UINavigationController 到 SB 中,設置成 Initial View Controller,然后把 SpeciesViewController設置成它的 root view controller 。把 SpeciesViewController 的 title 設置成 Species 。

運行1下,確保沒有問題。(不可能有問題,這時候候運行1般是滿足自己內心的成績感。)

第4步:加載數據

在這里我們用 NSUserDefaults 加載數據,通常它用來存儲1些系統配置,比如字體大小啊之類的。

我們新建1個 DataManager.swift ,通過單例模式實現1個數據管理器:

import Foundation class DataManager { struct Static { static var onceToken : dispatch_once_t = 0 static var instance : DataManager? = nil } class var sharedInstance : DataManager { dispatch_once(&Static.onceToken) { Static.instance = DataManager() } return Static.instance! } }

這段代碼是原文的代碼,有些地方可以參考:

  • 靜態變量通過內嵌 Static 結構體存儲。
  • 單例模式通過 dispatch_once 實現,通過 sharedInstance 獲得。 (GCD的內容后面再補充)

接下來我們在 DataManager 里面添加1個變量:species,類型為 [String:[String]]。在 init() 里加上1些初始化的工作:

var species: [String:[String]] init() { let userDefaults = NSUserDefaults.standardUserDefaults() if let speciesInfo = userDefaults.valueForKey("species") as? [String:[String]] { species = speciesInfo } else { species = [ "Birds": ["Swift"], "Cats" : ["Persian Cat"], "Dogs" : ["Labrador Retriever"] ] } }

我們可以通過 DataManager.sharedInstance.species 獲得各個種類的數據。

Tips:類似于單例模式這類可能會屢次用到的代碼片斷,建議加到 Xcode 的 Snippets 里。

第5步:加載列表

我們用字典存儲了數據,通過 key 值獲得數據10分方便。但是字典本身是無序的,而像 UITableView 這類列表的數據本身是有序的。所以添加1個計算屬性 speciesList ,可以獲得排序以后的列表并返回:

var speciesList: [String] { var list: [String] = [] for speciesName in species.keys { list.append(speciesName) } list.sort(<) return list }

回到 SpeciesViewController 里,我們可以這樣獲得數據:

var species: [String] = DataManager.sharedInstance.speciesList

第6步:列表視圖

拖拖拽拽設置好 UITableView ,具體進程就不贅述了,可以直接打開項目看看。tableview 相干的部份代碼以下:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell cell.textLabel?.text = species[indexPath.row] return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return species.count }

運行1下,確保沒有問題。(這時候候就不是成績感的問題了,測試 SB 和代碼的連接情況。)

第7步:詳情頁面

我們再創建1個 RacesViewController ,用來展現當前種類下的數據列表:

class RacesViewController: UIViewController { var species: String! override func viewDidLoad() { super.viewDidLoad() title = species } }

注意在 StoryBoard 里設置這個 RacesViewController 的 StoryBoard ID ,這樣我們在做點擊事件的時候可以獲得到這個 RacesViewController 然落后行 pushViewController 操作。

第8步:選中事件

回到 SpeciesViewController 里,添加單元格的選中事件:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) var racesViewController = storyboard?.instantiateViewControllerWithIdentifier("RacesViewController") as RacesViewController racesViewController.species = species[indexPath.row] navigationController?.pushViewController(racesViewController, animated: true) }

instantiateViewControllerWithIdentifier 可以通過 StoryBoard ID 初始化 ViewController 。

第9步:展現種類

這個步驟和第6步基本相同, tableview 相干的代碼:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return races.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("RaceCell") as UITableViewCell cell.textLabel?.text = races[indexPath.row] cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator return cell }

這時候再測試1下,點擊 cell 以后會跳轉到另外一個表格列表里。

 

第10步:保存修改

給 DataManager 加個添加的方法:

func saveData() { let userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.setValue(species, forKey: "species") } func addRace(species inSpecies: String, race: String) { if var races = species[inSpecies] { races.append(race) species[inSpecies] = races } saveData() }

saveData 方法用來寫入本地,addRace 方法供外部調用,添加1條記錄。

第11步:添加按鈕

給導航欄加個 Add 按鈕,并且關聯 didTapAdd 這個 IBAction 。

第12步:彈出視圖

使用 UIAlerView 彈出視圖輸入內容,注意設置 style 為 PlainTextInput ,設置 delegate 為 self 。

@IBAction func didTapAdd() { var alert = UIAlertView(title: "New Race", message: "Type in a new race", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "Add") alert.alertViewStyle = UIAlertViewStyle.PlainTextInput alert.show() }

然后實現 alertView 的拜托方法:

func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { if buttonIndex == 1 { var textField = alertView.textFieldAtIndex(0)! var newRace = textField.text DataManager.sharedInstance.addRace(species: species, race: newRace) var newIndexPath = NSIndexPath(forRow: races.count - 1, inSection: 0) myTableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) } }

這個時候再運行1下測試1下添加功能是否是OK。

第13步:刪除數據

和添加數據1樣,我們先去 DataManager 加個刪除數據的方法:

func removeRace(species inSpecies: String, race inRace: String) { if var races = species[inSpecies] { var index = -1 for (idx, race) in enumerate(races) { if race == inRace { index = idx break } } if index != -1 { races.removeAtIndex(index) species[inSpecies] = races saveData() } } }

有幾個值得注意的地方:

  • 通過 index 設置為 ⑴ 作為標識,避免出現搜索到最后也沒找到的結局。
  • 通過 enumerate 來遍歷數組,既不用 ++i 式的遍歷,又可以獲得索引值。

然后回到 RacesViewController ,添加刪除相干的拜托方法:

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { return true } func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { var raceToRemove = races[indexPath.row] DataManager.sharedInstance.removeRace(species: species, race: raceToRemove) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) }

試1下刪除操作,OK沒問題。

完結

后面 WebView 的內容沒甚么亮點,大同小異,不再記錄。

匆匆記錄了1些關鍵點,如果想完全學習請參考援用中的教程。

其實全部項目的功能很簡單,不過湊頭到尾走1遍可以體驗1下其他程序員的開發思路和基本步驟。總之還是有些收獲的。不過邊看邊記錄效力太低,以后只會記錄關鍵的收獲,不再

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 午夜一区二区三区 | 综合激情久久 | 亚洲成人免费电影 | 97久久久 | 91夜夜蜜桃臀一区二区三区 | 日韩不卡av| 欧美亚洲国产一区二区三区 | 国产精选视频在线观看 | 久久亚洲精品小早川怜子66 | 国产激情美女久久久久久吹潮 | 国产精品久久久久久久久久 | 午夜欧美成人 | 性欧美xxxxporn | 黄版视频在线观看 | 国产传媒在线播放 | 在线一区二区三区 | 国产精品久久 | 懂色av影视一区二区三区 | 国产精品久久久久久久久久不蜜月 | 欧美1区 | 欧美日韩在线电影 | 成人免费一区二区三区视频网站 | 成人av久久| www.久| 99精品视频免费观看 | 国产视频一区二区在线观看 | 欧美日韩系列 | 国产在线成人 | 日韩精品电影在线 | 91麻豆精品一区二区三区 | 99精品国产一区 | 精品一区二区三区免费毛片爱 | 国产一区二区三区免费在线观看 | 国产成人精品午夜 | 久久婷婷色综合 | 国产欧美123 | 免费成人黄色网址 | 99视频在线免费观看 | 日韩二区| 国产91精品久久久久久久网曝门 | 国产剧情在线 |