所以,我有一个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
答案 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:
一起使用。