UICollection View - Segue - did select specific cell , LOG

流过昼夜 提交于 2020-01-01 05:44:23

问题


I am starting to use a UICOllectionview to load a custom made photo album, the album loads just fine, and the data is coming from my server (SQL-JSON-NSARRAY-NSDictionary) and been populated in the cell's just fine, However now I would like it when the user selects that cell to load a new UIVIewController with that image in full size (so they can view/print/share etc)

However I am getting stuck in the 'prepare for segue' method, as I cannot pull any information from that specific cell

as a test right now I just want a NSLOG to say "the User selected TITLE OF ALBUM %@ "

Here is my code thus far, any help would greatly be appreciated...

#import "AlbumViewController.h"
#import "AlbumCustomCell.h"
#import "PhotosInAlbumsViewController.h"

@interface AlbumViewController ()

@end

@implementation AlbumViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    /// Grab Photo Album information (pics,title,date) From Server



    NSString *myURL1 = [ NSString stringWithFormat:         @"http://mywebsiteaddress.com/index.php"];
    NSData *data = [NSData dataWithContentsOfURL: [NSURL URLWithString:myURL1]];
    NSError *error;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    NSArray *items = [json objectForKey:@"users"];
    photoalbumarray = items;
   // NSLog(@"%@", photoalbumarray);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;

}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
  return [photoalbumarray count];
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellID = @"CelliD";
    AlbumCustomCell *myCell = (AlbumCustomCell *) [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    // this above states to setup the cell using the Identifier I specified in Sotry board, so that cell is constantly reused

    if (indexPath.section == 0) { 
         NSDictionary *item = [photoalbumarray objectAtIndex:[indexPath row]];
myCell.titleincell.text = [item objectForKey:@"title"]; // this puts the title in the cell
        teststring = [item objectForKey:@"title"];

        myCell.dateincell.text = [item objectForKey:@"date"]; // this puts the date in the     data label in the cell


      //  myCell.imageincell1.image = [UIImage imageNamed:[item objectForKey:@"img1"]]; // this puts the picture in the cell
         myCell.imageincell2.image = [UIImage imageNamed:[item objectForKey:@"img2"]]; // this puts the picture in the cell
         myCell.imageincell3.image = [UIImage imageNamed:[item objectForKey:@"img3"]]; // this puts the picture in the cell

        // IMAGE 1
        NSString *picture1 = [item objectForKey:@"img1"];
        NSURL *imageURL1 = [NSURL URLWithString:picture1];
        NSData * imageData1 = [NSData dataWithContentsOfURL:imageURL1];
        UIImage * image1 = [UIImage imageWithData:imageData1];
        myCell.imageincell1.image = image1;

    myCell.imageincell1.alpha = 0.0;
    [UIView animateWithDuration:1.5 animations:^{
        myCell.imageincell1.alpha = 1.0;
    }];


    // IMAGE 2
    NSString *picture2 = [item objectForKey:@"img2"];
    NSURL *imageURL2 = [NSURL URLWithString:picture2];
    NSData * imageData2 = [NSData dataWithContentsOfURL:imageURL2];
    UIImage * image2 = [UIImage imageWithData:imageData2];
    myCell.imageincell2.image = image2;

    myCell.imageincell2.alpha = 0.0;
    [UIView animateWithDuration:1.5 animations:^{
        myCell.imageincell2.alpha = 1.0;
    }];



    // I MAGE 3
    NSString *picture3 = [item objectForKey:@"img3"];
    NSURL *imageURL3 = [NSURL URLWithString:picture3];
    NSData * imageData3 = [NSData dataWithContentsOfURL:imageURL3];
    UIImage * image3 = [UIImage imageWithData:imageData3];
    myCell.imageincell3.image = image3;
    myCell.imageincell3.alpha = 0.0;
    [UIView animateWithDuration:1.5 animations:^{
        myCell.imageincell3.alpha = 1.0;
    }];

}
return myCell;
}



// SEGUE TRANSITION FROM ALBUMS TO PHOTO
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showPhotoAlbum"]) {
        NSLog(@"Prepare for Segue to load Specific Photo Album");
        NSLog(@"User Selected this cell or the name of the title in the cell which comes from a NSDictionary =>");
// EXAMPLE NSLOG TO SHOW =>  User Selected - Album Name
// Where album name is actually the album name grabbed form the server based on the selected row
    }
}

@end

and just so you can see my JSON data from the server coming in, here that is

2012-10-01 13:02:53.856 CB Photo[3957:907] (
        {
        date = "2012-10-01 07:23:01";
        id = 1;
        img1 = "http://b2fdev.ca/demo/CBPhoto/pic1.jpg";
        img2 = "http://b2fdev.ca/demo/CBPhoto/pic2.jpg";
        img3 = "http://b2fdev.ca/demo/CBPhoto/pic3.jpg";
        title = "Paul and Jenna's Wedding 2012";
    },
        {
        date = "2012-10-01 05:23:23";
        id = 2;
        img1 = "http://core1.ca/wp-content/themes/custom-community/images/block4.png";
        img2 = "http://core1.ca/wp-content/themes/custom-community/images/block3.png";
        img3 = "http://core1.ca/wp-content/themes/custom-community/images/block2.png";
        title = "Core 1";
    }
)

回答1:


You mean this?

NSArray *indexPaths = [self.collectionView indexPathsForSelectedItems];
DetailViewController *destViewController = segue.destinationViewController;

NSIndexPath *index = [indexPaths objectAtIndex:0];

NSLog(@"%d", index.section * 2 + index.row);

this print index in array in 2 x whatever array;




回答2:


The way I do it is keep a private member variable in my collection view controller:

NSInteger selectedPhotoIndex;

It gets updated every time the user selects something in the collection view:

- (void)collectionView:(UICollectionView *)collectionView 
            didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    selectedPhotoIndex = indexPath.row;
}

Then I just use it in my prepareForSegue method. Applied to your case it would look something like this:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ShowPhotoAlbum"]) {
        NSLog(@"User selected %@", [[photoalbumarray objectAtIndex:selectedPhotoIndex] objectForKey:@"title");
        // ... find the right detail VC, set its data, set up delegate etc.
    }
}

This is pretty simple because in this case I only have one section in the collection view. If you have several sections, just maintain an NSIndexPath instance, instead of a simple integer.




回答3:


To get the selected element in your datasource you can use:

[self.collectionView indexPathsForSelectedItems];

It returns an array of indexPath. Then you can configure the destination view controller like that:

NSArray *indexPaths = [self.collectionView indexPathsForSelectedItems];
ViewController *destinationViewController = (ViewController *)segue.destinationViewController;
destinationViewController.myPropertyToSet = [self.photoalbumarray objectAtIndex:[[test objectAtIndex:0] row]]; // You may have to store it in a proper NSindexPath object before or cast it

I get only the index 0 but you can request any index returned in indexPaths array. Also don't forget to be sure that the array is not empty (normally it should not but just in case)




回答4:


You can also use the sender parameter of

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

As sender will be the UICollectionViewCell, or subclass, that started the segue.

This can help clean up your code.

So as an example for the code provided for in the original question

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [super prepareForSegue:segue sender:sender];

    id destination = segue.destinationViewController;

    if ([sender isKindOfClass:[AlbumCustomCell class]])
    {
        AlbumCustomCell *cell = sender;
        // set something on destination with a value from the cell
    }
}


来源:https://stackoverflow.com/questions/12677775/uicollection-view-segue-did-select-specific-cell-log

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!