如何以相反的方式将项目排序或添加到UITableView?

时间:2012-12-26 23:05:55

标签: objective-c ios cocoa-touch uitableview

所以,我有一个UITableView,其中包含我正在制作的应用的条目。 entriesViewController是它自己的类,带有 .xib 文件。我有一个添加新项目的按钮。

使用以下代码执行此操作:

-(IBAction)newItem:(id)sender {
    LEItem *newItem = [[LEItemStore sharedStore] createItem];
    NSLog(@"New Item = %@", newItem);
    [TableView reloadData];
}

现在这个工作,并添加项目,但它将它放在列表的底部。由于这个应用程序记录了几天的东西,我不希望这个项目按此顺序。最新的项目应放在列表的顶部。我该怎么做呢?我没有看到任何简单的方法将项目添加到顶部的表格视图,但我可能会遗漏一些非常基本的东西。

这似乎不应该很难,我可能只是忽略了一些东西。

欢迎提出意见。

修改

以下是LEItem商店:

//
//  LEItemStore.m
//
//  Created by Josiah Bruner on 10/16/12.
//  Copyright (c) 2012 Infinite Software Technologies. All rights reserved.
//

#import "LEItemStore.h"
#import "LEItem.h"

@implementation LEItemStore
+ (LEItemStore *)sharedStore
{
    static LEItemStore *sharedStore = nil;
    if (!sharedStore)
        sharedStore = [[super allocWithZone:nil] init];

    return sharedStore;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [self sharedStore];
}

-(id)init
{
    self = [super init];
    if (self) {
        NSString *path = [self itemArchivePath];
        allItems = [NSKeyedUnarchiver  unarchiveObjectWithFile:path];

        if (!allItems)
        {
            allItems = [[NSMutableArray alloc] init];
        }
    }

    return self;
}

- (NSArray * )allItems
{
    return allItems;
}
-(LEItem *)createItem
{
    LEItem *p = [LEItem addNewItem];

    [allItems addObject:p];

    return p;
}

- (void)removeItem:(LEItem *)p
{
    [allItems removeObjectIdenticalTo:p];
}

-(void)moveItemAtIndex:(int)from toIndex:(int)to
{
    if (from == to) {
        return;
    }
    LEItem *p = [allItems objectAtIndex:from];

    [allItems removeObjectAtIndex:from];

    [allItems insertObject:p atIndex:to];
}

- (NSString *)itemArchivePath {
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [documentDirectories objectAtIndex:0];

    return [documentDirectory stringByAppendingPathComponent:@"item.archive"];
}

-(BOOL)saveChanges {
    NSString *path = [self itemArchivePath];

    return [NSKeyedArchiver archiveRootObject:allItems toFile:path];
}
@end

5 个答案:

答案 0 :(得分:3)

看起来最简单的解决方案是将-[LEItemStore createItem]修改为:

-(LEItem *)createItem {
    LEItem *p = [LEItem addNewItem];
    [allItems insertObject:p atIndex:0];    
    return p;
}

答案 1 :(得分:1)

即使没有在内部重新排列数组,您也可以这样做。如果您实现数据源并定义了此方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

假设在数组中最旧的对象位于最低的索引处,假设您的表视图有M行,则​​返回索引为M-rowIndex-1的对象格式的单元格。

答案 2 :(得分:1)

除非我遗漏了某些内容,否则在创建新项目后,而不是使用

[allItems addObject:p];

你只需要:

[allItems insertObject:p atIndex:0];

答案 3 :(得分:0)

项目上是否有任何类型的createdDate或其他可排序属性?只需对保留的项目列表(或NSFetchedResultsController)或该属性绑定的任何内容进行排序。

答案 4 :(得分:0)

您可以覆盖LEItem类中的比较机制,并让它轻松比较日期:

-(NSComparisonResult)compare:(LEItem*)otherItem {
     return [self.dateCreated compare:otherItem.dateCreated];
}

然后,只需将sortArrayUsingSelector:与选择器compare:一起使用。