IOS 大众点评 首页界面 仿真实现

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中方法的实现是在具体你要显示出数据的页面中调用   最后返回给一个可变数组作为当前页面的数据源。

  1.      当然光有这些还不够,   还需要程序员自己解析数据, 然后在API接口方法中调用解析的方法

 

+(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个按钮和文字是拖拽实现的效果,给每个按钮加TAG0.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];

       });

   });

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