UICollectionView insertItemsAtIndexPaths: выдает исключение

UICollectionView: I 'Я делаю это неправильно. Я просто нене знаю как.

Моя настройка

Я запускаю это на iPhone 4S с iOS 6.0.1.

Моя цель

У меня есть табличное представление, в котором один раздел посвящен изображениям:

Когда пользователь нажимает "Добавить изображение ... » ячейке, им предлагается либо выбрать изображение из своей библиотеки фотографий, либо сделать новое с помощью камеры. Эта часть приложения, кажется, работает нормально.

Когда пользователь впервые добавляет изображение,Нет изображений " метка будет удалена из второй ячейки таблицы, а вместо нее добавлен программный интерфейс UICollectionView. Эта часть также, кажется, работает нормально.

Предполагается, что представление коллекции отображает добавленные ими изображения издесь, где яУ меня проблемы. (Я знаю, что яМне придется перепрыгивать через несколько обручей, чтобы ячейка табличного представления увеличивалась по мере увеличения количества изображений. Я'м еще не так далеко.)

Когда я пытаюсь вставить элемент в представление коллекции, он вызывает исключение. Подробнее об этом позже.

Мой код

у нас есть UITableViewController, отвечающий за табличное представление, также выступающее в качестве представления коллекции 'S делегат и источник данных. Вот соответствующий код (я опустил биты контроллера, которые я считаю не связанными с этой проблемой, включая строки в таких методах, как-viewDidLoad, Я'мы также пропустили большую часть кода получения изображения, так как я нене думаю, что этоуместно):

#define ATImageThumbnailMaxDimension 100

@interface ATAddEditActivityViewController ()
{
    UICollectionView* imageDisplayView;
    NSMutableArray* imageViews;
}

@property (weak, nonatomic) IBOutlet UITableViewCell *imageDisplayCell;
@property (weak, nonatomic) IBOutlet UILabel *noImagesLabel;
@end

@implementation ATAddEditActivityViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc] init];
    flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;

    imageDisplayView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 290, 120) collectionViewLayout:flowLayout];  // The frame rect still needs tweaking
    imageDisplayView.delegate = self;
    imageDisplayView.dataSource = self;
    imageDisplayView.backgroundColor = [UIColor yellowColor];  // Just so I can see the actual extent of the view
    imageDisplayView.opaque = YES;
    [imageDisplayView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];

    imageViews = [NSMutableArray array];
}

#pragma mark - UIImagePickerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    /* ...code defining imageToSave omitted... */

    [self addImage:imageToSave toCollectionView:imageDisplayView];


    [self dismissModalViewControllerAnimated:YES];
}

#pragma mark - UICollectionViewDelegate
- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

#pragma mark - UICollectionViewDatasource
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    [[cell  contentView] addSubview:imageViews[indexPath.row]];
    return cell;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return [imageViews count];
}

#pragma mark - UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return ((UIImageView*)imageViews[indexPath.item]).bounds.size;
}

#pragma mark - Image Handling
- (void)addImage:(UIImage*)image toCollectionView:(UICollectionView*)cv
{
    if ([imageViews count] == 0)  {
        [self.noImagesLabel removeFromSuperview];
        [self.imageDisplayCell.contentView addSubview:cv];
    }

    UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
    /* ...code that sets the bounds of the image view omitted... */

    [imageViews addObject:imageView];
    [cv insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:[imageViews count]-1 inSection:0]]];
    [cv reloadData];
}

@end

Подвести итоги:

Представление коллекции создается и настраивается в-viewDidLoad методМетод UIImagePickerDelegate, который получает выбранные вызовы изображений-addImage:toCollectionView... который создает новое представление изображения для хранения изображения и добавляет его в массив источника данных и представление коллекции. Это строка, которая производит исключение.Методы источника данных UICollectionView полагаются на массив imageViews.Исключение

Завершение приложения из-за неисследованного исключения »NSInternalInconsistencyException»Причина:Неверное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (1), должно быть равно количеству элементов, содержащихся в этом разделе до обновления (1), плюс или минус число элементов, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество элементов, перемещенных в или из этого раздела (0 перемещено, 0 удалено). '

Если я'Я правильно понимаю, что это говорит мне о том, что (совершенно новый!) вид коллекции думает, что он был создан с одним элементом. Итак, я добавил журнал в-addImage:toCollectionView чтобы проверить эту теорию:

NSLog(@"%d", [cv numberOfItemsInSection:0]);

С этой строкой исключение никогда не выдается! Призыв к-numberOfItemsInSection: должен заставить представление коллекции просмотреть свой источник данных и понять, что у него нет элементов. Или что-то. Я'Я предполагаю здесь. Но, ну, что угодно: представление коллекции все еще не 'Я не могу отображать какие-либо элементы на этом этапе, поэтому яя все еще делаю что-то не так, и я нене знаю что.

В заключениеЯ получаю странное исключение, когда пытаюсь добавить элемент во вновь созданный и вставленный вид коллекции ... кроме случаев, когда я вызываю-numberOfItemsInSection: перед попыткой вставки.Даже если мне удастся обойти исключение с помощью теневого обходного пути, элементы все равно не будут отображаться в представлении коллекции.

Извините за роман вопроса. Есть идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос