2013-04-19 3 views
0

안녕하세요, 아이폰 사진 라이브러리와 협력하고 있습니다. AssetFramework로 사진 라이브러리에서 모든 사진을 받았습니다. 내가 그 사진을 scrollview에 표시하고 완벽하게 표시하고 이미지 개수가 가정합니다 6. 다음 iam 단일 이미지를 클릭하면 큰 이미지가 표시됩니다. 그것은 또한 행해진 다. 내 문제는 "개수가 12 (두 번 카운트) 이미지를 클릭하면 대형으로 표시됩니다."nsmutableArray에서 중복 데이터를 제거하는 방법

나는 이미지를 얻을 코드 아래 사용 :

- (void)createScrollView 
{ 

@try 
{ 
    NSLog(@"in create scrollview"); 

    //add views to scrolview 
    // UIImageView *backgroundImgView; 
    int x=5; 
    int y=7; 
    NSLog(@"assetsArray/count/createScrollview %d",assetsArray.count); 
    for (int i=0;i<[assetsArray count];i++) 
    { 
     UIView *userView=[[UIView alloc] initWithFrame:CGRectMake(x, y, 70, 80)]; 
     userView.tag=i; 
     UIImageView *backgroundImgView=[[UIImageView alloc] initWithFrame:CGRectMake(1, 1, 70, 70)]; 

     backgroundImgView.tag=1; 

     // [backgroundImgView setImageWithURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF16BigEndianStringEncoding]] placeholderImage:[UIImage imageNamed:@"NoImage.png"]]; 

     //-------------Getting Images from AssetsLibrary ---------- 
     ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
     { 
      galleryObj=[[GalleryObject alloc]init]; 
      ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
      CGImageRef iref = [rep fullResolutionImage]; 
      UIImage *assetsLibraryImage; 
      if (iref) 
      { 
       assetsLibraryImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]]; 
       galleryObj.galleryImage=assetsLibraryImage; 

      } 
      else 
      { 
       assetsLibraryImage = [UIImage imageNamed:@"NoImage.png"]; 
      } 
      //[set addObject:[NSString stringWithFormat:@"1"]]; 
      [uniqueSet addObject:galleryObj]; 
      NSLog(@"uniqueSet data is .....%@",uniqueSet); // Output (3,1,4,2,5) ... all objects 

      [imagesArray addObject:galleryObj]; 
      NSLog(@"imagesArray/resultBlock count is %d array is %@....",imagesArray.count,imagesArray); 

      backgroundImgView.image=assetsLibraryImage; 
     }; 


     ALAsset *al_asset = [assetsArray objectAtIndex:i]; 
     //NSLog(@"al_asset is ......%@",al_asset); 
     al_assetUrl=al_asset.defaultRepresentation.url; 
     //NSLog(@"al_assetUrl is %@",al_assetUrl); 

     ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
     { 
      NSLog(@"ALAssetsLibraryAccessFailureBlock"); 
     }; 

     ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; 
     [assetslibrary assetForURL:al_assetUrl resultBlock:resultblock failureBlock:failureblock]; 


     //-------------Getting Images from AssetsLibrary ---------- 
     UIButton *userButton=[[UIButton alloc]initWithFrame:CGRectMake(1, 1, 70,70)]; 
     [userButton addTarget:self action:@selector(userImageClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     userButton.tag=i; 

       [userView addSubview:backgroundImgView]; 
     [userView addSubview:userButton]; 

     [self.galleryScrollview addSubview:userView]; 

     x+=79; 

     if ((i+1)%4==0) 
     { 
      //if added image is 4th image 
      y+=80; 
      x=5; 
     } 
     // [activity stopAnimating]; 

    } 

    if (y+100>self.galleryScrollview.frame.size.height) 
    { 
     self.galleryScrollview.contentSize=CGSizeMake(320, y+100); 
    } 

    else 
    { 
     self.galleryScrollview.contentSize=CGSizeMake(320, self.galleryScrollview.frame.size.height+60); 
    } 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"exception is %@",exception); 
} 

} 

내가 버튼을 생성하고 조치를 위의 방법에 userImageClicked 것을 알하시기 바랍니다. userImageClicked 버튼을 클릭하면 배열 수가 두 배가됩니다.

