我在两个单独的NSDictionaries
中有推文和Instagram图片,目前我只是通过将每个其他帖子作为推文来聚合帖子,而后者是Instagram图片。我如何处理这两个并组织所有UITableViewCell
并按日期组织它们?
我在想我会从每个值返回created_at
值并将字符串转换为NSDate
,但是我如何为每一条推文和instapic做到这一点?
答案 0 :(得分:2)
在调用cellForRowAtIndexPath之前,您必须使用 creation_date 对推文和 instaPics 数组进行排序。在viewDidLoad中编写此代码,然后重新加载tableView。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
tweets = [tweets sortedArrayUsingDescriptors:sortDescriptors];
instaPics = [instaPics sortedArrayUsingDescriptors:sortDescriptors];
//Reload TableView
[tableView reloadData];
希望这会有所帮助:)
答案 1 :(得分:2)
为了您的目的,您必须创建一个新数组,将单个推文和instaPics数组合并,然后将所有数据排序为单个数据。
合并两个数据数组,如下所示::
NSArray *pictureArray = [tweets arrayByAddingObjectsFromArray: instaPics];
注意:: NSDictionary (NSMutableDictionary)
默认情况下会根据其键值进行排序。这里我们根据包含词典的特定键对数组进行排序
现在将 pictureArray 排序如下::
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
pictureArray = [pictureArray sortedArrayUsingDescriptors:sortDescriptors];
然后将tableview方法重新定义为::
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *tweetsCellIdentifier = @"tweetsCell";
static NSString *instaCellIdentifier = @"instaCell";
UITableViewCell *cell = nil;
BOOL tweets = NO;
// Now you get dictionary that may be of tweets array or instagram array
// Due to its different structure
// I thinks your both dictionaries have different structure
NSDictionary *pictDictionary = pictureArray[indexPath.row];
if (your_check_condition for tweets dictionary) {
tweets = YES;
}
// Get cell according to your dictionary data that may be from tweets or instagram
if (tweets) {
cell = [tableView dequeueReusableCellWithIdentifier:tweetsCellIdentifier];
} else {
cell = [tableView dequeueReusableCellWithIdentifier:instaCellIdentifier];
}
if (cell == nil) {
// Design your cell as you desired;
if (tweets) {
// Design cell for tweets
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tweetsCellIdentifier];
} else {
// Design cell for instagram
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:instaCellIdentifier];
}
}
// Write your login to get dictionary picture data
// Tweets and Instagram array are merged. So get appropriate data with your logic
// May be both dictionaries structure are different. so write your logic to get picture data
// Fill data according tweets dict or instgram
// Get cell elements in which you will show dict data i.e. images, title etc.
if (tweets) {
// Fill cell data for tweets
} else {
// Fill cell data for instagram
}
return cell;
}
以上所有内容在获取pictureArray中的数据后重新加载tableview,如下所示。
//Reload TableView
[tableView reloadData];
它可能对你有帮助。
编辑:: 编辑您的代码如下。我修改你的instgram单元格创建和填充。像这样定义你的推文单元格设计和填充数据就像为instagram
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
static NSString *tweetsCellIdentifier = @"tweetsCell";
static NSString *instaCellIdentifier = @"instaCell";
UITableViewCell *cell = nil;
BOOL tweets = YES;
BOOL twitterLoggedIn = [user boolForKey:@"twitterLoggedIn"];
// Now you get dictionary that may be of tweets array or instagram array
// Due to its different structure
// I thinks your both dictionaries have different structure
NSDictionary *totalFeedDictionary = totalFeed[indexPath.row];
// Get cell according to your dictionary data that may be from tweets or instagram
if (tweets) {
cell = [tableView dequeueReusableCellWithIdentifier:tweetsCellIdentifier];
} else {
cell = [tableView dequeueReusableCellWithIdentifier:instaCellIdentifier];
}
if (cell == nil) {
// Design your cell as you desired;
if (tweets) {
// Now correct it as instagram cell design below your tweets cell design
// Only create here desired elements and its define design pattern here
// Don't Fill here At last already we fill it
// Due to scrolling cells are reuse and must be fill all time when they come from deque cel
// Design cell for tweets
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tweetsCellIdentifier];
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Background.png"]];
NSDictionary *tweet = totalFeed[indexPath.row];
//Set username for twitter
NSString *name = [[tweet objectForKey:@"user"] objectForKey:@"name"];
UILabel *twitterNameLabel = (UILabel *)[cell viewWithTag:202];
[twitterNameLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:12.0]];
[twitterNameLabel setText:name];
//Set status for twitter
NSString *text = [tweet objectForKey:@"text"];
UILabel *twitterTweetLabel = (UILabel *)[cell viewWithTag:203];
[twitterTweetLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:10.0]];
[twitterTweetLabel setText:text];
//Set Profile Pic for twitter
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *imageUrl = [[tweet objectForKey:@"user"] objectForKey:@"profile_image_url"];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *profilePic = (UIImageView *)[cell viewWithTag:201];
profilePic.image = [UIImage imageWithData:data];
//Make the Profile Pic ImageView Circular
CALayer *imageLayer = profilePic.layer;
[imageLayer setCornerRadius:25];
[imageLayer setMasksToBounds:YES];
});
});
//Set number of Favorites for Tweet
NSString *favoritesCount = [[tweet objectForKey:@"user"]objectForKey:@"favourites_count"];
UIButton *favoritesButton = (UIButton *)[cell viewWithTag:204];
[favoritesButton setTitle:[NSString stringWithFormat:@" %@",favoritesCount] forState:UIControlStateNormal];
[favoritesButton setTitle:[NSString stringWithFormat:@" %@",favoritesCount] forState:UIControlStateHighlighted];
favoritesButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Light" size:12];
} else {
// Design cell for instagram
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:instaCellIdentifier];
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Background.png"]];
UIImageView *instagramImageView = [[UIImageView alloc] init];
instagramImageView.tag = 104;
[cell.contentView addSubview:instagramImageView];
UILabel *instagramUserLabel = [[UILabel alloc] init];
instagramUserLabel.tag = 102;
[instagramUserLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:16.0]];
[cell.contentView addSubview:instagramUserLabel];
UILabel *instagramCaptionLabel = [[UILabel alloc] init];
[instagramCaptionLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:12.0]];
instagramCaptionLabel.tag = 103;
[cell.contentView addSubview:instagramCaptionLabel];
UIImageView *instagramProfilePic = [[UIImageView alloc] init];
instagramProfilePic.frame = CGRectMake(35, 31, 50, 50);
instagramProfilePic.tag = 101;
[cell.contentView addSubview:instagramProfilePic];
}
}
// Fill Data here
if (tweets) {
// Now correct as below your tweets cell filling
// Only get here desired elements and fill them here
} else {
NSDictionary *entry = totalFeed[indexPath.row];
NSString *imageUrlString = entry[@"images"][@"low_resolution"][@"url"];
NSURL *url = [NSURL URLWithString:imageUrlString];
UIImageView *instagramImageView = (UIImageView *)[cell viewWithTag:104];
[instagramImageView setImageWithURL:url];
NSString *user = entry[@"user"][@"full_name"];
UILabel *instagramUserLabel = (UILabel *)[cell viewWithTag:102];
[instagramUserLabel setText:user];
UILabel *instagramCaptionLabel = (UILabel *)[cell viewWithTag:103];
if (entry[@"caption"] != [NSNull null] && entry[@"caption"][@"text"] != [NSNull null]) {
NSString *caption = entry[@"caption"][@"text"];
[instagramCaptionLabel setText:caption];
}else{
NSString *caption = @"";
[instagramCaptionLabel setText:caption];
}
NSString *imageUserPicUrl = entry[@"user"][@"profile_pic"][@"url"];
NSURL *profileURL = [NSURL URLWithString:imageUserPicUrl];
UIImageView *instagramProfilePic = (UIImageView *)[cell viewWithTag:101];
[instagramProfilePic setImageWithURL:profileURL];
}
return cell;
答案 2 :(得分:0)
[self.tweets sortUsingComparator:^(Tweet *a, Tweet *b){
return [b.dateCreated compare:a.dateCreated];
}];