我开始使用UICOllectionview加载自定义制作的相册,相册加载得很好,数据来自我的服务器(SQL-JSON-NSARRAY-NSDictionary)并填充在单元格中就好了,但是现在我想在用户选择该单元格来加载一个全尺寸的图像的新UIVIewController时(因此他们可以查看/打印/共享等)
然而,由于我无法从特定细胞中提取任何信息,因此我陷入了“准备segue”方法的困境
现在作为测试我只想要一个NSLOG说“用户选择标题%@”
到目前为止,这是我的代码,非常感谢任何帮助...
#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
只是这样你就可以看到来自服务器的JSON数据了,这就是
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";
}
)
答案 0 :(得分:14)
你是说这个?
NSArray *indexPaths = [self.collectionView indexPathsForSelectedItems];
DetailViewController *destViewController = segue.destinationViewController;
NSIndexPath *index = [indexPaths objectAtIndex:0];
NSLog(@"%d", index.section * 2 + index.row);
这个打印索引在2 x无论数组中的数组;
答案 1 :(得分:7)
我这样做的方法是在我的集合视图控制器中保留一个私有成员变量:
NSInteger selectedPhotoIndex;
每次用户在集合视图中选择某些内容时,它都会更新:
- (void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
selectedPhotoIndex = indexPath.row;
}
然后我只在我的prepareForSegue
方法中使用它。适用于您的情况,它看起来像这样:
- (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.
}
}
这很简单,因为在这种情况下我只在集合视图中有一个部分。如果您有多个部分,只需维护NSIndexPath
实例,而不是简单的整数。
答案 2 :(得分:2)
要获取数据源中的选定元素,您可以使用:
[self.collectionView indexPathsForSelectedItems];
它返回一个indexPath数组。然后,您可以像这样配置目标视图控制器:
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
我只获取索引0,但您可以请求indexPaths数组中返回的任何索引。 另外不要忘记确保数组不为空(通常不应该只是以防万一)
答案 3 :(得分:2)
您还可以使用
的sender参数 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
因为发送者将是启动segue的UICollectionViewCell或子类。
这可以帮助您清理代码。
以原始问题中提供的代码为例
- (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
}
}