1.得到大众点评的API接口, API接口中有相应的对应数据返回的方法
+(NSMutableArray *)requestBusinessesWithParams:(NSMutableDictionary*)params;
//请求团购
+(NSMutableArray *)requestDealsWithParams:(NSMutableDictionary *)params;
2.这个请求方法需要传递进去一个可变字典,(可变字典的数据是作为得到API接口地址的限定的:如
[self.dicssetObject:@"北京"forKey:@"city"]; //API返回接口地址的限定。
-(void)viewWillAppear:(BOOL)animated{
[self.categoryArrremoveAllObjects]; 每次返回首页都需要将分类页面的数据源删除,否则会出错。 因为每次跳转到分类界面
判定就变 例如:美食Category了, 如果返回页面的时候不在 将要展示页面中删除分类页面
里的数据,那么 判定依然还是美食Category,首页页面的 北京city无法正常调用API接口地址
展示会出错!!!!!!!!!!!!!!
self.dics = [NSMutableDictionarydictionary];
[self.dicssetObject:@"北京"forKey:@"city"]; 每次返回主页的时候都要将判定变成北京city 否则数据仍然是 分类页面的判定
并且需要将分类界面的数据源数组的数据清空。否则会无法显示主页数据;
self.arr = [DianpingApirequestBusinessesWithParams:self.dics];
[self.tableViewreloadData];
}
3. 2中方法的实现是在具体你要显示出数据的页面中调用 最后返回给一个可变数组作为当前页面的数据源。
+(NSMutableArray *)requestBusinessesWithParams:(NSMutableDictionary*)params{
NSString *path = [NSStringstringWithFormat:@"http://api.dianping.com/v1/business/find_businesses"];
// NSLog(@"%@",path);
//调用大众点评提供的对地址进行序列化的方法
path = [DianpingApiserializeURL:pathparams:params];
NSLog(@"%@",path); 序列化后得到的地址输出到控制台,就是json字符串 ,然后解析出需要解析的数据;
NSURL *url = [NSURLURLWithString:path];
NSData *data = [NSDatadataWithContentsOfURL:url];
NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:dataoptions:0error:nil];
//解析
NSMutableArray *arr = [NSMutableArrayarray];
arr = [JsonParserjsonParserByDic:dic];
return arr;
}
得到地址,得到json的步骤。
1.在API接口代码中 调用解析方法, 返回方法需要返回的数组
2.在viewController(主页展示)页面中 调用API方法,传递进去可变字典,作为输出接口地址的判定。
返回的数组就是解析类解析出来的数据源数组。
[self.dicssetObject:@"北京"forKey:@"city"];
self.arr = [DianpingApirequestBusinessesWithParams:self.dics];
3.NSLog输出 判定好的北京,city的具体API接口地址, 在网页上输入,得到Json;
4.根据网页的json进行数据的解析, self.arr就是数据源数组。
因为API接口方法中 调用了解析方法,返回了一个数组,这个数组就是数据源数组,
在viewController里 又调用了这个API方法,并复制给一个数组,所以这个数组就是数据源数组。
解析类方法
+(NSMutableArray *)jsonParserByDic:(NSDictionary *)dic{
NSMutableArray *infoArr = [NSMutableArrayarray];
NSArray *businessesArr = dic[@"businesses"];
for (NSDictionary *businessesDicin businessesArr) {
MainPage *mp = [[MainPagealloc]init];
mp.branch_name =businessesDic[@"branch_name"];
mp.photo_url =businessesDic[@"photo_url"];
mp.telephone =businessesDic[@"telephone"];
NSArray *dealsArr =businessesDic[@"deals"];
for (NSDictionary *dealsDicindealsArr) {
mp.descriptions =dealsDic[@"description"];
mp.url = dealsDic[@"url"];
}
[infoArr addObject:mp];
}
return infoArr;
}
1.剩下的操作就是搭接面, 用数据源数组 进行页面的代码控制的相关展示;
具体步骤操作:1.显示cell的数量:self.arr.count
2.自定义Cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
MainPageTableViewCell *cell = [[NSBundlemainBundle]loadNibNamed:@"MainPageTableViewCell"owner:selfoptions:nil].lastObject;
if (!cell) {
cell = [[MainPageTableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"];
}
cell.m =self.arr[indexPath.row];
return cell;
}
3.将模型当中的对象传递到自定义Cell的类中(.h) .h里面需要声明类的对象来接收
@property (nonatomic,strong)MainPage *m;
4.在.h里进行控件的声明。要显示什么声明什么。
5 在.m里面实现数据的展示
-(void)layoutSubviews{
[superlayoutSubviews];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSData *data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:self.m.photo_url]];
dispatch_async(dispatch_get_main_queue(),^{
self.foodImage.image = [UIImageimageWithData:data];
});
});
self.foodTitle.text = self.m.branch_name;
self.foodTelephone.text = self.m.telephone;
self.foodDescirtion.text = self.m.descriptions;
}
6.以上5个步骤为猜你喜欢的数据展示, 下面的步骤是实现首页的 8个按钮的点击,跳转页面的效果。
1.头部8个按钮和文字是拖拽实现的效果,给每个按钮加TAG;0.1.2.3.4.5… 这里用到了枚举,为了防止魔法数字;
typedefenum : NSUInteger {
MeiShi,DianYing,JiuDian,KTV,XiaoChi,XiuXianYuLe,LiRen,JieHun
} HeadBtnName;
在所有代码的最顶部打enum就提示出来了;
2.给8个按钮添加点击事件, 出现枚举的情况多半是因为代码中出现了switch
3.下面会在代码中加上注释, 这段代码是做判定和跳转的实现代码
- (IBAction)Jump:(UIButton *)sender {
CategoryDetialTableViewController *vc = [self.storyboardinstantiateViewControllerWithIdentifier:@"CategoryDetialTableViewController"];
switch (sender.tag) {
caseMeiShi:
// [self.dics setObject:@"北京"forKey:@"city"];
[self.dicssetObject:@"美食"forKey:@"category"];
break;
caseDianYing:
[self.dicssetObject:@"电影"forKey:@"category"];
break;
caseJiuDian:
[self.dicssetObject:@"酒店"forKey:@"category"];
break;
caseKTV:
[self.dicssetObject:@"KTV"forKey:@"category"];
break;
caseXiaoChi:
[self.dicssetObject:@"小吃"forKey:@"category"];
break;
caseXiuXianYuLe:
[self.dicssetObject:@"休闲娱乐"forKey:@"category"];
break;
caseLiRen:
[self.dicssetObject:@"丽人"forKey:@"category"];
break;
caseJieHun:
[self.dicssetObject:@"结婚"forKey:@"category"];
break;
}
self.categoryArr = [DianpingApirequestBusinessesWithParams:self.dics];这句话很重要;
vc.arr =self.categoryArr;
[self.navigationControllerpushViewController:vcanimated:YES];
}
注意事项:
1.self.dics是可变数组,需要初始化,因为用了;
self.dicssetObject:@"美食"forKey:@"category
2.因为8个按钮每个页面都不一样,所以需要给可变数组加判定,
最后在调用API方法将数组加进去,返回具体相对应界面的
数据源数组,
self.categoryArr = [DianpingApirequestBusinessesWithParams:self.dics];
vc.arr =self.categoryArr;
3.声明一个8个按钮的跳转界面,判定不一样,展示效果一样,
CategoryDetialTableViewController *vc = [self.storyboardinstantiateViewControllerWithIdentifier:@"CategoryDetialTableViewController"];
4.在分类页面中声明一个数组接收数据源数组,作为其当前页面的数据源数组
。然后跳转界面。
分类页面代码实现及步骤说明;
1.从首页界面 调用API方法, 将判定字典加入进去,返回的数据就是 分类界面需要的数据源数组,,,所以需要在分类界面声明一个
可变数组进行接收,
2.显示页面个数 self.arr.count 2.1自定义cell
自定义Cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
CategoryDetialTableViewCell *cell = [[NSBundlemainBundle]loadNibNamed:@"CategoryDetialTableViewCell"owner:selfoptions:nil].lastObject;
if (!cell) {
cell = [[CategoryDetialTableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"];
}
cell.m =self.arr[indexPath.row];******
将当前点击的Cell行传给自定义cell界面的 声明好的类的对象中
@property (nonatomic,strong)MainPage*m;
return cell;
}
页面跳转到 那个页面的URL
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
MainPage * m =self.arr[indexPath.row];
UIViewController *vc = [[UIViewControlleralloc]init];
UIWebView *wv = [[UIWebViewalloc]initWithFrame:vc.view.bounds];
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:m.url]]; 重要
[wv loadRequest:request];
[vc.viewaddSubview:wv];
[self.navigationControllerpushViewController:vcanimated:YES];
}
在自定义Cell进行界面搭建,代码数据关联;
-(void)layoutSubviews{
[superlayoutSubviews];
self.categoryTitle.text = self.m.branch_name;
self.categoryTelephone.text = self.m.telephone;
self.categoryDes.text = self.m.descriptions;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSData *data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:self.m.photo_url]];
dispatch_async(dispatch_get_main_queue(),^{
self.categoryImage.image = [UIImageimageWithData:data];
});
});