目前,我已经编辑了一个委托函数,它将Exercise对象添加到NSMutableArray中。但是,我不想添加重复的对象,相反,如果对象已经在数组中,我只想访问该特定对象。
这是我的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSString *str = cell.textLabel.text; // Retrieves the string of the selected cell.
Exercise *exerciseView = [[Exercise alloc] initWithExerciseName:str];
WorkoutManager *workoutManager = [WorkoutManager sharedInstance];
if (![[workoutManager exercises] containsObject:exerciseView]) {
[[workoutManager exercises] insertObject:exerciseView atIndex:0];
[self presentModalViewController:exerciseView animated:YES];
NSLog(@"%@", [workoutManager exercises]);
}
else {
[self presentModalViewController:exerciseView animated:YES];
NSLog(@"%@", [workoutManager exercises]);
}
}
我认为这样可行,但是,当我运行我的代码和NSLogged我的数组时,它显示当我点击同一个单元格时,创建了两个单独的对象。有什么帮助吗?
答案 0 :(得分:3)
每次致电
Exercise *exerciseView = [[Exercise alloc] initWithExerciseName:str];
它创建一个新的(不同的)exerciseView对象。因此,即使练习名称可能与练习列表中练习对象的名称相同,但它是一个全新的对象,因此当您调用containsObject
时,结果将始终为false,并且您的新对象将被添加到阵列。
也许您应该在锻炼经理中存储NSString exerciseName
的列表?
答案 1 :(得分:2)
我想说这是你的罪魁祸首:
Exercise *exerciseView = [[Exercise alloc] initWithExerciseName:str];
每次技术创建新对象时,它都不在数组中。 containsObject 方法只是迭代数组并在每个对象上调用 isEqual 。我没有对此进行测试,但从理论上讲,在自定义的Exercise对象中,您可以覆盖 isEqual 方法来比较练习名称属性,如果匹配则返回true。当你使用 containsObject 时,一切都必须匹配,所以即使所有属性都相同,objectid也不是。
轻松修复,无需查看练习实施:
Exercise *exerciseView = nil;
For(Exercise *exercise in [[WorkoutManager sharedInstance] exercises]){
if(exercise.exerciseName == str) {
exerciseView = exercise;
break;
}
}
if(exerciseView == nil) {
exerciseView = [[Exercise alloc] initWithExerciseName:str];
[[workoutManager exercises] insertObject:exerciseView atIndex:0];
}
[self presentModalViewController:exerciseView animated:YES];
希望这有助于解释为什么会发生这种情况。我没有测试这个代码,因为有一些缺失的部分,但你应该得到这个想法。玩得开心!
答案 2 :(得分:0)
WorkoutManager *workoutManager = [WorkoutManager sharedInstance];
Exercise *temp = [[Exercise alloc] initWithExerciseName:str];
for(id temp1 in workoutManager)
{
if( [temp isKindOfClass:[Exercise class]])
{
NSLog(@"YES");
// You Can Access your same object here if array has already same object
}
}
[temp release];
[workoutManager release];
希望,这会对你有帮助....