1

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

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

集合图像

在此,表格视图显示 Image-1、Image-2... 等等。当我单击表视图中的 Image-1 时,集合视图显示为 Image1-1、Image1-2、.. 等等。当我再次单击表格视图中的 Image-2 时,它再次显示相同的 Image-1-1、Image-1-2 ...等等。

谁能告诉我如何解决这个问题,

对应的代码如下所示,

表视图

- (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];
}

集合视图

- (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;
 }

更新

我的 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>
4

3 回答 3

2

因为您使用故事板,所以 MyCollectionViewCell 将始终从 stroyboard 加载。

所以,改变 MyCollectionViewCell 接口:

@interface MyCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIImageView *tweetImageView;
@end

并链接故事板中的属性。


好吧,我写给你。

- (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;
}
于 2013-01-30T11:12:56.953 回答
2
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

当您单击 tableview 的任何行(例如 Image-2)时,就会调用上述方法。

在这个方法中,你调用 ::: pushViewController 来推送集合视图类

加载此集合视图后 ::: 现在告诉我视图将如何加载方法集合视图类将理解它必须显示对应于 Image-2 的图像

为此,当您调用 pushviewController 时,您还应该传递一些参数,这取决于您应该获取其相应的集合并显示它们。

更新 :

当用户点击表格视图时获取图像:

UIImage *selectedIamge = [[xmlParser tweets] objectAtIndex:indexPath.row];

如果用户单击第一行,则 indexpath.row = 0 并在此数组内>> [xmlParser tweets] >> 零索引处的图像是您需要的数据。这样你就可以得到图像。

您不必获取应用于 tableview 单元格的图像,而是可以从初始化 tableview 单元格的数组中获取图像。

于 2013-01-31T07:18:50.493 回答
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];
于 2013-01-30T09:26:07.923 回答