0

これが私のアプリの流れです。画像のサムネイルを含む UICollectionview があります。ユーザーは画像を選択し、[保存] ボタンをタップします。画像はカメラロールに保存されます。

これが私がやりたいことです:サブビューを使用して、ユーザーが既にタップして保存したセルをマークしたいと思います。どうすればそれを達成できますか?

これは私がすでに行ったことです....私のアプローチ:明らかに何かが欠けていて、解決できません。

ユーザーが保存ボタンをタップすると、これらの画像の ID がコア データを使用してローカル ストアに正常に保存されます。次に、そのエンティティからオブジェクトを取得し、それらのオブジェクトを配列に配置します。今、取得した配列の画像 ID をコレクション ビューの画像 ID と比較しようとしているので、ID が一致するセルにのみサブビューを追加できます。それが正しいアプローチかどうかはわかりません。

私の愚かな試み:

このメソッドは、ユーザーが [保存] ボタンをタップすると呼び出されますが、正しく機能しません。サブビューをランダムに追加しているように感じます。

-(void)markSavedImages
{
    BOOL isMarked;

    NSArray *savedImages = [self fetchSavedPhotos];

    NSEnumerator *enumerator = [savedImages objectEnumerator];
    NSString *savedImage;
    while (savedImage = [enumerator nextObject]) {
        if ([[self.eventPhotos valueForKey:@"id"] containsObject:savedImage]) {
            isMarked = YES;
        }
        else
        {
            isMarked = NO;
        }
    }

    CVCell *cell = [[CVCell alloc]init];
    for (NSIndexPath *indexPath in self.livePhotosCollectionView.indexPathsForVisibleItems) {
        if (isMarked) {
            cell = (CVCell*)[self.livePhotosCollectionView cellForItemAtIndexPath:indexPath];

            UIImageView *markedImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"markedCVCell.png"]];
            [cell addSubview:markedImage];
            [cell bringSubviewToFront:markedImage];
            cell.userInteractionEnabled = NO;
        }
    }
}

self.eventPhotos、イメージの ID とサーバーへのパスを含む配列です。

みんな助けてください、私はこれで自分を殺していて、グーグルで何も見つかりませんでした。

編集- リクエストに応じて

-(NSArray*)fetchSavedPhotos
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photos" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"eventID ==[c] %@", _eventID];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        NSLog(@"No rows returned");
    }

    NSArray *savedImages = [fetchedObjects valueForKey:@"imageID"];
    return savedImages;

}

いくつかの詳細情報....markSavedImagesメソッドでsavedImages配列を出力すると、取得したい配列を取得できます。このようなもの: (1324,2353,2324). 基本的にはイメージ ID の配列。

4

1 に答える 1

2

まず、一部のセルだけにビューを追加しないでください。これにより、通常、再利用されたセルにビューが表示され、ビューの複数のコピーがセルに追加され、混乱を招き、非効率的になります。

代わりに、すべてのセルにビューを追加します。セルのサブクラスでそれを行い、ビューを公開するか、ビューを表示および非表示にするメソッドを追加します。次に、それだけを行います。セルを返すたびに、サブビューの可視性を設定します。これにより、セルが常に正しく構成され、構成コードが単純になります。

セルを無効にするには、同様のアプローチを使用します。常にセルを有効にするかどうかを選択し、セル全体でユーザー操作を有効に設定します。

データには、ソース イメージ ID のリストと保存されたイメージ ID のリストがあります。セルを構成すると、関連するイメージ ID がわかります。セルにタグを付けて無効にする必要があるかどうかを確認するには、次のようにします。

BOOL saved = [self.savedImages containsObject:imageId];

(現在の ID を選択した ID のリストと比較します。ループは行わないでください)。

于 2013-08-02T20:53:09.093 に答える