1. 程式人生 > >iOS 新浪微部落格戶端Demo實踐之(五) 粉絲列表頁面

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主要功能被閹割。新浪微勃,

AndroidUI學習篇十:使用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:/