왜 이런 일이 발생했는지 알지 못합니다. 난 containsObject 메서드를 사용하여 중복을 제거하려고합니다. 그러나 아무 사용.

위의 방법에서는 UIImageobjectclass에 저장하고 해당 개체를 imagesArray으로 지정했습니다.

또한 값을 저장하기 위해 NSMutableSet을 가져 갔지만 사용하지도 않았습니다.

제발 내 문제를 해결하기 위해 제안 할 수 있습니다.

NSMutableArray *unique = [NSMutableArray array]; 

for (id obj in originalArray) { 
    if (![unique containsObject:obj]) { 
     [unique addObject:obj]; 
    } 
} 
+0

*이 * 중복 데이터를 추가하지, 중복 데이터 *를 제거 잘못된 방향으로 작업하는 이유는 모든 자산 – Leena

+1

*에 대한 고유을 AssetUrl 사용 확인에 작동합니다. – rptwsthi

+0

Google 상위 5-6 ref.에 머리말 만 넣는 것처럼 자동 응답을하고 싶지 않습니다. SO에서 올거야. – Buntylm

답변

1

이 중복 데이터를 삭제하는 방법입니다 이미지를 imagesArray으로 변경 한 다음 어디에서 두 번 호출하지 않는지 확인하십시오. 그렇지 않으면 imagesArray이 다른 곳에서 업데이트되지 않는지 확인하십시오.

그리고이 메서드를 createScrollView 번 이상 호출해야한다면 imagesArray에 이미지를 추가하는 코드를 별도로 작성해야합니다.

+0

그리고이 대답은에서 참조 : http : //stackoverflow.com/questions/1025674/the-best-way-to-remove-duplicate-values-from-nsmutablearray-in-objective-c & http : // stackoverflow. co.kr/questions/1858649/how-to-remove-duplicate-value-in-nsmutablearray ... – Vishal

+0

나는 이것을 시도했지만 작동하지 않습니다. –

+0

이 시도, 더 간단 ... – lakesh

0

위의 경우 추가 유일한 방법입니다 :

이 간단한 방법은 ...

NSArray *copy = [mutableArray copy]; 
NSInteger index = [copy count] - 1; 
for (id object in [copy reverseObjectEnumerator]) { 
    if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) { 
     [mutableArray removeObjectAtIndex:index]; 
    } 
    index--; 
} 

그에 따라 사용하십시오 :

0

문제는 galleryObj을 생성하는 중입니다. 모든 이미지에 대해 새 개체를 만듭니다. 따라서 galleryObj의 모든 인스턴스는 고유합니다.

NSMutableArray 또는 NSWhatever의 NSSet을 사용하든 관계없이 안에galleryObj 개체가 동일한 UIImage인지 알 수 없습니다.

Apple 은 하나의을 캡슐화한다고 명시되어 있습니다. 따라서 JGP와 RAW 그림을 모두 저장 한 경우 두 개를 동일한 그림의 표현으로 구합니다.

그런 경우 하나 또는 다른 유형을 무시해야합니다. RAW 그림과 JPG 그림을 비교하는 것을 권하지 않습니다 (;-)).

0

안녕하세요. 빠른 답장을 보내 주셔서 감사합니다. 3 시간 후 나는 내 문제를 해결했다. 나는 정확한 복제본을 가지고 있으므로 아래 코드를 사용하여 복제본을 제거했다. 나는 그것이 좋은 코드가 아니라는 것을 안다. 그러나 그것은 내 문제를 해결합니다.

if([imagesArray count]>0) 
{ 
    int dupCount=[imagesArray count]/2; 
    int imagesArrayCount=[imagesArray count]; 
    for(int i=dupCount;dupCount<imagesArrayCount;dupCount++) 
    { 
     [imagesArray removeObjectAtIndex:i]; 
    } 

} 

또한 중복 데이터가있는 이유는 무엇입니까? 대답은 내가 블록 코드를 사용하는 것입니다, 그것은 두 번 전화입니다. 배열에는 double 데이터 값이 포함됩니다.

감사합니다 여러분 모두 ...

관련 문제