我有一个UITableview与7静态单元格和每个单元格有一个segue到另一个视图。我想让细胞重新排序。在用户重新排序单元格后,我正在将每个单元格的重用id和位置写入NSUserdefaults。
但是,当视图(重新)加载时,我如何告诉Tableview哪个Cell需要显示在哪里。
问好Dirk
通常,在使用静态表视图时,您不会实现数据源方法,但在这种情况下,似乎有必要这样做。我创建了一个IBOutletCollection,并将单元格添加到该数组中(我按照从第一个单元格到最后一个单元格的顺序添加它们,这样它们就会在表第一次加载时出现在故事板中)。在cellForRowAtIndexPath中,你不能取消单元格的队列,因为这对静态单元格不起作用,所以我从outlet集合中获取单元格。我有一个单独的数组,它跟踪单元格应该出现的顺序,这就是我保存到用户默认值的内容。下面是在我的测试中工作的代码,
@interface StaticTableViewController ()
@property (strong,nonatomic) NSMutableArray *cells;
@property (strong, nonatomic) IBOutletCollection(UITableViewCell) NSArray *tableCells;
@end
@implementation StaticTableViewController
-(void)viewDidLoad {
[super viewDidLoad];
self.cells = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"cells"] mutableCopy];
if (! self.cells) self.cells = [@[@0,@1,@2,@3,@4] mutableCopy];
}
- (IBAction)enableReordering:(UIBarButtonItem *)sender {
[self.tableView setEditing:YES animated:YES];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.cells.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger idx = [self.cells[indexPath.row] integerValue];
UITableViewCell *cell = self.tableCells[idx];
return cell;
}
-(BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleNone;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
NSNumber *numberToMove = self.cells[fromIndexPath.row];
[self.cells removeObjectAtIndex:fromIndexPath.row];
[self.cells insertObject:numberToMove atIndex:toIndexPath.row];
[[NSUserDefaults standardUserDefaults] setObject:self.cells forKey:@"cells"];
[[NSUserDefaults standardUserDefaults] synchronize];
}