我正在尝试在“编辑项目”页面上创建一个“删除”按钮,按下此按钮将返回并删除上一页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
中的条目? (代码示例和教程链接非常受欢迎,因为我现在只是愚蠢到有时无法将理论付诸实践!)
提前感谢您的帮助!
答案 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方法中也是明智之举。