1

所以,我有一个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
4

5 回答 5

3

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

-(LEItem *)createItem {
    LEItem *p = [LEItem addNewItem];
    [allItems insertObject:p atIndex:0];    
    return p;
}
于 2012-12-26T23:28:09.137 回答
1

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

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

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

于 2012-12-26T23:14:10.490 回答
1

除非我遗漏了什么,否则在您创建新项目后,而不是使用

[allItems addObject:p];

您只需:

[allItems insertObject:p atIndex:0];
于 2012-12-26T23:29:28.457 回答
0

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

于 2012-12-26T23:13:14.840 回答
0

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

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

然后,只需使用sortArrayUsingSelector:selector即可compare:

于 2012-12-26T23:28:33.240 回答