IPhone天气预报仿写 知识点小记

知识点小记

  • GitHub地址
  • 天气预报
    • 搜索界面
      • 键盘自动弹出
      • 搜索内容随输入更新
    • 主界面
      • 网络请求时机
      • 界面点击2次才跳转
      • 返回主线程更新界面
    • 展示界面
      • 随着城市增加,界面增加
    • 网络请求报错
      • 第一种解决方法
      • 第二种解决方法

GitHub地址

Weather-Report

天气预报

搜索界面

键盘自动弹出

在IPhone天气预报中,一跳到搜索界面,键盘会自动弹出,搜索栏光标闪烁,这是因为在搜索界面中设置了:

     UISearchBar *searchBar = [[UISearchBar alloc]init];
    [searchBar becomeFirstResponder];

将搜索栏设为了键盘的第一响应者。

搜索内容随输入更新

在UISearchBar自带的方法:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

此方法是当文字改变时触发,所以在此方法中进行网络请求,并根据网络请求得到的数据,对UITableView进行更新。

主界面

网络请求时机

在从搜索界面协议传值到主界面到传值方法中,写了主界面及展示界面的网络请求。
传值方法在viewWillAppear前执行,其实最好让传值方法只负责传值,把网络请求写在viewWillAppear里

这里要把展示界面所需的网络数据提前请求到,进行存储,再传到展示界面。如果在跳转到展示界面到时候才进行请求,有可能因为网络请求太慢,导致数据没请求到就赋值,结果报错。

界面点击2次才跳转

好像是多线程到问题,要在跳转代码

[self presentViewController:contentViewController animated:YES completion:nil];

前,先唤醒主线程

    //此处的nothing 是一个空方法,只是用来唤醒主线程的
    [self performSelectorOnMainThread:@selector(nothing) withObject:nil waitUntilDone:NO];

返回主线程更新界面

网络请求是在子线程进行的,所以不能在网络请求中进行UI操作,需要在网络请求中返回主线程:

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"在这里写UI操作");
        }];

展示界面

这个界面是用自定义view,自定义TableViewCell最多的一个部分。

随着城市增加,界面增加

在这里,将每个城市的展示数据界面写成了单独的view,所以在展示界面的viewDidLoad上根据从主界面传过来的数据,创建:

/**
 *_contentMutableArray 存储城市名称
 *_contentNumber 点击的哪个城市
 *ContentView 城市展示view
*/
    _contentPageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(87, 16, 201, 30)];
    _contentPageControl.numberOfPages = [_contentMutableArray count];
    _contentPageControl.currentPage = _contentNumber;
    [_contentPageControl addTarget:self action:@selector(pageClick:) forControlEvents:UIControlEventTouchUpInside];
    [_contentFootView addSubview:_contentPageControl];
    
    _contentScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 375, 750)];
    _contentScrollView.delegate = self;
    [self.view addSubview:_contentScrollView];
    //监控目前滚动的位置
    [_contentScrollView setContentOffset:CGPointMake(375 * _contentNumber, 0) animated:YES];
    _contentScrollView.tag = 101;
    _contentScrollView.showsHorizontalScrollIndicator = NO;
    _contentScrollView.pagingEnabled = YES;
    _contentScrollView.contentSize = CGSizeMake(375 * [_contentMutableArray count], 750);
    
    for (int i = 0; i < [_contentMutableArray count]; i++) {
        ContentView *contentView = [[ContentView alloc]initWithFrame:CGRectMake(375 * i, 0, 375, 750)];
        [_contentScrollView addSubview:contentView];
    }

网络请求报错

在写网络请求时,遇到了这个问题:
finished with error - code: -1022

第一种解决方法

例如这个网址:
https://free-api.heweather.com/s6/weather?location=北京&key=9f24a96156ad40cb9db5e064d698081e

这个网址报错当原因是网址里面含有汉字,

  • 可以直接把北京写成拼音,就不会报错
  • 也可以对存储网址信息的字符对象NSString进行操作:
NSString *str = @"https://free-api.heweather.com/s6/weather?location=北京&key=9f24a96156ad40cb9db5e064d698081e";
str = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];

这样就不会报错了。

第二种解决方法

例如这个网址:
http://api.k780.com/?app=weather.realtime&weaid=1&ag=today,futureDay,lifeIndex,futureHour&appkey=44497&sign=8818ce7afd663dc666ab8ee499f3a163&format=json

这里面明明没有汉字,但是却也会报错,这个可以通过改变Xcode的 .plist 文件可以解决,详见:
简书 finished with error - code: -1022 By我一不小心就

你可能感兴趣的:(学习笔记)