OStack程序员社区-中国程序员成长平台

标题: ios - 按创建日期组织 UITableViewCell [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:35
标题: ios - 按创建日期组织 UITableViewCell

我在两个单独的 NSDictionaries 中有推文和 instagram 图片,目前我只是通过将所有其他帖子设为推文来聚合帖子,而后者则是 Instagram 图片。我将如何使用这两个并组织所有 UITableViewCell 并按日期组织它们?

我在想我会从每个返回 created_at 值并将字符串转换为 NSDate 的,但我将如何为每条推文和 instapic 执行此操作?



Best Answer-推荐答案


出于您的目的,您必须创建一个新数组,将推文和 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 *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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;
}

在得到图片数组中的数据后重新加载你的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;

关于ios - 按创建日期组织 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20319528/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4