Weather-Report
在IPhone天气预报中,一跳到搜索界面,键盘会自动弹出,搜索栏光标闪烁,这是因为在搜索界面中设置了:
UISearchBar *searchBar = [[UISearchBar alloc]init];
[searchBar becomeFirstResponder];
将搜索栏设为了键盘的第一响应者。
在UISearchBar自带的方法:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
此方法是当文字改变时触发,所以在此方法中进行网络请求,并根据网络请求得到的数据,对UITableView进行更新。
在从搜索界面协议传值到主界面到传值方法中,写了主界面及展示界面的网络请求。
传值方法在viewWillAppear前执行,其实最好让传值方法只负责传值,把网络请求写在viewWillAppear里
这里要把展示界面所需的网络数据提前请求到,进行存储,再传到展示界面。如果在跳转到展示界面到时候才进行请求,有可能因为网络请求太慢,导致数据没请求到就赋值,结果报错。
好像是多线程到问题,要在跳转代码
[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 *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我一不小心就