2013-11-02 2 views
2

Так что я хочу достичь, когда пользователь нажимает на ячейку из UICollectionView, изображение из этой ячейки отображается на следующем UIView.получить изображение из ячейки в UICollectionView при нажатии

Для реализации этого я использовал метод делегата -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath и NSUserDefaults. Это, как я это делаю

  1. Получить сота похлопал
  2. Получить изображение из UIImageView клетки от # 1
  3. Преобразование изображения в NSData
  4. Поместите данные в NSUserDefaults
  5. Выполните переход к следующему контроллеру представления
  6. Получить данные из NSUserDefaults
  7. Преобразование в UIImage и отображение в UIImageView.

Вот код:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 
    NewsfeedCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    NSData *data = [[NSData alloc]initWithData:UIImagePNGRepresentation(cell.ItemImageView.image)]; 
    NSLog(@"Before Data %@", data); 
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    [def setObject:data forKey:@"feedData"]; 
    [def synchronize]; 
    [self performSegueWithIdentifier:@"itemTappedSegue" sender:self]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [def objectForKey:@"feedData"]; 
    NSLog(@"After Data:%@", data); 
    UIImage *image = [[UIImage alloc]initWithData:data]; 
    self.imageView.image = image; 
} 

Должно работать, но это не так. Я получаю случайные результаты. Иногда в следующем UIView нет изображения, иногда есть изображение, но это не тот, на который я постучал.

EDIT :: здесь реализация для cellForItemAtIndexpath

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
static NSString *CellIdentifier = @"Cell"; 
NewsfeedCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 
if(response2.count > 0){ 
    cell.usernameLabel.text = [self getUsername:[response2 objectAtIndex:indexPath.item]]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible =YES; 
    dispatch_queue_t getUserAvatar = dispatch_queue_create("Avatar downloader", NULL); 
    dispatch_queue_t getFeed = dispatch_queue_create("Feed downloader", NULL); 
    dispatch_async(getUserAvatar, ^{ 
     NSString *urlString = [self getAvatarUrl:[response2 objectAtIndex:indexPath.item]]; 
     NSURL *url = [[NSURL alloc]initWithString:urlString]; 
     NSData *avatarData = [NSData dataWithContentsOfURL:url]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.DPImageView.layer.masksToBounds = YES; 
      cell.DPImageView.layer.cornerRadius = 6.0f; 
      cell.DPImageView.image = [UIImage imageWithData:avatarData]; 
     }); 
    }); 
    dispatch_async(getFeed, ^{ 
     NSString *URLString = [self getFeedUrl:[response2 objectAtIndex:indexPath.item]]; 
     NSURL *URL = [[NSURL alloc]initWithString:URLString]; 
     NSData *feedData = [NSData dataWithContentsOfURL:URL]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.ItemImageView.image = [UIImage imageWithData:feedData]; 
      cell.ItemImageView.layer.masksToBounds = YES; 
      cell.LikeBtn.hidden = NO; 
      cell.CommentBtn.hidden = NO; 
      cell.usernameLabel.hidden = NO; 
      cell.DPImageView.hidden = NO; 
     }); 
    }); 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 
else{ 
    //cell.ItemImageView.image = [UIImage imageNamed:@"NoFeed.png"]; 
    cell.LikeBtn.hidden = YES; 
    cell.CommentBtn.hidden = YES; 
    cell.usernameLabel.hidden = YES; 
    cell.DPImageView.hidden = YES; 
} 
return cell; 

ответ

13

Почему вы делаете:

NewsfeedCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 

? Вам нужно получить ячейку indexPath, а не создать ячейку из пула. Использование:

NewsFeedCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 

Вместо этого.

2

в didSelectItemAtIndexPath: методе изменить линию

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 
    NewsfeedCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; // put this line in place of creating cell 

    NSData *data = [[NSData alloc]initWithData:UIImagePNGRepresentation(cell.ItemImageView.image)]; 
    NSLog(@"Before Data %@", data); 
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    [def setObject:data forKey:@"feedData"]; 
    [def synchronize]; 
    [self performSegueWithIdentifier:@"itemTappedSegue" sender:self]; 
} 
+0

У меня эта вещь происходит сейчас. Изображение из предыдущего крана. Если я впервые коснусь изображения (изображение A), на следующем представлении ничего не получаю. Я возвращаюсь назад, а затем нажимаю другое изображение (изображение B) Я получаю изображение A из предыдущего нажатия – nupac

+0

вы можете показать реализацию cellForItemAtIndexPath: метод – suhit

+0

Прошу прощения за поздний ответ, но я добавил реализацию – nupac

0

Может быть, Вы уже решили эту проблему, но у меня была аналогичная проблема, и выяснили, что UICollectionView начинается с 0.

К примеру моих изображений были названы image_1 , image_2 и так далее. Но если бы я начал с image_1, в первой ячейке ничего не было бы, поэтому вам придется начинать с image_0, image_1 и т. Д.

Надеюсь, это поможет кому угодно.

Смежные вопросы