0

私のアプリでは、2 つのビューしかありません。最初のビューはコレクション ビューで、画像をタップすると、MWPhotoBrowserに移動して画像がフル サイズで表示されます。

インターネット経由で約 100 枚の画像を取得し、NSMutableArray. これには問題があります。アプリを初めて実行し、グリッドからサムネイル画像を選択すると、最後の画像が表示されます。私が選んだものではありません。初めてしか起こらないので、初めて強調したことに注意してください。戻って別の画像をタップすると、選択した画像が正しく表示されます。以下は、それがどのように機能するかのスクリーンショットです

ここに画像の説明を入力

ここにコードがあります

#import "UIImageView+WebCache.h"
#import "ViewController.h"
#import "MWPhotoBrowser.h"
#import "Image.h"
#import "ImageCell.h"

@interface ViewController () <UICollectionViewDelegate, UICollectionViewDataSource, MWPhotoBrowserDelegate>

@property (strong, nonatomic) NSMutableArray *images;
@property (strong, nonatomic) NSMutableArray *browserImages;
@property (strong, nonatomic) MWPhotoBrowser *browser;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.browser = [[MWPhotoBrowser alloc] initWithDelegate:self];
    self.browser.displayActionButton = YES;
    self.browser.displayNavArrows = YES;
    self.browser.displaySelectionButtons = NO;
    self.browser.zoomPhotosToFill = YES;
    self.browser.alwaysShowControls = YES;
    self.browser.enableGrid = NO;
    self.browser.startOnGrid = NO;
    self.browser.wantsFullScreenLayout = NO;

    [self.browser showNextPhotoAnimated:YES];
    [self.browser showPreviousPhotoAnimated:YES];

    [self loadImages];
}

- (void)loadImages
{
    self.images = [[NSMutableArray alloc] init];
    self.browserImages = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", HOST_URL, @"All_Images.php"]];
    NSData *jsonResults = [NSData dataWithContentsOfURL:url];
    NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonResults options:0 error:NULL];

    NSDictionary *images = results[@"Images"];
    for (NSDictionary *img in images) {
        Image *imageObj = [[Image alloc] init];
        imageObj.imageId = [img objectForKey:@"id"];
        imageObj.imageName = [img objectForKey:@"name"];

        // Get the full image path
        NSString *fullImagePath = [NSString stringWithFormat:@"%@%@", HOST_URL, [img objectForKey:@"full_image"]];
        imageObj.imagePath = fullImagePath;

        // Get the thumbnail image path depending on the device
        NSString *thumbnailPath;
        if (DEVICE_IS_PAD) {
            thumbnailPath = [NSString stringWithFormat:@"%@%@", HOST_URL, [img objectForKey:@"thumbnail_ipad"]];
        } else {
            thumbnailPath = [NSString stringWithFormat:@"%@%@", HOST_URL, [img objectForKey:@"thumbnail_iphone"]];
        }
        imageObj.imageThumbnail = thumbnailPath;

        // Creates an object for each image and fill it with the retrieved info
        [self.images addObject:imageObj];

        // This array stores the image paths for later use (displaying them in a photo browser)
        MWPhoto *browserImage = [MWPhoto photoWithURL:[NSURL URLWithString:imageObj.imagePath]];
        browserImage.caption = imageObj.imageName;
        [self.browserImages addObject:browserImage];
    }
    [self.collectionView reloadData];
}

#pragma mark - MWPhotoBrowserDelegate
- (NSUInteger)numberOfPhotosInPhotoBrowser:(MWPhotoBrowser *)photoBrowser
{
    return self.browserImages.count;
}

- (id <MWPhoto>)photoBrowser:(MWPhotoBrowser *)photoBrowser photoAtIndex:(NSUInteger)index
{
    if (index < self.browserImages.count) {
        return self.browserImages[index];
    }
    return nil;
}

#pragma mark - UICollectionViewDataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.images.count;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ImageCell";
    ImageCell *cell = (ImageCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    Image *image = self.images[indexPath.row];
    [cell.imageView setImageWithURL:[NSURL URLWithString:image.imageThumbnail] placeholderImage:[UIImage imageNamed:@"placeholder"]];

    return cell;
}

#pragma mark - UICollectionViewDelegate
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    // Opens the image browser
    [self.browser setCurrentPhotoIndex:indexPath.row];
    [self.navigationController pushViewController:self.browser animated:YES];
}

@end

最初に画像を選択したときにグリッドの最後の画像が表示される理由がわかりません。問題のデモ プロジェクトをアップロードしたので、簡単に確認できます。 https://www.dropbox.com/s/tp6a67f83l0rzin/PhotoBrowserTest.zip

この問題を解決するために誰かの助けをいただければ幸いです。

ありがとうございました。

4

1 に答える 1

2

プロジェクトでこれらのメソッドを変更します

- (NSUInteger)numberOfPhotos {
   if (_photoCount == NSNotFound || _photoCount == 0) {
       if ([_delegate respondsToSelector:@selector(numberOfPhotosInPhotoBrowser:)]) {
           _photoCount = [_delegate numberOfPhotosInPhotoBrowser:self];
       } else if (_depreciatedPhotoData) {
        _photoCount = _depreciatedPhotoData.count;
       }
   }
   if (_photoCount == NSNotFound) _photoCount = 0;
   return _photoCount;
}

- (id)initWithDelegate:(id <MWPhotoBrowserDelegate>)delegate {
    if ((self = [self init])) {
        _delegate = delegate;
        [self setCurrentPhotoIndex:0];
    }
    return self;
}

_photoCount == 0 かどうかを確認する必要があります。これは、最初はこの情報がなく、_photoCount が 0 になるためですが、2 回目は numberOfPhotosInPhotoBrowser が正しいためです

于 2014-03-05T08:39:05.967 に答える