我有一个表视图,其中列出了XML文件中的一些图像集,这些图像作为URL检索。我用Collection Views扩展了这个,当用户在表视图中选择图像时,相应的图像将进入下一个窗口,显示一组图像作为集合视图。
这里我遇到一个问题,因为当我点击表格视图中的任何图像时,它会显示所有集合视图的相同图像。为了更好地理解,我附上了下面的图片,
在此,表格视图显示Image-1,Image-2 ......等。当我在表格视图中单击Image-1时,集合视图显示为Image1-1,Image1-2,..等等。再次当我在表视图中单击Image-2时,它再次显示相同的Image-1-1,Image-1-2 ......等等。
任何人都可以告诉我如何解决这个问题,
相应的代码如下所示,
tableView
- (void)viewDidLoad
{
[super viewDidLoad];
xmlParser = [[myXMLParser alloc] loadXMLByURL:@"http://sample.com/Images.xml"];
[self.tableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [xmlParser.tweets count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"images";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
UIImage *currentTweet = [[xmlParser tweets] objectAtIndex:indexPath.row];
UIImageView *tweetImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,cell.frame.size.width , cell.frame.size.height)];
tweetImageView.image = currentTweet;
[cell setBackgroundView:tweetImageView];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCollectionViewController *collectViewController = [[MyCollectionViewController alloc] initWithNibName:@"detail" bundle:nil];
[self.navigationController pushViewController:collectViewController animated:YES];
}
CollectionView
- (void)viewDidLoad
{
[super viewDidLoad];
xmlParser = [[myXMLParser alloc] loadXMLByURL:@"http://sample.com/Images.xml"];
UIImage *currentImage = [[xmlParser tweets] objectAtIndex:0];
customimage.image = currentImage;
UIImage *currentImage1 = [[xmlParser tweets] objectAtIndex:1];
customimage1.image = currentImage1;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [xmlParser.tweets count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
UIImage *currentTweet = [[xmlParser tweets] objectAtIndex:indexPath.row];
UIImageView *tweetImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,myCell.frame.size.width , myCell.frame.size.height)];
tweetImageView.image = currentTweet;
[myCell setBackgroundView:tweetImageView];
return myCell;
}
已更新
MY XML
<?xml version="1.0" encoding="UTF-8"?>
<Products>
<products id="0">
<img>http://myimage.com/images/logo1.png</img>
</products>
<products id="1">
<img>http://myimage.com/images/Main_pic.png</img>
</products>
<products id="2">
<img>http://myimage.com/images/image1.png</img>
</products>
<products id="3">
<img>http://myimage.com/images/image2.png</img>
<img-subproduct>http://myimage.com/images/image2-1.png</img-subproduct>
<img-subproduct>http://myimage.com/images/image2-2.png</img-subproduct>
</products>
<products id="4">
<img>http://myimage.com/images/image3.png</img>
<img-subproduct>http://myimage.com/images/image3-1.png</img-subproduct>
<img-subproduct>http://myimage.com/images/image3-2.png</img-subproduct>
</products>
</Products>
答案 0 :(得分:2)
因为您使用了故事板,所以MyCollectionViewCell将始终从stroyboard加载。
因此,更改MyCollectionViewCell界面:
@interface MyCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIImageView *tweetImageView;
@end
并将该属性链接到stroryboard。
好吧,我为你写的。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MyCollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
if (!myCell) {
myCell = [[MyCollectionViewCell alloc] initWithFrame:CGRectMake(0,0,myCell.frame.size.width , myCell.frame.size.height)];
}
[myCell.tweetImageView setImage:[[xmlParser tweets] objectAtIndex:indexPath.row]];
return myCell;
}
和MyCollectionViewCell接口和实现:
@interface MyCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) UIImageView *tweetImageView;
@end
@implementation MyCollectionViewCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
UIImageView *aImageView = [[UIImageView alloc] initWithFrame:self.bounds];
aImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addSubview:aImageView];
self.tweetImageView = aImageView;
}
return self;
}
@end
您将currentTweet设置为[[xmlParser tweets] objectAtIndex:indexPath.row]
?
我认为这是零。检查一下。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
UIImage *currentTweet = [[xmlParser tweets] objectAtIndex:indexPath.row];
UIImageView *tweetImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,myCell.frame.size.width , myCell.frame.size.height)];
tweetImageView.image = currentTweet;
NSLog(@"%@", tweetImageView.image); // Check tweetImageView.image whether nil or not.
[myCell setBackgroundView:tweetImageView];
return myCell;
}
答案 1 :(得分:2)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
当你点击tableview的任何一行(比如Image-2)时,会调用上面提到的方法。
在此方法中,您调用::: pushViewController,它会推送集合视图类
此Collection View加载后:::现在告诉我视图如何加载方法集合视图类将理解它必须显示对应于Image-2的图像
为此,当你调用pushviewController时,你也应该传递一些参数,具体取决于你应该获取它的相应集合并显示它们。
更新:
用户点击表格视图时获取图片:
UIImage *selectedIamge = [[xmlParser tweets] objectAtIndex:indexPath.row];
如果用户单击第一行,则indexpath.row = 0 在这个数组里面&gt;&gt; [xmlParser tweets]&gt;&gt;零索引处的图像是您需要的一个数据。 通过这种方式你可以获得图像。
没有必要你获取在tableview单元格上应用的图像,而是你可以从未从中查看tableview单元格的数组中获取图像。
答案 2 :(得分:1)
更改:
UIImageView *tweetImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,cell.frame.size.width , cell.frame.size.height)];
致:
UIImageView *tweetImageView = [[[UIImageView alloc]initWithFrame:CGRectMake(0,0,cell.frame.size.width , cell.frame.size.height)]autorelease];