iOS畢業(yè)設(shè)計(jì)之天氣預(yù)報(bào)App
9月中旬,開始動(dòng)手做我的畢業(yè)設(shè)計(jì)了,之前一直在糾結(jié)做啥,后來想想,既然是做畢業(yè)設(shè)計(jì),那就大膽地做點(diǎn)自己沒接觸過的東西吧。然后網(wǎng)上查找資料得知做天氣預(yù)報(bào)需要用到開放的API,而且要用那種現(xiàn)在還在維護(hù)的,而且又免費(fèi)的(對(duì)于我們學(xué)生黨來說,這個(gè)是挺好的)。天氣預(yù)報(bào)App的核心是從天氣API請(qǐng)求數(shù)據(jù),請(qǐng)求得到的一般是JSON數(shù)據(jù)(這個(gè)JSON數(shù)據(jù)之前都沒接觸過),然后把JSON數(shù)據(jù)解析,然后在視圖上顯示出來。總得來說,這里應(yīng)該涉及到“網(wǎng)絡(luò)請(qǐng)求”,“JSON解析”這兩個(gè)大塊吧,正好用來學(xué)習(xí)新的東西,并且練練手,于是就決定做個(gè)天氣預(yù)報(bào)的App了。
第一步,找天氣API
各種百度,然后找到了比較新的網(wǎng)站,分別是“心知天氣”和“和風(fēng)天氣”。都需要注冊(cè),注冊(cè)之后會(huì)得到一個(gè)key,用來進(jìn)行數(shù)據(jù)請(qǐng)求的。兩個(gè)網(wǎng)站都有付費(fèi)和免費(fèi)的兩種選擇,如圖,比較完之后,二話不說,選擇了和風(fēng)天氣的API。
第二步,找解析JSON的第三方框架
各種百度之后也找到了大家推薦的一些,如:JSONKit、Mantle、AFNetworking、SBJSON、MJExtension等等等等。。。最后參考一篇教程,還是選擇了Mantle,當(dāng)然不是說其他不好用,個(gè)人喜好而已。
Mantle的使用也很簡(jiǎn)單。
1、新建一個(gè)繼承自MTLModel的類,并讓他遵循<MTLJSONSerializing>協(xié)議,注意這里還要#import <MTLModel.h>
2、在.h文件定義你的模型,如:
#import <Mantle/Mantle.h> #import <MTLModel.h> @interface TSCondition : MTLModel<MTLJSONSerializing> @property (nonatomic, strong) NSString *cityName; // 城市名字 @property (nonatomic, strong) NSString *nowCond; // 當(dāng)前天氣狀況 @property (nonatomic, strong) NSString *nowTmp; // 當(dāng)前溫度 @property (nonatomic, strong) NSString *winddir; // 風(fēng)向 @property (nonatomic, strong) NSString *windsc; // 風(fēng)力 @property (nonatomic, strong) NSString *date; // 日期 @property (nonatomic, strong) NSString *maxTmp; // 最高溫度 @property (nonatomic, strong) NSString *minTmp; // 最低溫度 @property (nonatomic, strong) NSString *weatherqlty; // 空氣質(zhì)量 @end
3、在.m文件中實(shí)現(xiàn)類方法,實(shí)現(xiàn)JSON數(shù)據(jù)到模型的映射
+ (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"cityName": @"basic.city", @"nowCond": @"now.cond.txt", @"nowTmp": @"now.tmp", @"winddir": @"now.wind.dir", @"windsc": @"now.wind.sc", @"date": @"basic.update.loc", @"maxTmp": @"daily_forecast.tmp.max", @"minTmp": @"daily_forecast.tmp.min", @"weatherqlty": @"aqi.city.qlty" }; }
4、當(dāng)然要接受到JSON數(shù)據(jù)要調(diào)用下面的方法,并且傳入帶有你要的數(shù)據(jù)的字典
//創(chuàng)建NSDictionary NSData *JSONData = ...//接口的響應(yīng)數(shù)據(jù) NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData: JSONData options: 0 error: nil]; //使用MTLJSONSerialization創(chuàng)建模型對(duì)象 CATProfile *profile = [MTLJSONAdapter modelOfClass: CATProfile.class fromJSONDictionary: JSONDict error: NULL];
經(jīng)過重復(fù)的練習(xí),熟悉了用Mantle把JSON數(shù)據(jù)轉(zhuǎn)模型之后,我就開始搭建App的UI了
第三步,建立天氣預(yù)報(bào)頁(yè)面(展示天氣頁(yè)面)
這里主要懶加載了一個(gè)backgroundView作為背景圖片,一個(gè)tableView以及多個(gè)XIB文件做成的Cell組成,我參考手機(jī)上自帶的天氣App做了一點(diǎn)美化,就是添加一個(gè)tableHeaderView,然后在上面添加一個(gè)ScrollView,在ScrollView上顯示城市和日期,達(dá)到它一直懸浮在最上層的效果,下面的cell都在它底下滑過。(后來發(fā)現(xiàn)其實(shí)這里可以不添加tableHeaderView,把tableView的位置下移就好了。。。)
=====================10.12日編輯==============================
對(duì)界面進(jìn)行了調(diào)整,繼續(xù)ing。。。
第四步,創(chuàng)建UIpagecontrol
基本定好天氣預(yù)報(bào)信息如何展示之后,就要想,怎么展示多個(gè)天氣頁(yè)面呢?為了實(shí)現(xiàn)這個(gè)需求,我想到了用UIpagecontrol
這里主要用到一下屬性和方法
@property(nonatomic,strong) NSMutableArray *viewControllerArr; // 存放視圖的數(shù)組 @property(nonatomic,assign) NSInteger curPage ; // 記錄當(dāng)前 @property(nonatomic,assign) NSInteger totalPages ; // 記錄總頁(yè)數(shù) // ***翻頁(yè)方法 // 往后翻 -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{ self.curPage = ((ViewController *)viewController).page; UIImage *bgImg = [self createImageWithColor:((ViewController *)viewController).view.backgroundColor]; [self.navigationController.navigationBar setBackgroundImage:bgImg forBarMetrics:UIBarMetricsDefault]; self.pageControl.currentPage = self.curPage; if (self.curPage < self.totalPages - 1 && self.curPage != self.totalPages) { return self.viewControllerArr[self.curPage + 1]; }else{ return nil; } } // 往前翻 -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{ self.curPage = ((ViewController *)viewController).page; UIImage *bgImg = [self createImageWithColor:((ViewController *)viewController).view.backgroundColor]; [self.navigationController.navigationBar setBackgroundImage:bgImg forBarMetrics:UIBarMetricsDefault]; self.pageControl.currentPage = self.curPage; if (self.curPage > 0 && self.curPage != self.totalPages) { return self.viewControllerArr[self.curPage - 1]; }else{ return nil; } }
第五步,添加城市,使用searchBar
實(shí)現(xiàn)這個(gè)需求,我選擇在navigationBar 上添加一個(gè)按鈕,跳轉(zhuǎn)到一個(gè)帶搜索欄的視圖,實(shí)現(xiàn)輸入城市名字,添加天氣頁(yè)面的功能
這里的難點(diǎn)是,添加視圖后,UIpagecontrol的頁(yè)面添加和翻頁(yè)邏輯問題,經(jīng)過一段時(shí)間努力還是解決了。
第六步,添加第三方側(cè)欄LLSlideMenu
我想使用這個(gè)側(cè)欄管理天氣頁(yè)面,因?yàn)槲沂怯靡粋€(gè)數(shù)組存儲(chǔ)城市名字去加載天氣頁(yè)面的,所以我的思路是,在側(cè)欄里面添加一個(gè)tableview,然后把數(shù)組的每一個(gè)元素顯示上去,然后實(shí)驗(yàn)tableviewcell的編輯方法,達(dá)到移除相應(yīng)的cell,即刪除相應(yīng)的城市名字和城市頁(yè)面。
未完待續(xù),不要錯(cuò)過。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS中使用schema協(xié)議調(diào)用APP和使用iframe打開APP的例子
- iOS App初次啟動(dòng)時(shí)的用戶引導(dǎo)頁(yè)制作實(shí)例分享
- iOS App中調(diào)用相冊(cè)中圖片及獲取最近的一張圖片的方法
- javascript實(shí)現(xiàn)阻止iOS APP中的鏈接打開Safari瀏覽器
- 總結(jié)iOS App開發(fā)中控制屏幕旋轉(zhuǎn)的幾種方式
- iOS保存App中的照片到系統(tǒng)相冊(cè)或自建相冊(cè)的方法
- 詳解在iOS App中自定義和隱藏狀態(tài)欄的方法
- iOS中使用URL Scheme進(jìn)行App跳轉(zhuǎn)的教程
- iOS開發(fā)中使app獲取本機(jī)通訊錄的實(shí)現(xiàn)代碼實(shí)例
- iOS App開發(fā)中使cell高度自適應(yīng)的黑魔法詳解
相關(guān)文章
iOS中震動(dòng)反饋(UIFeedbackGenerator)與系統(tǒng)震動(dòng)詳解
最近要做一個(gè)項(xiàng)目,需要持續(xù)響鈴并振動(dòng),所以就有了這篇文章,下面這篇文章主要給大家介紹了關(guān)于iOS中震動(dòng)反饋(UIFeedbackGenerator)與系統(tǒng)震動(dòng)的相關(guān)資料,需要的朋友可以參考下2018-08-08iOS 設(shè)置UILabel的行間距并自適應(yīng)高度的方法
下面小編就為大家?guī)硪黄猧OS 設(shè)置UILabel的行間距并自適應(yīng)高度的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04iOS 標(biāo)簽Tag列表的實(shí)現(xiàn)代碼
這篇文章主要介紹了本篇文章主要介紹了iOS 標(biāo)簽Tag列表的實(shí)現(xiàn)代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04iOS端React Native差異化增量更新的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于iOS端React Native差異化增量更新的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06淺談RxSwift 網(wǎng)絡(luò)請(qǐng)求
這篇文章主要介紹了淺談RxSwift 網(wǎng)絡(luò)請(qǐng)求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07NSString屬性何時(shí)用strong何時(shí)用copy?
相信各位iOS開發(fā)者們都考慮過這個(gè)問題,平時(shí)寫NSString的屬性時(shí)都用copy,那strong要何時(shí)用呢?下面這篇文章就來看一下什么時(shí)候應(yīng)該用copy,什么時(shí)候應(yīng)該用strong。有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12IOS 應(yīng)用程序管理的實(shí)現(xiàn)
這篇文章主要介紹了IOS 應(yīng)用程序管理的實(shí)現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10