将对象从一个阵列传输到另一个阵列

时间:2011-08-21 19:07:17

标签: objective-c cocoa-touch nsmutablearray

我遇到了一个小问题。我有一个UITableView有2个部分:文件夹和个人帖子(墨水)。帖子保存到NSMutableArray中,文件夹是包含帖子的数组数组。当您点击“编辑”按钮时,选中每个单元格上显示的标记框,以便检查每个帖子。检查项目后,它将从inks数组中删除并移动到临时数组中。选择要将帖子移动到的文件夹后,临时阵列中的项目将复制到其中一个文件夹阵列中。我使用临时数组传输项目的原因是用户取消选中一个项目,这样就不会从实际数组中删除它。

-(IBAction)checkMarkSelected:(id)sender
{
    if(numberTimesChecked%2==0) { //even times, check
        [appDelegate.inksToFolder addObject:[appDelegate.inks objectAtIndex:[sender tag]]];
        [tempArray removeObjectAtIndex:[sender tag]]; //tempArray is initialized with the contents of appDelegate.inks in the viewDidAppear method, so its just a duplicate
    }
    else //odd times, no check
    {
        [appDelegate.inksToFolder removeObjectAtIndex:[sender tag]];
        [tempArray addObject:[appDelegate.inks objectAtIndex:[sender tag]]];
    }
    numberTimesChecked++;  }

-(IBAction)moveToFolderPressed:(id)sender
{
    NSMutableArray *arrayOfInks=[appDelegate.folders objectAtIndex:[sender tag]];
    [arrayOfInks addObjectsFromArray:appDelegate.inksToFolder];
    [appDelegate.folders replaceObjectAtIndex:[sender tag] withObject:arrayOfInks];
}

所以我面临的问题是如果用户多次点击复选框该怎么办。如果用户按下它偶数次,则表示存在复选标记,如果是奇数次,则没有复选标记,并且不应触摸这些项目。但是,当检查一个项目并且该项目位于inks数组中的索引4时,此项目将移动到索引0处的tempArray。如果未选中该项目,它将如何知道从tempArray中删除项目的位置?因此,如果我检查索引4然后索引2然后索引7然后取消选中索引4,它将尝试从inksToFolder数组中删除索引4中的对象,但该索引不存在。有没有人知道解决方案,甚至是更好的方法来实现这一切?

1 个答案:

答案 0 :(得分:1)

可能有更好的方法来完成这一切。我会跟踪检查哪些行,然后在用户提交操作后才执行数组移动。

但是如果您只是想要一种解决方法来完成当前的技术,那么也许您可以使用NSMutableDictionary作为临时商店。

将对象写入字典:

[myDictionary setObject:myObject forKey:someKey];

密钥的示例:

[myDictionary setObject:myObject forKey:[NSNumber numberWithInt:[sender tag]];

如果首先将它包装在NSNumber中,则可以使用[sender tag]作为字典中的键(NSMutableDictionary的键必须符合NSCopying协议,而NSNumber就是这样)。

根据词典中的键找到一个对象:

[myDictionary objectForKey:someKey];

根据字典中的键删除对象:

[myDictionary removeObjectForKey:someKey];

用户完成所有检查和取消检查后,他们提交移动,然后将对象从临时字典中取出并返回到阵列中,您可以:

从字典中检索所有密钥:

NSArray *keysArray = [myDictionary allKeys];

遍历整个数组并将字典的对象插回到原始数组中:

[myDictionary objectForKey:someKey];

使用NSNumber -intValue将密钥转换回整数以执行插入原始数组:

[myOriginalArray insertObject:myObject atIndex:[someKey intValue]];