单击CollectionViewCell将显示先前选定的单元格而不是当前单元格

时间:2016-01-22 14:52:00

标签: ios objective-c collectionview

我有一个问题,当我点击一个单元格时,没有任何反应,当我点击第二个单元格显示上一个单元格(或我先点击的那个)的数据时,我认为它显示了我错误的index.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 个答案:

答案 0 :(得分:3)

您应该使用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];

}

否则,当您第一次触摸某个项目时,没有任何反应,因为取消选择了该项目。当您再单击第二个项目时,第二个项目会被选中,但第一个项目会被选中 de ,这将调用您当前的实现。但实际上您希望所有代码都发生在最初的选择而不是取消选择