Нажмите CollectionViewCell отображает ранее выбранную ячейку вместо текущей

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

#define API_V3_CHANNEL_URL @"examples.json"

    @interface MSContestListViewController ()

    @end

    @implementation MSContestListViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.

        CGRect frame = CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height);

        NSArray *colors = [[NSArray alloc] initWithObjects:
                           [UIColor colorWithRed:1 green:0.529 blue:0.357 alpha:1.0],
                           [UIColor colorWithRed:1 green:0.439 blue:0.357 alpha:1.0],
                           [UIColor colorWithRed:0.937 green:0.302 blue:0.357 alpha:1.0],
                           [UIColor colorWithRed:0.737 green:0.212 blue:0.357 alpha:1.0],
                           nil];

        CAGradientLayer *gradient = [DREasyGradient gradientWithFrame:frame
                                                          orientation:DRHorizontalGradient
                                                               colors:colors];


        [self.view.layer insertSublayer:gradient atIndex:0];


        _segmentedControl.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];

        [self fetchEntries];
        [self fetchEntriesWinner];
        [self fetchEntriesPhotos];

    }

    - (void)fetchEntries
    {
        NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]];
        NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil];
        //self.readArray = [searchDict objectForKey:@"CONTESTS"];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"LIVE"];
        self.readArray = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate];

        NSLog(@"%@", self.readArray);

    }

    - (void)fetchEntriesWinner
    {
        NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]];
        NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil];
        //self.readArray = [searchDict objectForKey:@"CONTESTS"];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"ARCHIVED"];
        self.readArrayWinner = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate];

        NSLog(@"winner array : %@", self.readArrayWinner);

    }

    - (void)fetchEntriesPhotos
    {
        NSString *searchURL = [API_V3_CHANNEL_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSData *searchData = [NSData dataWithContentsOfURL:[NSURL URLWithString:searchURL]];
        NSDictionary *searchDict =[NSJSONSerialization JSONObjectWithData:searchData options:NSJSONReadingMutableContainers error:nil];
        //self.readArray = [searchDict objectForKey:@"CONTESTS"];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", @"LIVE"];
        self.readArrayPhotos = [[searchDict objectForKey:@"CONTESTS"] filteredArrayUsingPredicate:predicate];

        NSLog(@"%@", self.readArray);

    }

    - (IBAction)segmentedControlAction:(id)sender
    {
        switch(_segmentedControl.selectedSegmentIndex)
        {
            case 0:

                if(self.readArray.count == 0)
                {
                    [self fetchEntries];
                } else {

                    [self.collectionView reloadData];
                }
                break;

            case 1:
                if(self.readArrayWinner.count == 0)
                {
                    [self fetchEntriesWinner];
                } else {
                    [self.collectionView reloadData];
                }
                break;

            case 2:
                if(self.readArrayPhotos.count == 0)
                {
                    [self fetchEntriesPhotos];
                } else {
                    [self.collectionView reloadData];
                }
                break;

            default:
                break;

        }

    }

    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    {

        switch (_segmentedControl.selectedSegmentIndex) {
            case 0:
                return [self.readArray count];
                break;

                case 1:
                return [self.readArrayWinner count];
                break;

                case 2:
                return [self.readArrayPhotos count];
                break;

            default:
                break;
        }

        return 0;
    }

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {

        static NSString *CellIdentifier = @"pictureCell";

        MSContestListCollectionViewCell *cell = (MSContestListCollectionViewCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

        cell.titleContest.adjustsFontSizeToFitWidth = YES;
        cell.titleContest.minimumScaleFactor = 0.5;

        cell.pictureImageView.layer.cornerRadius = 5;
        cell.pictureImageView.clipsToBounds = YES;

        cell.titleView.layer.cornerRadius = 5;
        cell.titleView.clipsToBounds = YES;

        switch (_segmentedControl.selectedSegmentIndex) {
            case 0: {
                NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item];
                NSString *stringImage = [searchResult objectForKey:@"featuredImage"];

                NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage];
                [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image]
                                         placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

                cell.titleContest.text = [searchResult objectForKey:@"description"];
                cell.statusContest.text = [searchResult objectForKey:@"status"];
                break;
            }
            case 1: {
                NSDictionary *searchResult2 = [self.readArrayWinner objectAtIndex:indexPath.item];
                NSString *stringImage = [searchResult2 objectForKey:@"featuredImage"];

                NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage];
                [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image]
                                         placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

                cell.titleContest.text = [searchResult2 objectForKey:@"description"];
                cell.statusContest.text = [searchResult2 objectForKey:@"status"];
                break;
            }
            case 2: {
                NSDictionary *searchResult3 = [self.readArrayPhotos objectAtIndex:indexPath.item];
                NSString *stringImage = [searchResult3 objectForKey:@"featuredImage"];

                NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage];
                [cell.pictureImageView sd_setImageWithURL:[NSURL URLWithString:image]
                                         placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

                cell.titleContest.text = [searchResult3 objectForKey:@"description"];
                cell.statusContest.text = [searchResult3 objectForKey:@"status"];
                break;
            }

            default:
                break;
        }

        return cell;
    }

    - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
    {

        NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item];
        NSString *videoID = [searchResult objectForKey:@"description"];
        NSString *stringImage = [searchResult objectForKey:@"featuredImage"];
        NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage];

        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
                                                                 bundle: nil];
        MSContestDetailViewController *yourController = (MSContestDetailViewController *)[mainStoryboard
                                                                                      instantiateViewControllerWithIdentifier:@"contestDetailViewController"];

        yourController.urlImage = image;
        yourController.contestName = videoID;
        yourController.contestTime = [searchResult objectForKey:@"drawDate"];

        [self.navigationController pushViewController:yourController animated:YES];

    }


    @end

1 ответ

Решение

Вы должны использовать didSelectItemAtIndexPath функция вместо didDeselectItemAtIndexPath:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *searchResult = [self.readArray objectAtIndex:indexPath.item];
    NSString *videoID = [searchResult objectForKey:@"description"];
    NSString *stringImage = [searchResult objectForKey:@"featuredImage"];
    NSString *image = [NSString stringWithFormat:@"https://srv.mediaswapp.com/%@", stringImage];

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
                                                             bundle: nil];
    MSContestDetailViewController *yourController = (MSContestDetailViewController *)[mainStoryboard
                                                                                  instantiateViewControllerWithIdentifier:@"contestDetailViewController"];

    yourController.urlImage = image;
    yourController.contestName = videoID;
    yourController.contestTime = [searchResult objectForKey:@"drawDate"];

    [self.navigationController pushViewController:yourController animated:YES];

}

В противном случае, когда вы впервые касаетесь предмета, ничего не происходит, потому что ничто не отменяется. Когда вы затем щелкаете по второму элементу, выбирается второй, но выбирается первый, что вызывает вашу текущую реализацию. Но вы на самом деле хотите, чтобы весь ваш код происходил при начальном выборе, а не при отмене выбора.

Другие вопросы по тегам