iOS - NSMutableDictionary恢复到以前的状态?

时间:2013-06-21 19:54:48

标签: ios uiviewcontroller nsmutabledictionary

我正在尝试在“编辑项目”页面上创建一个“删除”按钮,按下此按钮将返回并删除上一页NSMutableDictionary中的相关条目,然后更新表格视图条目清单。

它从“编辑项目”页面上的IBAction方法开始,它基本上什么也没做,只是将要删除的密钥提供回上一页的控制器:

- (IBAction)deleteItem:(id)sender {
    [_parentController removeItemWithDeleteButton:[_mainFactoidTextField text]];
}

这是动作实际开始的地方(在列表页面上):

- (void)removeItemWithDeleteButton:(NSString *)key {
    [_currentItemsDict removeObjectForKey:key];
    [self.navigationController popViewControllerAnimated:YES];
}

在该方法开始时,_currentItemsDict有8个对象,在调用removeObjectForKey:后将其降至7。然后它弹出顶部的ViewController,即“编辑项目”页面,将我们返回到条目列表。

然后当该方法完成时,断点会立即跳转到:

- (void)viewWillAppear:(BOOL)animated {
    NSArray *tempArray = [NSArray arrayWithArray:[_currentItemsDict allKeys]];
    NSArray *sortedArray = [tempArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
    _currentItemsArray = [NSMutableArray arrayWithArray:sortedArray];

    [_tableView reloadData];
}

但是在viewWillAppear:的第一行,_currentItemsDict已恢复为8个对象。从那时起一切正常,但它都与原来的8个条目一起工作,这意味着什么都没有被删除。

根据我对这些事情的有限经验(我绝对还是初学者),我猜这与popViewControllerAnimated:方法有关,但我无法弄清楚是什么。我已经远远地听说某些变量以不同的方式存储,可能会让它们作为自己的早期版本回归,但我并没有把我的想法包围在这个概念中。或许它完全是别的东西,我不知道。我所能说的是_currentItemDict有7个对象,然后一行后再有8个。

任何人都可以帮助一个新人,并解释我哪里出错了?或者如果它更容易,你能否建议一个更好的解决方案,从另一个ViewController中删除NSMutableDictionary中的条目? (代码示例和教程链接非常受欢迎,因为我现在只是愚蠢到有时无法将理论付诸实践!)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

你知道Objective-C 2.0中的属性是如何工作的吗?我会在你的parentViewController中声明一个属性来包含你的_currentItemsArray,声明为一个强引用。

@property (nonatomic,strong) NSMutableArray *_currentItemsArray;

另外,在childViewController(你想要删除的那个)中设置一个弱属性

@property (nonatomic, weak) NSMutableArray *parentItemsArray;

在推送时在childViewController上设置属性

childViewController.parentItemsArray = self._currentItemsArray;

[self.navigationController pushViewController:childViewController animated:YES];

删除childViewController中数组内的项目,而不是调用parentController上的方法

[self.parentItemsArray removeObjectAtIndex:indexOfKey];

执行此操作,您无需在viewWillAppear中再次对数组进行排序。相反,只需要求tableView重新加载数据

这有什么意义吗?

将您的逻辑包含在cellForRowAtIndexPath,numberOfRowsInSection和其他tableViewDataSource方法中也是明智之举。