将对象插入NSMutableArray

时间:2012-04-25 02:58:27

标签: iphone objective-c cocoa-touch nsmutablearray

目前,我已经编辑了一个委托函数,它将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我的数组时,它显示当我点击同一个单元格时,创建了两个单独的对象。有什么帮助吗?

3 个答案:

答案 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];

希望,这会对你有帮助....