这是一个获取聚合网络上的黄金数据,把获取到的数据展示在表格上
首先需要导入4个SDK,分别是 MJRefresh 用于刷新界面的SDK ;
MBProgressHUD 用于弹出提示信息;
libWeiboSDK 微博的SDK
WeChatSDK1.8.3_NoPay 微信的SDK
如下图所示:
首先需要在viewController.m中导入头文件,如图:
在viewController.m中定义3个属性,分别表示,表格的数据源,表格,下拉刷新控件; 其中表格数据源用全局的变量表示;如图:
初始化表格视图,记得遵守协议
//初始化表格视图
self.tbv=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
//注册单元格
[self.tbv registerNib:[UINib nibWithNibName:@"GoldTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"string"];
self.tbv.delegate=self;
self.tbv.dataSource=self;
[self.viewaddSubview:self.tbv];
//实例化下拉刷新控件
self.mjHeaderView =[[MJRefreshHeaderView alloc]initWithScrollView:self.tbv];
//做一个弱引用
__weak typeof(self)weakSelf=self;
//下拉回调的代码
self.mjHeaderView.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {
[weakSelfgetHttpData];
};
//把弹出的视图置在屏幕的最前方
[self.view bringSubviewToFront:self.shareView];
//几行
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return tableDataArr.count;
}
//设置表格的cell
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
staticNSString* string=@"string";
//设置cell时,不是UITabViewCell,而是用自己的定义的GoldTableViewCell,以下会提到
GoldTableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:string forIndexPath:indexPath];
//获取cell对应的model对象
Gold* gold =tableDataArr[indexPath.row];
//cell赋值
cell.variety.text=gold.variety;
cell.latestpri.text=gold.latestpri;
cell.openpri.text=gold.openpri;
cell.maxpri.text=gold.maxpri;
cell.minpri.text=gold.minpri;
returncell;
}
接下里创建一个view视图,就是为了连接上面cell中的cell的样式,创建一个类,让他继承于UITableViewCell,记得勾上xib选项,因为要用到脱线拖拽cell中的子控件,子控件全部都是属性
如图所示:
下面开始脱线,把所有的种类lable 拖拽到GoldTableViewCell.h中
然后再创建一个model模型,为了获取数据时赋值,让他继承自NSObject,如图所示:
在Gold.h中定义属性,一定要和聚合上的数据属性一致,不能少一个,不然表格赋值时会崩溃
@property(nonatomic,copy)NSString* variety; //品种
@property(nonatomic,copy)NSString * latestpri;//最新价
@property(nonatomic,copy)NSString* openpri; //开盘价
@property(nonatomic,copy)NSString* maxpri; //最高价
@property(nonatomic,copy)NSString* minpri; //最低价
@property(nonatomic,copy)NSString* limit; //跌涨幅
@property(nonatomic,copy)NSString* yespri; //昨收价
@property(nonatomic,copy)NSString * totalvol; //总成交量
@property(nonatomic,copy)NSString* time; //更新时间
回到ViewController.m中,导入两个头文件 #import "GoldTableViewCell.h" 和 #import"Gold.h"
在 viewDidLoad 中写入下面调用的自定义方法
//获取自定义的网络数据
[self getHttpData];
然后写入获取聚合网络数据的方法实现
//获取网络数据
-(void)getHttpData
{
//等待指示器显示
[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
//网址字符串拼接
NSString * urlStr=[NSString stringWithFormat:@"http://web.juhe.cn:8080/finance/gold/shgold?key=%@&v=1",@"1b9f570e367ce24e51135d69eac7d04e"];
//如果网址字符串中有汉字,对汉字做处理
urlStr=[urlStrstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
//网址对象
NSURL* url=[NSURLURLWithString:urlStr];
//做成请求对象,设置缓存策略和超时时长
NSURLRequest * req=[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0];
//请求网络数据
[[[NSURLSessionsharedSession]dataTaskWithRequest:reqcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
//停止菊花转动
dispatch_async(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
//停止下拉刷新
[self.mjHeaderViewendRefreshing];
});
//如果发生服务器或超时错误,给提示
if(error!=nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self showMBAlertWithMessage:@"服务器错误"];
});
return;
}
//json数据转换
NSError* jsonError=nil;
id jsonData=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError];
//如果转换失败
if(jsonError!=nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self showMBAlertWithMessage:@"网络数据错误"];
});
return;
}
//得到接口数据resultcode=200字段的值
intresultcode=[jsonData[@"resultcode"]intValue];
//如果不是200,表示发生错误
if(resultcode!=200)
{
dispatch_async(dispatch_get_main_queue(), ^{
[selfshowMBAlertWithMessage:jsonData[@"reason"]];
});
return;
}
//获取result字段对应的数组
NSArray* resultArr=jsonData[@"result"];
//获取数组中的大字典
NSDictionary* allDic=[resultArrfirstObject];
//实例化一个可变数组,用于储存model对象
NSMutableArray * modeArr=[[NSMutableArray alloc]init];
//遍历大字典中所有的小字典
for(idkeyinallDic) {
NSDictionary* dic=[allDicobjectForKey:key];
Gold* g=[[Goldalloc]init];
[gsetValuesForKeysWithDictionary:dic];
[modeArraddObject:g];
}
//将modeArr数组赋值给表格数组,刷新表格
dispatch_async(dispatch_get_main_queue(), ^{
self->tableDataArr=[modeArrcopy];
[self.tbvreloadData];
});
}]resume];
}
接下来封装提示框的方法
//显示提示框的封装方法
-(void)showMBAlertWithMessage:(NSString*)msg
{
MBProgressHUD * hud=[[MBProgressHUD alloc]initWithView:self.view];
hud.mode=MBProgressHUDModeText;
hud.removeFromSuperViewOnHide=YES;
hud.labelText=msg;
[self.viewaddSubview:hud];
[hudshow:YES];
[hudhide:YES afterDelay:3.0];
}
这样就做完了网络获取数据的代码,接下来在这个基础上做点击单元格实现分享当前单元格内容的方法
在全局变量中定义个全局变量 NSString* shareString;//分享的文本内容
首先需要定义一个属性,为了点击单元格弹出分享的视图,在这里咱们就用一个UIview来做
@property(nonatomic,strong)UIView * shareView;//分享视图
在 @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> 上面设置两个宏定义,一个是屏幕的宽,一个是屏幕的高
#define SCR_W [UIScreen mainScreen].bounds.size.width
#define SCR_H [UIScreen mainScreen].bounds.size.height
然后用懒加载实现分享视图
//分享视图实例化
-(UIView* )shareView
{
if(!_shareView)
{
_shareView=[[UIView alloc]initWithFrame:CGRectMake(0, SCR_H, SCR_W, 200)];
_shareView.backgroundColor=[UIColor lightGrayColor];
//单击手势
UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideShareView:)];
[_shareView addGestureRecognizer:tap];
//按钮标题数组
NSArray* btnTitles=@[@"微信好友",@"朋友圈",@"QQ",@"微博"];
//设置按钮的宽度
CGFloatbtnW=60;
//按钮间的距离
CGFloatdis=(SCR_W-btnW*btnTitles
.count)/(btnTitles.count+1);
//使用for循环构建按钮
for(inti=0; i
//实例化
UIButton * btn=[UIButton buttonWithType:UIButtonTypeCustom];
//设置位置
btn.frame=CGRectMake(dis+(dis+btnW)*i,70, btnW, btnW);
//做成圆角
btn.clipsToBounds=YES;
btn.layer.cornerRadius=btnW/2;
//设置标题
[btnsetTitle:btnTitles[i] forState:UIControlStateNormal];
//设置背景颜色
btn.backgroundColor=[UIColor blueColor];
//设置字体的颜色
[btnsetTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
//设置tag值,为了区分点击的哪一个按钮
btn.tag=100+1;
[btnaddTarget:self action:@selector(shareBtnDidPress:) forControlEvents:UIControlEventTouchUpInside];
//添加到分享视图上
[_shareViewaddSubview:btn];
}
}
return _shareView;
}
再创建一个点击单元格的方法
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
//得到选中cell对应的model
Gold* gold=[tableDataArrobjectAtIndex:indexPath.row];
//分享字符串赋值
shareString=[NSStringstringWithFormat:@"黄金%@,最新报价%@元,最高%@元,最低%@元",gold.variety,gold.latestpri,gold.maxpri,gold.minpri];
//加一个弹出的时间间隔
[UIView animateWithDuration:0.138 animations:^{
//显示分享视图
self.shareView.frame=CGRectMake(0,SCR_H-200,SCR_W,200);
}];
}
点击分享视图,隐藏分享视图的方法
//隐藏分享视图
-(void)hideShareView:(id)sender
{
//视图隐藏的时间
[UIView animateWithDuration:0.138 animations:^{
//隐藏按钮视图
self.shareView.frame=CGRectMake(0,SCR_H,SCR_W,200);
}];
}
在AppDelegate.m中写
#import "libWeiboSDK/WeiboSDK.h"
#define weibo_AppKey @"3970277534"
#define weibo_RedirectURI @"https://www.sina.com"
#define weixin_AppKey @"wx324a10d04bd2cd5c"
//微信回调方法
-(void) onResp:(BaseResp*)resp
{
//授权登录回调
if([resp isKindOfClass:[SendAuthResp class]])
{
}
//分享回调
else if([resp isKindOfClass:[SendMessageToWXReq class]])
{
}
}
//向微信注册
[WXApi registerApp:weixin_AppKey];
//向微博去注册
[WeiboSDK registerApp:weibo_AppKey];
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
//获取回调的网址字符串
NSString * urlstr=url.absoluteString;
if([urlstrcontainsString:weixin_AppKey])
{
return [WXApi handleOpenURL:url delegate:self];
}
elseif([urlstrcontainsString:weibo_AppKey])
{
return [WeiboSDK handleOpenURL:url delegate:self];
}
return nil;
}
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
遵守协议
@interface AppDelegate ()<WXApiDelegate,WeiboSDKDelegate>
回到ViewController.m
//分享按钮触发方法
-(void)shareBtnDidPress:(UIButton* )sender
{
//隐藏分享视图
[self hideShareView:nil];
switch(sender.tag) {
case100://微信好友
{
NSLog(@"微信好友分享");
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText=YES;
req.text=shareString;
req.scene=WXSceneSession;
[WXApisendReq:req];
}
break;
case101://朋友圈
{
NSLog(@"朋友圈分享");
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText=YES;
req.text=shareString;
req.scene=WXSceneTimeline;
[WXApisendReq:req];
}
break;
case102://QQ
{
NSLog(@"QQ分享");
}
break;
case103://微博
{
NSLog(@"微博分享");
//实例化分享的帝乡
WBMessageObject *message = [WBMessageObject message];
//分享的样式是文本样式
message.text=shareString;
//分享样式为照片
UIImage* img=[UIImageimageNamed:@"1.jpeg"];
WBImageObject* imageObject=[WBImageObjectobject];
imageObject.imageData=UIImageJPEGRepresentation(img,1.0);
message.imageObject=imageObject;
//分享的样式为网址
//message.mediaObject=@"";
//分享的样式为视频
//message.videoObject=@"";
//将信息分享
WBSendMessageToWeiboRequest * request=[[WBSendMessageToWeiboRequest alloc]init];
request.message=message;
[WeiboSDKsendRequest:request];
}
break;
default:
break;
}
}