实现的效果如下所示:

代码如下:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIPickerView *cityPickView;
- (IBAction)request:(id)sender;

@property (weak, nonatomic) IBOutlet UILabel *city;
@property (weak, nonatomic) IBOutlet UILabel *temperature;
@property (weak, nonatomic) IBOutlet UILabel *windyDirection;
@property (weak, nonatomic) IBOutlet UILabel *level;
@property (weak, nonatomic) IBOutlet UILabel *moisture;
@property (weak, nonatomic) IBOutlet UILabel *time;

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong)NSDictionary *dic;
@property (weak, nonatomic) IBOutlet UIView *activityView;

//@property (nonatomic,strong)UIActivityIndicatorView *activity;

//存放所有的城市名字
@property (nonatomic,strong)NSMutableArray *data;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
 
    //先隐藏
    _activityView.hidden = YES;
   
}

//懒加载
- (NSDictionary *)dic
{
    if (_dic == nil) {
        
        NSString *path = [[NSBundle mainBundle]pathForResource:@"cityCode.plist" ofType:nil];
        _dic = [NSDictionary dictionaryWithContentsOfFile:path];
    }
    return _dic;
    
}

- (NSMutableArray *)data
{
    if (_data == nil) {
        _data = [NSMutableArray array];
        
    }
    
    return _data;
    
}
//列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
    
}

//每列的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return self.dic.count;
    
}

//显示标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{

//取得所有的key
    NSArray *cities = [_dic allKeys];
    
    //_data保存所有的城市
    _data = [cities copy];
    
    //取得城市的名字
    NSString *cityName = cities[row];
    
    return cityName;
    
    
}

//当前选中的行数
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSLog(@"row = %ld",row);
    
    
}

//请求网络数据
- (IBAction)request:(id)sender {
    
    _activityView.hidden = NO;
    
    //得到_cityPickView当前选中的行数
    NSInteger rowIndex = [_cityPickView selectedRowInComponent:0];
    
    //得到 选中行的城市名字
    NSString *city = _data[rowIndex];
    
    //取得城市对应的ID
    NSString *cityId = _dic[city];

//构造URL对象
    NSString *str = [NSString stringWithFormat:@"http://www.weather.com.cn/adat/sk/%@.html",cityId];
    
    NSURL *url = [NSURL URLWithString:str];
    
    //构造request对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //构造NSURLSession
    NSURLSession *session= [NSURLSession sharedSession];
    
    //创建网络任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        
        //解析JSON数据
        NSDictionary *dic1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
 
        //回到主线程  刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [self refreshUI:dic1];
            
        });
        
    }];
    
    //发起网络任务
    [task resume];
}

//刷新UI
- (void)refreshUI:(NSDictionary *)dic
{
    
    _activityView.hidden = YES;
    
    //取得数据
    NSDictionary *dic2 = dic[@"weatherinfo"];
    NSString *ws = dic2[@"WS"];    //风级
    NSString *city = dic2[@"city"];    //城市
    NSString *temp = dic2[@"temp"];   //温度
    NSString *SD = dic2[@"SD"];      //湿度
    NSString *Wd = dic2[@"WD"];    //风向
    NSString *time = dic2[@"time"];  //时间

_city.text = city;
    _temperature.text = temp;
    _windyDirection.text = Wd;
    _level.text = ws;
    _moisture.text = SD;
    _time.text = time;
    
}

在以后的学习中,会一直坚持写博客,记录自己的学习笔记,为自己的学习和工作做好准备!!!

显示天气预报的Demo的更多相关文章

  1. libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...

  2. springboot1.5.9整合websocket实现实时显示的小demo

    最近由于项目需要实时显示数据库更新的数据变化情况,一开始想过在前端使用ajax异步轮询方法实现,但后面考虑到性能和流量等要求,就放弃该方法而选择使用websocket(毕竟现在springboot整合 ...

  3. Android 拍照或相册选择照片进行显示缩放位图 Demo

    拍照后直接使用 BitmapFactory.decodeStream(...) 进行创建 Bitmap 并显示是有问题的. Bitmap 是个简单对象,它只存储实际像素数据,也就是说,即使原始照片已压 ...

  4. 显示本月日历demo

    import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCalendar; p ...

  5. 关于一个隐藏和显示物品列表的demo

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. Android 获取天气预报

    界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  7. 在android中用跑马灯的效果显示textview

    大家好,在我们通常的android project中,通常需要用到textview这一个布局文件,并且对于这一个显示布局所需要的文本文字内容. 下面我们就来介绍一种方法来实现在android中用跑马灯 ...

  8. CSS2-3常见的demo列子总结

    CSS2-3常见的demo列子总结 阅读目录 1. css超过一行或者多行后显示省略号. 2. css图片未知高度垂直居中完美解决方案. 3. 学习使用 :before和 :after伪元素 回到顶部 ...

  9. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现

    转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...

随机推荐

  1. JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html

    js: JSON.stringify(idinfo)//将对象转化为 JSON串 //查询后为将json串赋值给表单 function _form1_load() {            AOS.a ...

  2. iOS设计模式笔记

    设计模式 所谓设计模式,就是经过无数程序员的努力,在很多代码的基础上抽取出来的"模式" 一种设计模式,通常用来解决一种问题 MVC体系架构 也是一个设计模式,主要解决:界面(V), ...

  3. 【转载】变更MySql数据存储路径的方法

    1.在mysql安装目录下找到my.ini文件,更改#Path to the database root datadir="希望存放数据的地址" 2.将默认存放路径(一般为&quo ...

  4. php服务生成exe附件下载

    <?php $realname = "zhuast.exe"; //原始文件名 $filename = "中文 文件名.exe"; //下载到浏览器的文件 ...

  5. poj1113

    http://poj.org/problem?id=1113 完全时copy大神给的模版哦,结果再加一个小圆的周长就好啦 #include<stdio.h> #include<mat ...

  6. 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第四章内容. 1.函数:通过函数可以封装 ...

  7. 傻瓜式操作Nagios

    傻瓜式操作Nagios   不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...

  8. FusionCharts中仪表盘相关属性

    上上周用FusionCharts做了几个报表,里面有个仪表盘,当时查属性查疯了,现在把相关的一些属性记下来,方便以后查找. -------------------------仪表盘重要属性解析---- ...

  9. asp.net 新项目遇到的坑

    1.新拿来的项目,能正常跑,但是想熟悉,运用断点调试,f11却发现出了这个问题 此提示:应该是缺失dll文件  2.于是重新生成项目出现,发现Log4Net,有文件,但是出现这个提示 思考:一版本不对 ...

  10. 自己写的 限制文本框TEdit中只能输入数字

    procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char); begin , #]) then begin Key := #; end ...