为什么在iphone sdk的所有集合视图中重复相同的图像

时间:2013-01-30 09:19:46

标签: iphone ios ios6

我有一个表视图,其中列出了XML文件中的一些图像集,这些图像作为URL检索。我用Collection Views扩展了这个,当用户在表视图中选择图像时,相应的图像将进入下一个窗口,显示一组图像作为集合视图。

这里我遇到一个问题,因为当我点击表格视图中的任何图像时,它会显示所有集合视图的相同图像。为了更好地理解,我附上了下面的图片,

Collection Images

在此,表格视图显示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>

3 个答案:

答案 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];