iOS 新浪微部落格戶端Demo實踐之(五) 粉絲列表頁面
這個頁面要講述的是使用者的粉絲列表,下面是效果圖:
可以看到這個檢視明顯也是一個tableview,在每一個cell中包含的有三個部分的內容:粉絲頭像image,粉絲暱稱label,我和粉絲之間的相互關注情況button。
在這個頁面我們主要處理的內容有:① 粉絲列表資料的獲取 ②tableview檢視介面的組織(重點是:新增關注和取消關注)
(1)首先是獲取粉絲列表資料,這部分內容沒有什麼好說的,就是些JSON資料,然後解析。呼叫的API:https://api.weibo.com/2/friendships/followers.json。其中有一個點是需要注意的。我們注意到其中API請求的引數:
count | false | int | 單頁返回的記錄條數,預設為50,最大不超過200。 |
cursor | false | int | 返回結果的遊標,下一頁用返回值裡的next_cursor,上一頁用previous_cursor,預設為0。 |
可以知道一次資料請求是以頁的方式返回的,每一頁返回count條數的粉絲記錄,這個和前面微博內容的返回的差不多的,都是以頁為單位返回,但是這裡有一個比較特殊的是,在這個API的資料請求中沒有page這個引數,而是用到了cursor這個引數,這個引數開始是0,以後每一次請求後獲取的資料中就有next_cursor這個返回值,用它來為cursor賦值,就可以繼續獲取接下去的資料了,如果粉絲資料已經全部獲取到了,那麼這個值返回就又是0了。那麼我們在繼續載入的時候就可以新增一個判斷,判斷next_cursor是否為0,如果不為0,說明粉絲列表還沒有載入完畢,可以繼續請求載入;如果為0,則說明所有的粉絲資料都已經載入了,這時就不要繼續再載入了。
下面通過程式碼看看吧!
- (void) loadFollersDataWithCursor:(int) cursor { dispatch_async(dispatch_get_global_queue(0, 0), ^{ dispatch_sync(dispatch_get_global_queue(0, 0), ^{ hud = [[MBProgressHUD alloc] init]; hud.dimBackground = YES; hud.labelText = @"正在載入資料..."; [hud show:YES]; [self.view addSubview:hud]; //同步GET請求粉絲資料 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:[InfoForSina returnFollowersUrlStringWithCursor:cursor]]]; NSError *error; NSData *followersData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; //使用JSONKit解析資料 NSString *follwersString = [[NSString alloc] initWithData:followersData encoding:NSUTF8StringEncoding]; NSDictionary *followersDictionary = [follwersString objectFromJSONString]; NSArray *followersArray = [followersDictionary objectForKey:@"users"]; followersCount = [[followersDictionary objectForKey:@"total_number"] integerValue]; //粉絲總數 nextCursor = [[followersDictionary objectForKey:@"next_cursor"] integerValue]; //粉絲列表 for (NSDictionary *dictionary in followersArray) { User *followersUser = [[User alloc] init]; [followersUser initUserWithDictionary:dictionary]; [self.followersMutableArray addObject:followersUser]; } }); dispatch_sync(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; [hud removeFromSuperview]; }); }); } //處理tableview滑動到底了 - (void) scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint contentOffsetPoint = self.tableView.contentOffset; CGRect frame = self.tableView.frame; if (contentOffsetPoint.y == self.tableView.contentSize.height - frame.size.height) { if (nextCursor!=0) { [self loadFollersDataWithCursor:nextCursor]; } //全部載入完畢 else { MBProgressHUD *endHud = [[MBProgressHUD alloc] init]; endHud.mode = MBProgressHUDModeText; endHud.labelText = @"提示"; endHud.detailsLabelText = @"粉絲資料已全部載入!"; [self.tableView addSubview:endHud]; [endHud show:YES]; [endHud hide:YES afterDelay:0.5]; } } }
注意到其中的nextCursor這個引數,就是用來繼續載入的關鍵引數,在開始的時候
nextCursor = 0;
[self loadFollersDataWithCursor:nextCursor];
以後每一次載入資料的時候就用獲取到的新值為它重新賦值。
(2)tableview檢視介面的組織
這裡粉絲頭像和粉絲的暱稱的顯示就不多說了,很簡單的。程式碼如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"FansCell";
FansCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[FansCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//這裡的User類就是表示一個粉絲
User *aUser = [[User alloc] init];
aUser = [_followersMutableArray objectAtIndex:[indexPath row]];
cell.nameLabel.adjustsFontSizeToFitWidth = YES;
cell.nameLabel.text = aUser.nameString;
//設定按鍵文字
cell.fansButtonLabel.titleLabel.adjustsFontSizeToFitWidth = YES;
if (aUser.following) {
//表示我已經關注了該粉絲
[cell.fansButtonLabel setTitle:@"互相關注" forState:UIControlStateNormal];
}
else {
[cell.fansButtonLabel setTitle:@"+關注" forState:UIControlStateNormal];
}
//設定頭像
__block NSData *imageData;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:aUser.profileImageURL]];
});
dispatch_sync(dispatch_get_main_queue(), ^{
UIImage *image = [[UIImage alloc] initWithData:imageData];
[cell.imageView setImage:image];
});
});
//頭像設定圓角
CALayer *l = [cell.imageView layer]; //獲取ImageView的層
[l setMasksToBounds:YES];
[l setCornerRadius:6.0];
//設定粉絲的id號,這裡只是為取消關注或者新增關注的請求引數用
cell.fansUIDString = aUser.IDString;
return cell;
}
說明:
1、裡面的頭像我設定成圓角,這時需要#import "QuartzCore/QuartzCore.h",其他都可以看懂的吧。
2、其中獲取頭像的方法是:
-(UIImage *) getImageFromURL:(NSString *)fileURL {
UIImage * resultImage = [[UIImage alloc] init];
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
resultImage = [UIImage imageWithData:data];
return resultImage;
}
在這一部分的內容中要值得說明的是我新增的那個按鍵的處理。首先說一下我這個按鍵的作用:我們在獲取到的粉絲JSON資料中有:follow_me和following這兩個項,前者表示的是該粉絲是否關注我,顯然我的粉絲肯定是關注我的啦,所以一直返回是true;後者表示的是我是否關注這個粉絲,有關注返回true,否則就返回false。所以我們就可以在這裡面做點事情了。
如果我沒有關注這個粉絲即following是false的話,button的作用就是可以新增對這個粉絲的關注,button的label就是“+關注”。
如果我關注了這個粉絲即following是true的話,button的作用就是可以取消對這個粉絲的關注,button的label就是“取消關注”;
由於有這部分的處理,所以我定義了一個Fanscell類專門是用於處理cell這部分的內容。
下面著重講的是關注和取消關注粉絲的處理。
①、請求API及引數
二者呼叫時所需的引數除了access_token之外,還要粉絲的uid或者screen_name(二選一),注意前者是long long (int64)型別,後者是string型別,我選用的是uid這個引數。
②、Fanscell類
其中包括的有:
- (IBAction)fansButton:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *fansButtonLabel;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UIImageView *headImageView;
@property (strong, nonatomic) NSString *fansUIDString;//粉絲的UID
其中的fansButton方法是用來處理關注和取消關注粉絲的。
下面先給出處理的過程程式碼再解說:
- (IBAction)fansButton:(id)sender {
destroyFriendships = NO;
creatFriendships = NO;
if ([self.fansButtonLabel.titleLabel.text isEqualToString:@"互相關注"]) {
destroyFriendships = YES;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"是否取消關注" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alert show];
}
else if ([self.fansButtonLabel.titleLabel.text isEqualToString:@"+關注"]) {
creatFriendships = YES;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"是否關注" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alert show];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
//取消關注
if (destroyFriendships && buttonIndex == 1) {
MBProgressHUD *custuonHUD = [[MBProgressHUD alloc]init];
custuonHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
custuonHUD.mode = MBProgressHUDModeCustomView;
[self addSubview:custuonHUD];
NSURL *url = [NSURL URLWithString:FRIENDSHIPS_DESTROY];
ASIFormDataRequest *item = [[ASIFormDataRequest alloc] initWithURL:url];
[item setPostValue:[InfoForSina returnAccessTokenString] forKey:@"access_token"];
[item setPostValue:[NSString stringWithFormat:@"%lld",[_fansUIDString longLongValue]] forKey:@"uid"];
[item setCompletionBlock:^{
[self.fansButtonLabel setTitle:@"+關注" forState:UIControlStateNormal];
custuonHUD.labelText = @"取消關注成功!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:2];
}];
[item setFailedBlock:^{
custuonHUD.labelText = @"取消關注失敗!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:2];
}];
[item startAsynchronous];
}
//新增關注
else if (creatFriendships && buttonIndex == 1) {
//使用ASI這個類庫處理新增關注的資料請求
/*
MBProgressHUD *custuonHUD = [[MBProgressHUD alloc]init];
custuonHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
custuonHUD.mode = MBProgressHUDModeCustomView;
[self addSubview:custuonHUD];
NSURL *url = [NSURL URLWithString:FRIENDSHIPS_CREAT];
ASIFormDataRequest *item = [[ASIFormDataRequest alloc] initWithURL:url];
[item setPostValue:[InfoForSina returnAccessTokenString] forKey:@"access_token"];
[item setPostValue:[NSString stringWithFormat:@"%lld",[_fansUIDString longLongValue]] forKey:@"uid"];
[item setCompletionBlock:^{
[self.fansButtonLabel setTitle:@"互相關注" forState:UIControlStateNormal];
custuonHUD.labelText = @"關注成功!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:1];
}];
[item setFailedBlock:^{
custuonHUD.labelText = @"關注失敗!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:1];
}];
[item startAsynchronous];
*/
//不使用ASI這個類庫處理新增關注的資料請求
NSURL *url = [NSURL URLWithString:FRIENDSHIPS_CREAT];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0];
[request setHTTPMethod:@"POST"];
NSString *postString = [NSString stringWithFormat:@"access_token=%@&uid=%lld",[InfoForSina returnAccessTokenString],[_fansUIDString longLongValue]];
NSMutableData *postData = [[NSMutableData alloc] init];
[postData appendData:[postString dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postData];
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
}
#pragma mark - NSURLConnection delegate Methods
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.responseData = [[NSMutableData alloc] initWithLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.responseData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)theconnection
{
MBProgressHUD *custuonHUD = [[MBProgressHUD alloc]init];
custuonHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
custuonHUD.mode = MBProgressHUDModeCustomView;
[self addSubview:custuonHUD];
NSError *error;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&error];
NSString *idString = [dict objectForKey:@"idstr"];
if(idString) {
[self.fansButtonLabel setTitle:@"互相關注" forState:UIControlStateNormal];
custuonHUD.labelText = @"關注成功!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:2.3];
}
else {
custuonHUD.labelText = @"關注失敗!";
[custuonHUD show:YES];
[custuonHUD hide:YES afterDelay:2.3];
}
[self.connection cancel];
}
-(void)connection:(NSURLConnection *)theconnection didFailWithError:(NSError *)error
{
MBProgressHUD *failedHud = [[MBProgressHUD alloc] init];
failedHud.mode = MBProgressHUDModeText;
failedHud.labelText = @"提示";
failedHud.detailsLabelText = @"發表評論失敗!";
[failedHud show:YES];
[self addSubview:failedHud];
[failedHud hide:YES afterDelay:1.3];
[self.connection cancel];
}
說明:
1、當按下這個button時會觸發一個UIAlertView,提示是否確定關注和取消關注。
2、確定要關注或者取消關注粉絲的處理在UIAlertView的delegate方法中處理。
3、關注和取消關注粉絲的資料請求方式是POST,我們可以用ASIHTTPRequest來非同步方式處理,也可以用不用這個類庫,用系統自帶的方法非同步POST處理。程式碼中有我使用了這這兩種方式。其中取消關注我是使用ASIHTTPRequest,而新增關注是使用系統自帶的方法(當然註釋部分也給出了ASIHTTPRequest的使用程式碼)。
注意,如果是使用系統自帶的方式非同步POST處理,我還添加了兩個property:
@property (strong, nonatomic) NSURLConnection *connection;
@property (strong, nonatomic) NSMutableData *responseData;
通過程式碼可以清楚的看到,前一種處理方式十分簡潔,後一種處理方式由於要實現delegate方法,所以感覺有點麻煩,二者孰好孰不好,自己感覺咯!
4、在資料請求結束我繼續使用MBProgressHUD這個類庫添加了一些提示框,表示關注是否成功或者取消關注是否成功。效果如下:
這個頁面的處理差不多就是這樣了!
相關推薦
iOS 新浪微部落格戶端Demo實踐之(五) 粉絲列表頁面
這個頁面要講述的是使用者的粉絲列表,下面是效果圖: 可以看到這個檢視明顯也是一個tableview,在每一個cell中包含的有三個部分的內容:粉絲頭像image,粉絲暱稱label,我和粉絲之間的相互關注情況button。 在這個頁面我們主要處理的內容有:① 粉絲列表
iOS新浪微部落格戶端開發(1)——新特性介面
轉載自:http://blog.csdn.net/chy305chy/article/details/43118361 看完了MJ老師的微博專案視訊,準備自己動手寫一下,記錄開發中的一些感想。 1、首先判斷是否第一次使用該版本,如果是,先跳轉到新特性介面,否則,直接跳
新浪微部落格戶端開發之授權登入+獲取微博列表
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Java新浪微部落格戶端開發第六步(完結&&開源)
這次所達到的: 1、修復之前幾個嚴重的Bug 1)、檢視別的使用者的微博時,出現當前登入使用者的微博 2)、檢視粉絲時,出現重複載入的情況。 3)、檢視微博評論、轉發時,出現只有第一條點選的微博可以檢視。 2、增加發送帶圖片微博的功能(支援拖拉) 3、對微博正
新浪微部落格戶端開發詳解(三)
上一篇博文中詳細講解了auth2.0的認證過程,本篇博文會詳細講解獲取微博資料並顯示出來的效果。 首先看效果圖: 微博資料獲取之後展示效果如圖所示。 (一) 首先我們從新浪微博的開放平臺說起。身份認證之後,開發者會有三十組介面可以呼叫。 微博普通讀取介面
flexible box佈局微部落格戶端發現頁面練習
大致效果圖如下,原視訊練習在https://www.bilibili.com/video/av17842686?,有附帶原始碼和相關圖片檔案~大家也可以拿來練練手 這次寫的是移動端頁面,需要加上以下程式碼適配screen: <meta name="viewport" content="device-
YiBo微部落格戶端設定自定義尾巴詳細教程之二
最近一年以來,有事沒事,我都在玩新浪微博,而在手機上常用的軟體是“YiBo微博Android版”,被《新週刊》評為2011年度最有價值的手機App之一,因為過於優秀,遭致新浪微博官方版的嫉妒和算計,屢次對YiBo微博介面做出限制,導致YiBo主要功能被閹割。新浪微勃,
Android之UI學習篇十:使用TabHost實現微部落格戶端介面
這裡模擬微部落格戶端進行案例開發,由於沒有圖片資源,所以就做了一個大體結構類似的案例,跟大家分享一下它的實現,這裡採用的是使用xml佈局結合TabActivity控制。 先看看實現的效果: 工程目錄結構: 以下是原始碼: MainActivity.java pac
java——模擬新浪微博用戶註冊
hashset nta 格式不正確 bject object ring tst null append 1.創建用戶類,重寫HashCode()和equals()方法: import java.util.*; public class User{ private
Python爬取新浪微博用戶信息及內容
pro 目標 oss 來源 但是 blog .com 交流 exc 新浪微博作為新時代火爆的新媒體社交平臺,擁有許多用戶行為及商戶數據,因此需要研究人員都想要得到新浪微博數據,But新浪微博數據量極大,獲取的最好方法無疑就是使用Python爬蟲來得到。網上有一些關於使用Py
新浪微博PC客戶端(DotNet WinForm C# 版,C#呼叫新浪微博API程式碼,原始碼下載)—— 初探 (第二部分內建連結)
最近興趣使然嘗試了一下使用DotNet技術實現新浪微博PC客戶端,幾天時間,目前實現登入、微博列表、釋出純文字微博功能,新浪API呼叫基本沒什麼難度,在微博列表形式處理上著實讓我煩躁了一陣子,Windows Form使用不多,這次開發也感覺有些捉襟見肘。 環境:
Android:新浪微博拉起客戶端分享——完美實現同時分享圖片和文字(Intent.ACTION_SEND)
新浪微博拉起客戶端分享——完美實現同時分享圖片和文字(Intent.ACTION_SEND) 點選事件後處理: private void share(String content, Uri uri){
新浪微博評論爬蟲小DEMO
微博模擬登陸(使用者手動輸入): (1) POST代理 (2) COOKIE登陸 http://www.cnblogs.com/EmilySun/p/6158147.html Chrome瀏覽器開啟m.weibo.cn,右鍵點選檢查-> Netwo
[iOS]類似新浪微博或者人人客戶端中,中間UITabBarItem只有圖片,使圖片居中的方法
一、問題描述 老生常談,類似新浪微博或者人人客戶端中,首頁常見UITabBar中間Item只有圖片且圖片位置垂直居中,效果如下圖 二、問題解決 很簡單,比如中間的VC叫MiddleViewController @implementatio
記:新浪微博iOS客戶端開發的電話面試
昨天(2015-10-08)通過種種方式獲得了一次新浪微博iOS客戶端開發的面試機會,先記在這裡。 大四狗,iOS開發經驗不足一年,Swift為主OC開發能力很差,有自己獨立設計的app上架app s
iOS之 接入新浪微博 SDK(微信支付) 的坑(registerApp 的問題)
com .net symbols object type lan creat manager -o 最近在做一個 iOS 的 cocos2d-x 項目接入新浪微博 SDK 的時候被“坑”了,最後終於順利的解決了。發現網上也有不少人遇到一樣的問題,但是能找到的數量有限的解決辦
新浪微博的四宮格驗證碼破解
在我們爬蟲的時候經常會遇到驗證碼,新浪微博的驗證碼是四宮格形式。 可以採用模板驗證碼的破解方式,也就是把所有驗證碼的情況全部列出來,然後拿驗證碼的圖片和這所有情況中的圖片進行對比,然後獲取驗證碼,再通過seleium自動拖拽點選,進行破解。 我們將驗證碼四個點標註為1
新浪微博資深大牛全方位剖析 iOS 高階面試
第5章 Runtime相關面試問題 這章主講Runtime相關的面試問題,Runtime是考察的重點、常考點,如訊息傳遞機制、訊息轉發流程、方法快取查詢過程,對Runtime系統資料結構的理解以及Method-Swizzling、動態方法解析、方法新增等等,基於這些面試題,從對Runtime原始碼分析
iOS開發整合友盟,新浪微博登入授權失敗,responseCode等於5051
在專案中整合友盟第三方登入,新浪微博登入,登入授權失敗,返回狀態碼為5051(獲取賬戶失敗)。 原因: App在測試階段(未上線),授權的微博賬號和開通開放平臺的微博賬號不是同一賬號。 解決辦法: 在新浪微博開放
iOS 第三方新浪微博分享坑i
環境:蘋果機 虛擬機器 +iOS9.2 新浪分享遇見的問題 正常分享是很容易實現的,但我突然想要實現分享圖文功能的想法。 剛開始的時候,我想。shareSDK會提供介面吧,會提供吧。。然而找了半天沒找到,不過還好機智,想到看官方提供的demo,demo地址:http:/