Question

I am populating a table view with information, but would like it to be populated in reverse, so that any newly added cells (new email messages) would appear on the top, not the bottom.

What am I doing wrong?

    - (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"MailCell";

    MailCell *cell = (MailCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MailCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

        // SLICK
        // Anything that should be the same on EACH cell should be here.

        UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
        myBackView.backgroundColor = [UIColor colorWithRed:15.0/255.0 green:140.0/255.0 blue:198.0/255.0 alpha:1];
        cell.selectedBackgroundView = myBackView;

        cell.selectionStyle = UITableViewCellSelectionStyleGray;
        cell.messageText.textAlignment = NSTextAlignmentLeft;
        cell.messageText.lineBreakMode = NSLineBreakByTruncatingTail;
    }

    NSUInteger row = [indexPath row];

    // Extract Data

    // Use the message object instead of the multiple arrays.

    CTCoreMessage *message = [[self allMessages] objectAtIndex:row];

    // Sender

    CTCoreAddress *sender = [message sender];
    NSString *senderName = [sender name];

    // Subject

    NSString *subject = [message subject];
    if ([subject length] == 0)
    {
        subject = @"(No Subject)";
    }

    // Body

    BOOL isPlain = YES;
    NSString *body = [message bodyPreferringPlainText:&isPlain];
    body = [body stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
    body = [body stringByReplacingOccurrencesOfString:@"\r" withString:@" "];

    // Populate Cell

    [[cell nameText] setText:senderName];
    [[cell subjectField] setText:subject];
    [[cell messageText] setText:body];

    if ([message isUnread])
    {
        UIColor *myColor = [UIColor colorWithRed:15.0/255.0 green:140.0/255.0 blue:198.0/255.0 alpha:1.0];
        cell.nameText.textColor = myColor;
    }
    else
    {
        cell.nameText.textColor = [UIColor blackColor];
    }

    return cell;

}

How I am loading the array:

- (NSMutableArray *)allMessages
{
    if (_allMessages == nil)
    {
        _allMessages = [[NSMutableArray alloc] init];
    }
    return _allMessages;
}
Was it helpful?

Solution

You are pulling from NSArray Index [indexPath row] meaning you are starting at index 0 and going to n. Which means you are not in reverse order. You need to reverse your array first. A simple way would be:

- (void)viewWillAppear:(BOOL)animated
{
    NSArray *allMessages = [self allMessages];
    NSArray* reversedMessages = [[allMessages reverseObjectEnumerator] allObjects];
}

Then in your cellForRowAtIndexPath method you can do:

CTCoreMessage *message = [reversedMessages objectAtIndex:row];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top