[英]Sort NSArray with NSPredicate then store in a new array
我有一个UITableView
通过数组( tableArray
)填充,该数组是从核心数据填充的。
每个UITableViewCell
在创建时都会分配一个数字,并且数字存储在数组中。 ( numberArray
)
当用户对行重新排序时,数字将在数组中移动(当然与tableView
一起使用)
因此,这里使用了两个可变数组。
numberArray
保存TableViewCells
的数字(或顺序)。 我需要对保存UITableViewCell
的文本( tableArray
)的数组进行排序,以反映numberArray
持有的顺序。
同样,这很重要:正如我之前所说,每个单元格都分配有一个数字,该数字存储在numberArray
,
我需要对两个数组进行排序,以将相同的值保存在同一位置。
因此,例如:
tableArray
一些对象:
1) hi
2) whats Up
3) this
4) is cool!
因此您可以看到这里的每个对象都分配了一个数字1-4。 并将每个数字添加到numberArray
。
用户可以移动单元格,因此显然数字的顺序将改变。
所以当视图加载时,我需要获取numberArray
的确切顺序,无论它是
1,2,3,4 or 2,4,3,1
我需要排序的tableArray
反映相同的顺序numberArray
所以当视图加载时,如果numberArray's
顺序是2,3,4,1我想tableArray's
顺序设置为
2“ whats up”,3“ this”,4“很酷!”,1“ hi”。
我相信我可以通过NSPredicate
做到这NSPredicate
。
任何帮助是极大的赞赏!
编辑
cellForRow:
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * identifier = @"identifier";
self.myCell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (self.myCell == nil) {
self.myCell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
HandgunAmmo *handgunAmmo = [self.tableArray objectAtIndex:indexPath.row];
self.myCell.brandLabel.text = handgunAmmo.brand;
self.myCell.caliberLabel.text = handgunAmmo.caliber;
self.myCell.numberOfRoundsLabel.text = handgunAmmo.numberOfRounds;
return self.myCell;
}
在我的viewWIllAppear
方法中:
- (无效)viewWillAppear中:(BOOL)动画{
if (self.context == nil)
{
self.context = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"HandgunAmmo" inManagedObjectContext:self.context];
[request setEntity:entity];
NSError *error;
NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];
[self setTableArray:array];
[self.ammoTable reloadData];
[super viewWillAppear:YES];
}
因此,更改数组时不能保持持久性的原因是因为我正在从核心数据中加载数据,并且我调用了[self setTableArray:array];
它将所有数据从核心数据重新加载到数组中,然后使用数组填充tableview。 所以我需要能够对array
进行排序,然后再将其设置为self.tableArray
。
感谢您的帮助!
为什么不保留tableArray
不变,而将numberArray
用作另一个数组的索引 。
您可以使用以下方式将numberArray
初始化为numberArray
0, 1, 2, ..., n-1
numberArray = [NSMutableArray array];
for (NSUInteger i = 0; i < [tableArray count]; i++) {
[numberArray addObject:[NSNumber numberWithUnsignedInteger:i]];
}
当需要一个项目时,例如在cellForRowAtIndexPath
,可以通过索引访问它:
NSUInteger i = [[numberArray objectAtIndex:row] unsignedIntegerValue];
NSString *item = [tableArray objectAtIndex:i];
现在,您只需要对numberArray
进行重新排序,更改将自动反映在表视图中。
更新:在这里可以找到一种很好的解决方案来处理表视图中的核心数据对象的重新排序: UITableView核心数据重新排序
NSMutableArray *unsortedArray = [NSMutableArray arrayWithObjects:@"1) hi",@"2) whats Up",@"3) this",@"4) is cool!",nil];
NSArray *guideArray = [NSArray arrayWithObjects:@"2",@"4",@"3",@"1", nil];
for(int i=0; i< [guideArray count];i++)
{
for(int j=0; j< [unsortedArray count];j++)
{
if([[[unsortedArray objectAtIndex:j] substringToIndex:[[guideArray objectAtIndex:i] length]] isEqualToString:[guideArray objectAtIndex:i]])
//if([[unsortedArray objectAtIndex:j] containsObject:[guideArray objectAtIndex:i]])
{
[unsortedArray exchangeObjectAtIndex:j withObjectAtIndex:i];
break;
}
}
}
NSLog(@"%@",unsortedArray);
要么
guideArray = @[@"2",@"4",@"3",@"1"];
unsortedArray = [@[@[@"1) hi"],
@[@"2) wats up "],
@[@"3) this,"],
@[@"4) cool"]] mutableCopy];
[unsortedArray sortUsingComparator:^(id o1, id o2) {
NSString *s1 = [o1 objectAtIndex:0];
s1 = [s1 substringToIndex:[s1 rangeOfString:@")"].location];
NSString *s2 = [o2 objectAtIndex:0];
s2 = [s2 substringToIndex:[s2 rangeOfString:@")"].location];
NSInteger idx1 = [guideArray indexOfObject:s1];
NSInteger idx2 = [guideArray indexOfObject:s2];
return idx1 - idx2;
}];
NSLog(@"%@",unsortedArray);
尝试此希望部分帮助。
我看不到用谓词解决问题的方法
NSArray *stringArray = @[@"hi", @"what's up?", @"this", @"is cool"];
NSArray *numberArray = @[@2, @4, @3, @1];
NSMutableArray *combinedArray = [NSMutableArray array];
//connect string with the numbers of there new position
[numberArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSString *string =stringArray[[obj integerValue]-1];
[combinedArray addObject:@[string, obj]];
}];
NSMutableArray *orderedArray = [NSMutableArray array];
[combinedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[orderedArray addObject:obj[0]];
}];
NSLog(@"%@", orderedArray);
结果
(
"what's up?",
"is cool",
this,
hi
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.