// // MainTableViewController.m // mifd // // Created by 이종현 on 2013. 11. 20.. // Copyright (c) 2013년 belhyun. All rights reserved. // #import "MainTableViewController.h" #import "MainTableViewCell.h" #import "HttpClient.h" #import "AppDelegate.h" #define FONT_SIZE 14.0f #define CELL_CONTENT_WIDTH 320.0f #define CELL_CONTENT_MARGIN 5.0f #define CELL_EXTRA_AREA 60.0f; const int kLoadingCellTag = 1273; @interface MainTableViewController () @property(nonatomic,assign) Boolean isExpand; @property (nonatomic, retain) NSMutableArray *tweets; -(void)pullToRefresh; -(void)stopRefresh; -(void)scrollToTop; -(void)retweetButtonPressed:(id)sender; -(void)favoriteButtonPressed:(id)sender; -(void)retweetDelButtonPressed:(id)sender; -(void)favoriteDelButtonPressed:(id)sender; -(void)snsRequest:(NSString *)url :(id)sender :(NSMutableDictionary *)params :(NSString *)type :(void (^)(void))callbackBlock; -(void)mifdRequest:(NSMutableDictionary *)params :(NSUInteger) rowId; @end @implementation MainTableViewController - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; self.tableView.separatorColor = [UIColor yellowColor]; self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 10, 0); UITabBarItem *tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:0]; tabBarItem.image = [UIImage imageNamed:@"twitter_thumb.png"]; self.tweets = [[NSMutableArray alloc]init]; self.isExpand = false; self.curPage = 1; self.HUD = [[MBProgressHUD alloc] initWithView:self.view]; [self.view addSubview:self.HUD]; self.HUD.delegate = self; [self.HUD show:YES]; UIRefreshControl *refresh = [[UIRefreshControl alloc]init]; refresh.attributedTitle = [[NSAttributedString alloc]initWithString:@"Pull to refresh" attributes:nil]; [refresh addTarget:self action:@selector(pullToRefresh) forControlEvents:UIControlEventValueChanged]; self.refreshControl = refresh; self.tableView.dataSource = self; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchTweetsWithInit) name:@"fetchTweets" object:nil]; [self fetchTweets]; } -(void)pullToRefresh{ self.curPage = 1; self.tweets = [[NSMutableArray alloc]init]; [self fetchTweets]; [self performSelector:@selector(stopRefresh) withObject:nil afterDelay:1.5]; } -(void)stopRefresh{ [self.refreshControl endRefreshing]; } -(void) scrollToTop { if ([self numberOfSectionsInTableView:self.tableView] > 0) { NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0]; [self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. if(self.curPage < self.totalPage){ return self.tweets.count + 1; } return self.tweets.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return 1; } -(void)changeLoginView{ [[[UIAlertView alloc] initWithTitle:@"MIFD" message:@"트위터 로그인이 필요합니다." delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil, nil] show]; self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:1]; } -(void)changeTweetView{ self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0]; } - (Boolean)isDefinedEle:(NSArray *)array :(NSInteger)tag{ NSEnumerator *enumerator = [array objectEnumerator]; id anObject; if([array count] == 0) return false; while (anObject = [enumerator nextObject]) { if(((UIView *)anObject).tag == tag){ return true; } } return false; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ UIView *headerView = [[UIView alloc] init]; headerView.backgroundColor = [UIColor clearColor]; return headerView; /* UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)]; UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)]; headerLabel.textAlignment = UITextAlignmentRight; headerLabel.backgroundColor = [UIColor clearColor]; NSInteger tbHeight = 50; UIToolbar *tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, tbHeight)]; tb.translucent = YES; UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"완료" style:UIBarButtonItemStyleBordered target:self action:@selector(completeSelect)]; NSArray *barButton = [[NSArray alloc] initWithObjects:flexibleSpace,doneButton,nil]; [tb setItems:barButton]; [headerView addSubview:tb]; barButton = nil; [headerView addSubview:headerLabel]; return headerView; */ } -(void) expandRow:(UITapGestureRecognizer *)gr{ /* MainTableViewCell *view = (MainTableViewCell *)gr.view; if(self.isExpand){ self.isExpand = false; }else{ self.isExpand = true; } [self.tableView beginUpdates]; [self.tableView endUpdates]; */ } -(void) fetchTweetsWithInit{ self.curPage = 1; self.tweets = [[NSMutableArray alloc]init]; [self fetchTweets]; } -(void) fetchTweets{ HttpClient *httpClient = [HttpClient sharedClient]; [httpClient GET:[NSMutableString stringWithFormat:@"%@?page=%d&user_desc=%@",RANK,self.curPage,[User getUserDesc]] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { [self.HUD hide:YES]; self.totalPage = [[responseObject objectForKey:@"total_page"] intValue]; self.totalCount = [[responseObject objectForKey:@"total_count"] intValue]; responseObject = [responseObject objectForKey:@"tweets"]; for(id tweetDictionary in responseObject){ Tweet *tweet = [[Tweet alloc] initWithDictionary:tweetDictionary]; [self.tweets addObject:tweet]; } [self.tableView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [self.HUD hide:YES]; NSLog(@"Error: %@", error); }]; } -(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{ return nil; } -(void)retweetButtonPressed:(id)sender{ UIButton *clicked = (UIButton *) sender; if([User isLogged]){ [self.HUD show:true]; [self snsRequest:[NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/retweet/%@.json",((Tweet *)[self.tweets objectAtIndex:clicked.tag]).uuid] :sender :nil :@"R" :^(void){ NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setObject:[MifdKeychainItemWrapper keychainStringFromMatchingIdentifier:@"desc"] forKey:@"user_desc"]; [params setObject:((Tweet *)[self.tweets objectAtIndex:clicked.tag]).uuid forKey:@"tweet_uuid"]; [params setObject:@"R" forKey:@"type"]; [self mifdRequest:params :clicked.tag]; }]; }else{ [self changeLoginView]; } } -(void)favoriteButtonPressed:(id)sender{ UIButton *clicked = (UIButton *) sender; if([User isLogged]){ [self.HUD show:true]; NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init]; [dictionary setObject:((Tweet *)[self.tweets objectAtIndex:clicked.tag]).uuid forKey:@"id"]; [self snsRequest:@"https://api.twitter.com/1.1/favorites/create.json" :sender :dictionary :@"F" :^(void){ NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setObject:[MifdKeychainItemWrapper keychainStringFromMatchingIdentifier:@"desc"] forKey:@"user_desc"]; [params setObject:((Tweet *)[self.tweets objectAtIndex:clicked.tag]).uuid forKey:@"tweet_uuid"]; [params setObject:@"F" forKey:@"type"]; [self mifdRequest:params :clicked.tag]; }]; }else{ [self changeLoginView]; } } -(void)retweetDelButtonPressed:(id)sender{ if([User isLogged]){ [self.HUD hide:true]; [[[UIAlertView alloc] initWithTitle:@"MIFD" message:@"이미 retweet 하셨네요!" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil, nil] show]; }else{ [self changeLoginView]; } } -(void)favoriteDelButtonPressed:(id)sender{ if([User isLogged]){ [self.HUD hide:true]; [[[UIAlertView alloc] initWithTitle:@"MIFD" message:@"이미 favorite 하셨네요!" delegate:self cancelButtonTitle:@"취소" otherButtonTitles:nil, nil] show]; }else{ [self changeLoginView]; } } -(void)mifdRequest:(NSMutableDictionary *)params :(NSUInteger)tag{ HttpClient *httpClient = [HttpClient sharedClient]; [httpClient POST:[NSMutableString stringWithFormat:@"%@",USER_TWEET] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { [self.HUD hide:YES]; if([[responseObject objectForKey:@"result"] integerValue] == 1){ UserTweet *userTweet = [[UserTweet alloc]init]; userTweet.tweetUuid = [params objectForKey:@"tweet_uuid"]; userTweet.userDesc = [User getUserDesc]; if([[params objectForKey:@"type"] isEqualToString:@"F"]){ userTweet.type = @"F"; }else if([[params objectForKey:@"type"] isEqualToString:@"R"]){ userTweet.type = @"R"; } [((Tweet *)[self.tweets objectAtIndex:tag]).userTweets addObject:userTweet]; [self.tableView reloadData]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [self.HUD hide:YES]; NSLog(@"Error: %@", error); }]; } -(void)snsRequest:(NSString *)url :(id)sender :(NSMutableDictionary *)params :(NSString *)type :(void (^)(void))callbackBlock{ ACAccountStore *accountStore = [[ACAccountStore alloc]init]; ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [self.HUD show:YES]; if([MifdKeychainItemWrapper keychainStringFromMatchingIdentifier:@"desc"] != nil){ NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; if ([accountsArray count] > 0) { ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; NSURL *requestUrl = [NSURL URLWithString:url]; SLRequest *posts = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:requestUrl parameters:params]; [posts setAccount:twitterAccount]; [posts performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { callbackBlock(); }]; } }else{ //로그인이 되어있지 않을 때 } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"tweet"; UITableViewCell *cell = nil; if(indexPath.section >= self.tweets.count){ return [self loadingCell]; } cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if(cell == nil){ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } if ((([cell.contentView viewWithTag:1]))) { [[cell.contentView viewWithTag:1]removeFromSuperview]; } Tweet *tweet = [self.tweets objectAtIndex:indexPath.section]; MainTableViewCell *subCell = [[MainTableViewCell alloc]init]; subCell.itemId = indexPath.section; [subCell setFrame:CGRectMake(10, 0, cell.contentView.bounds.size.width-18, cell.bounds.size.height)]; subCell.backgroundColor = [UIColor yellowColor]; [subCell setTag:indexPath.section]; subCell.tag = 1; //UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(expandRow:)]; //[subCell addGestureRecognizer:tap]; [cell.contentView addSubview:subCell]; TTTAttributedLabel *text = [[TTTAttributedLabel alloc] init]; text.delegate = self; text.enabledTextCheckingTypes = NSTextCheckingTypeLink; text.text = (NSString *)[[self getText:tweet] mutableCopy]; [text setNumberOfLines:0]; [text setFrame:CGRectMake(60, 0, cell.contentView.bounds.size.width-85, cell.bounds.size.height)]; //[text setBackgroundColor:[UIColor redColor]]; [text sizeToFit]; [[subCell contentView] addSubview:text]; UIImageView * imageView = [[UIImageView alloc] init]; [imageView setFrame:CGRectMake(0, 0, 50.0, 50.0)]; [[subCell contentView] addSubview:imageView]; [HttpClient downloadingServerImageFromUrl:imageView AndUrl:tweet.user.image]; UIButton *retweetBtn = [[UIButton alloc]initWithFrame:CGRectMake(55.0, text.frame.size.height+((cell.bounds.size.height-text.frame.size.height)/6.0), 30.0, 30.0)]; [retweetBtn setReversesTitleShadowWhenHighlighted:YES]; [retweetBtn setShowsTouchWhenHighlighted:YES]; retweetBtn.tag = indexPath.section; [retweetBtn setBackgroundImage:[UIImage imageNamed:@"twitter_retweet"] forState:UIControlStateNormal]; if(![self isAlreadyRetweet:tweet]){ [retweetBtn addTarget:self action:@selector(retweetButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; }else{ [retweetBtn addTarget:self action:@selector(retweetDelButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; } [subCell.contentView addSubview:retweetBtn]; UIButton *favoriteBtn = [[UIButton alloc]initWithFrame:CGRectMake(110.0, text.frame.size.height+((cell.bounds.size.height-text.frame.size.height)/6.0), 30.0, 30.0)]; [favoriteBtn setReversesTitleShadowWhenHighlighted:YES]; [favoriteBtn setShowsTouchWhenHighlighted:YES]; favoriteBtn.tag = indexPath.section; [favoriteBtn setBackgroundImage:[UIImage imageNamed:@"favorite"] forState:UIControlStateNormal]; if(![self isAlreadyFavorite:tweet]){ [favoriteBtn addTarget:self action:@selector(favoriteButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; }else{ [favoriteBtn addTarget:self action:@selector(favoriteDelButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; } [subCell.contentView addSubview:favoriteBtn]; [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell setSelected:NO animated:NO]; cell.userInteractionEnabled = YES; return cell; } -(Boolean)isAlreadyRetweet:(Tweet *)tweet{ if(tweet.userTweets == nil){ return false; } for(NSUInteger i=0;i
2013년 12월 12일 목요일
[iOS] tableview dynamic height
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기