1

現在、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 にすると、同じセルをクリックすると 2 つの別々のオブジェクトが作成されたことがわかりました。何か助けはありますか?

4

3 に答える 3

3

電話するたびに

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

新しい(別個の)executeView オブジェクトを作成します。したがって、エクササイズ名がエクササイズ リスト内のエクササイズ オブジェクトの名前と同じであっても、それはまったく新しいオブジェクトであるため、呼び出す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 に答える