1

目前,我已经编辑了一个将练习对象添加到 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 我的数组时,它表明当我单击同一个单元格时,会创建两个单独的对象。有什么帮助吗?

4

3 回答 3

3

每次打电话

Exercise *exerciseView = [[Exercise alloc] initWithExerciseName:str];

它创建一个新的(不同的)executiveView 对象。因此,即使练习名称可能与练习列表中的练习对象的名称相同,它也是一个全新的对象,因此当您调用时containsObject,结果将始终为 false,并且您的新对象将被添加到数组中。

exerciseName也许您应该在锻炼管理器中存储一个 NSString 列表?

于 2012-04-25T03:05:02.973 回答
2

我会说这是你的罪魁祸首:

Exercise *exerciseView = [[Exercise alloc] initWithExerciseName:str];

从技术上讲,您每次都在创建一个新对象,它不在数组中。containsObject方法只是遍历数组并在每个对象上调用isEqual 。我没有对此进行测试,但理论上,在您的自定义练习对象中,您可以重写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];

希望这有助于解释为什么会发生。我没有测试这段代码,因为有一些缺失的部分,但你应该明白了。玩得开心!

于 2012-04-25T03:17:39.913 回答
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];

希望对你有帮助....

于 2012-04-25T03:29:03.213 回答