在UITableviewcell中使用Collectionview

时间:2014-02-22 22:24:14

标签: ios objective-c uitableview uicollectionview

我还没有找到解决这个问题的方法。我已将视频附加到我的应用中,以便将其视为实际操作。

问题发布在最近发生的事情和应该发生的事情的底部。

https://www.mediacloud.cc/a/public/85156c9d4867ec82a42002e21954ee70.php?lang=en

我使用单例方法在我的两个视图控制器之间传递数据,因为它们没有直接连接。

我正在使用的4个相关类是MyAppDelegate,CameraViewController,TableViewController和CaptureSession。

我的appDelegate.h课程

@property (nonatomic, retain) NSMutableArray *emailProperty;

@property (nonatomic, retain) NSMutableArray *imageProperty;

@property (nonatomic, retain) NSMutableDictionary *dictionaryProperty;

@property (nonatomic, retain) NSString *emailStringProperty;

@property (nonatomic, retain) UIImage *assetImageProperty;

@property (nonatomic, retain) UIImage *captureImageProperty;

+ (id)sharedManager;

我的appDelegate.m类

@synthesize emailProperty;

@synthesize imageProperty;

@synthesize dictionaryProperty;

@synthesize emailStringProperty;

@synthesize assetImageProperty;

@synthesize captureImageProperty;

#pragma mark Singleton Methods

+ (id)sharedManager {

static MediaCloudAppDelegate *sharedMyManager = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
    sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}

- (id)init {
if (self = [super init]) {

    emailProperty = [NSMutableArray array];

    imageProperty = [NSMutableArray array];

    dictionaryProperty = [NSMutableDictionary dictionary];

}
return self;
}

CameraViewController.m类

当用户在CameraViewController中时,他会在触摸事件后立即按下“拍照”,弹出UIalertview以要求他输入他的电子邮件。 这是处理用户输入的代码。

_emailString1 = [alertView textFieldAtIndex:0].text;


        MediaCloudAppDelegate *sharedManager = [MediaCloudAppDelegate sharedManager];

        sharedManager.emailStringProperty = _emailString1;

        [sharedManager.emailProperty addObject:sharedManager.emailStringProperty];

用户输入电子邮件并点击确定后,他们现在可以拍照了。

因为我正在使用AVCapturesSession拍摄照片。这是代码。

CaptureSession.m类

NSData *imageData = [AVCaptureStillImageOutput 
jpegStillImageNSDataRepresentation:imageSampleBuffer];

UIImage *image = [[UIImage alloc] initWithData:imageData];

[self setStillImage:image];


MediaCloudAppDelegate *sharedManager = [MediaCloudAppDelegate sharedManager];


sharedManager.captureImageProperty = image;


[sharedManager.dictionaryProperty setObject:sharedManager.captureImageProperty 
          forKey:sharedManager.emailStringProperty];


[sharedManager.imageProperty addObject:sharedManager.dictionaryProperty];

NSLog(@"image %@", sharedManager.imageProperty);
照片拍摄后

我记录输出。

例如。让我们说用户的电子邮件是bob@email.com并拍下他自己的照片。

我的NSLog(@“image%@”,sharedManager.imageProperty);是图像

    {
    bob@email.com = "UIImage: 0x1568d8c0";
    }

现在要显示应用程序所拍摄的所有照片和电子邮件,我们将转到TableViewController。

TableViewController.m类

我的表格视图设计是这样的。在一个单元格中,我有一个UICollectionView,在右边我有一个UILabel。

我会像这样显示电子邮件数组。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

MediaCloudAppDelegate *sharedManager = [MediaCloudAppDelegate sharedManager];
// Return the number of rows in the section.
return  sharedManager.emailProperty.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath
{
 static NSString *CellIdentifier = @"Cell";

EmailViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier

 forIndexPath:indexPath];


MediaCloudAppDelegate *sharedManager = [MediaCloudAppDelegate sharedManager];


cell.emailLabel.text = [sharedManager.emailProperty objectAtIndex:indexPath.row];


return cell;
}

要在单元格内的集合视图中显示照片,我就这样做了。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView  
cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"Cell";

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier
forIndexPath:indexPath];

UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];

    MediaCloudAppDelegate *sharedManager = [MediaCloudAppDelegate sharedManager];



sharedManager.dictionaryProperty = [sharedManager.imageProperty objectAtIndex:indexPath.row];

imageView.image = [sharedManager.dictionaryProperty 
objectForKey:sharedManager.emailStringProperty];


return cell;


}

现在一切正常,唯一的问题是每个单元格中的每个集合视图都显示整个照片数组,而不是与唯一电子邮件字符串关联的照片。

所以,如果我有行。

第1行是Bob 第2排是杰夫 第3行是戴夫

我们有一张每个人的照片。 Bob的行中的Collection View应该只显示Bob的图片。 Jeff的行中的Collection视图应该只显示Jeff的图片,依此类推。 现在的问题是。 Bob的行中的Collection View显示了所有三个人的照片,而另外两个人的照片也是如此。

我不知道如何让它发挥作用。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您应该将要在每个tableView单元格中显示的图像存储为数组,然后将该数组传递给单个collectionView实例。您不能只使用一个数组来存储所有图像,并期望各种collectionViews选择要显示的图像。 (嗯,你可以,但这更难了)

传递cellForRowAtIndexPath中信息的方式取决于您的自定义Cell对象的组织方式。

执行此操作的一种方法是将每个数组存储在字典中,并由用户电子邮件键入。另一种方法是将所有数组存储在另一个主数组中,由indexPath.row索引。

如果不清楚,请告诉我。因此,当您捕获图像时,将其添加到数组并将其存储在一个数组中,然后将其添加到您的字典中:

sharedManager.captureImageProperty = image;

NSMutableArray *array = sharedManager.dictionaryProperty[sharedManager.emailStringProperty];
if (!array) array = [NSMutableArray new];
[array addObject: sharedManager.captureImageProperty];

[sharedManager.dictionaryProperty setObject:array 
          forKey:sharedManager.emailStringProperty];

然后从字典中取出数组并将其传递给每个单元格的collectionView。

在collectionView cellForItemAtIndexPath中,实现以下内容:

sharedManager.dictionaryProperty = [sharedManager.imageProperty objectAtIndex:indexPath.item];

//新

NSArray *array = [sharedManager.dictionaryProperty objectForKey:sharedManager.emailStringProperty];
imageView.image = array[indexPath.item];