9月中旬,开始动手作个人毕业设计了,以前一直在纠结作啥,后来想一想,既然是作毕业设计,那就大胆地作点本身没接触过的东西吧。而后网上查找资料得知作天气预报须要用到开放的API,并且要用那种如今还在维护的,并且又免费的(对于咱们学生党来讲,这个是挺好的)。天气预报App的核心是从天气API请求数据,请求获得的通常是JSON数据(这个JSON数据以前都没接触过),而后把JSON数据解析,而后在视图上显示出来。总得来讲,这里应该涉及到“网络请求”,“JSON解析”这两个大块吧,正好用来学习新的东西,而且练练手,因而就决定作个天气预报的App了。html
#import <Mantle/Mantle.h> #import <MTLModel.h> @interface TSCondition : MTLModel<MTLJSONSerializing> @property (nonatomic, strong) NSString *cityName; // 城市名字 @property (nonatomic, strong) NSString *nowCond; // 当前天气情况 @property (nonatomic, strong) NSString *nowTmp; // 当前温度 @property (nonatomic, strong) NSString *winddir; // 风向 @property (nonatomic, strong) NSString *windsc; // 风力 @property (nonatomic, strong) NSString *date; // 日期 @property (nonatomic, strong) NSString *maxTmp; // 最高温度 @property (nonatomic, strong) NSString *minTmp; // 最低温度 @property (nonatomic, strong) NSString *weatherqlty; // 空气质量 @end
三、在.m文件中实现类方法,实现JSON数据到模型的映射sql
+ (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" }; }
四、固然要接受到JSON数据要调用下面的方法,而且传入带有你要的数据的字典json
//建立NSDictionary NSData *JSONData = ...//接口的响应数据 NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData: JSONData options: 0 error: nil]; //使用MTLJSONSerialization建立模型对象 CATProfile *profile = [MTLJSONAdapter modelOfClass: CATProfile.class fromJSONDictionary: JSONDict error: NULL];
通过重复的练习,熟悉了用Mantle把JSON数据转模型以后,我就开始搭建App的UI了数组
@property(nonatomic,strong) NSMutableArray *viewControllerArr; // 存放视图的数组 @property(nonatomic,assign) NSInteger curPage ; // 记录当前 @property(nonatomic,assign) NSInteger totalPages ; // 记录总页数 // ***翻页方法 // 日后翻 -(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; } }
+ (NSInteger)networkStatus { Reachability *reachability = [Reachability reachabilityWithHostName:@"http://www.heweather.com"];//网址可改 return [reachability currentReachabilityStatus]; }
// 如下代码用于加载以前所定义的数据模型,并链接到一个SQLite数据存储中。 // 实际上任何采用Core Data的应用,如下代码的内容都是相同的。 - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel == nil) { NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"]; NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; } return _managedObjectModel; } - (NSString *)documentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths lastObject]; return documentsDirectory; } - (NSString *)dataStorePath { return [[self documentsDirectory] stringByAppendingPathComponent:@"DataStore.sqlite"]; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator == nil) { NSURL *storeURL = [NSURL fileURLWithPath:[self dataStorePath]]; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; NSError *error; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Error adding persistent store %@,%@",error,[error userInfo]); abort(); } } return _persistentStoreCoordinator; } -(NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext == nil) { NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } } return _managedObjectContext; }
4.编写保存数据和查询数据的方法,并在程序须要的地方调用
能够参考http://blog.csdn.net/q199109106q/article/details/8563438这篇博客入门网络
// 在图片上加水印 + (instancetype)imageWithImage:(UIImage *)image andViewController:(ViewController *)controller { // 开启位图上下文 UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); [image drawAtPoint:CGPointZero]; // 设置文字的样式 NSDictionary *CityDict = @{ NSFontAttributeName : [UIFont fontWithName:@"KaiTi_GB2312" size: 40], NSForegroundColorAttributeName : [UIColor whiteColor] }; NSDictionary *dict = @{ NSFontAttributeName : [UIFont fontWithName:@"KaiTi_GB2312" size: 25], NSForegroundColorAttributeName : [UIColor whiteColor] }; CGFloat cityX = image.size.width - image.size.width / 4; CGFloat cityY = image.size.height / 13; // 画上城市名 [controller.cityName drawAtPoint:CGPointMake(cityX , cityY) withAttributes:CityDict]; CGFloat imgX = cityX + 80; CGFloat imgY = cityY - 20; CGFloat imgW = 80; // 画上天气图片 UIImage *condImg = [UIImage stringWithWeather:controller.jsonDic[@"now"][@"cond"][@"txt"]]; [condImg drawInRect:CGRectMake(imgX, imgY, imgW , imgW)]; CGFloat tempX = cityX + 40; CGFloat tempY = cityY + 60; // 画上温度计 UIImage *shape = [UIImage imageNamed:@"Shape"]; [shape drawInRect:CGRectMake(tempX-20, tempY, 14, 22)]; // 画上温度和天气状况 NSString *tempAndCond = [NSString stringWithFormat:@"%@℃ %@",controller.jsonDic[@"now"][@"tmp"],controller.jsonDic[@"now"][@"cond"][@"txt"]]; [tempAndCond drawAtPoint:CGPointMake(tempX, tempY) withAttributes:dict]; // 画上APP标记 NSString *ts = @"天\n时"; [ts drawInRect:CGRectMake(10, image.size.height - 80,40,80) withAttributes:dict]; // 得到新图片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); //关闭上下文 UIGraphicsEndImageContext(); return newImage; }
使用:翻到你想要显示的城市天气页面,选择照片或者拍摄,完了以后再相册就能查看到生成的图片
效果图:
框架
// 保存 - (void)isRefrash:(UISwitch *)sender { // [NSUserDefaults standardUserDefaults]能够直接操做偏好设置文件夹 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 自动帮咱们生成一个plist文件存放在偏好设置的文件夹 [defaults setBool:sender.on forKey:@"switchStatus"]; // 同步:把内存中的数据和沙盒同步 [defaults synchronize]; } // 在UISwitch加载时读取状态 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [self.refashSwitch setOn:[defaults boolForKey:@"switchStatus"]];