1

URLとして取得されたXMLファイルからいくつかの画像のセットをリストしているテーブルビューがあります。これを Collection Views で拡張しました。ユーザーがテーブルビューで画像を選択すると、対応する画像が次のウィンドウに移動し、一連の画像がコレクションビューとして表示されます。

ここで、テーブル ビューで任意の画像をクリックすると、すべてのコレクション ビューで同じ画像が表示されるという問題に直面します。理解を深めるために、下の画像を添付しました。

コレクション画像

この場合、テーブル ビューには 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
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

テーブルビューの任意の行(たとえばImage-2)をクリックすると、上記のメソッドが呼び出されます。

このメソッド内で、コレクションビュークラスをプッシュする:::pushViewControllerを呼び出します。

このコレクションビューが読み込まれた後:::ビューがどのように読み込まれたかを教えてくださいメソッドコレクションビュークラスは、Image-2に対応する画像を表示する必要があることを理解します

このため、pushviewControllerを呼び出すときに、対応するコレクションをフェッチして表示する必要がある引数に応じて、引数も渡す必要があります。

アップデート :

ユーザーがテーブルビューをクリックしたときに画像を取得するには:

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

ユーザーが最初の行をクリックした場合、indexpath.row = 0であり、この配列内>>[xmlParserツイート]>>ゼロインデックスの画像が必要なデータです。このようにして、uは画像を取得できます。

テーブルビューセルに適用された画像をフェッチする必要はありません。代わりに、テーブルビューセルが開始された配列から画像をフェッチできます。

于 2013-01-31T07:18:50.493 に答える
2

ストーリーボードを使用するため、MyCollectionViewCell は常にストロイボードからロードされます。

したがって、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 に答える
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 に答える