Выбранная ячейка не сохраняется в UICollectionView. Не могу сохранить. *** Завершение приложения из-за необработанного исключения

У меня есть UICollectionView, который заполняется данными из моей БД. Пользователь выбирает различные ячейки и нажимает кнопку, чтобы сохранить информацию. Я не могу получить данные для публикации. Что я делаю неправильно?

#pragma mark <UICollectionViewDataSource>



- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {

    NSLog(@"itemPresets --> %lu",(unsigned long)[self.itemPresets count]);

    return [self.itemPresets count];

}



- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

    NSLog(@"itemPresets[section] --> %lu",(unsigned long)[self.itemPresets[section] count]);

    return  [self.itemPresets[section] count];

}



- (UICollectionReusableView*)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

{

    UICollectionReusableView * view = nil;



    if ([kind isEqualToString:UICollectionElementKindSectionHeader])

    {

        ItemSectionHeaderView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader

                                                                           withReuseIdentifier:NSStringFromClass([ItemSectionHeaderView class])

                                                                                  forIndexPath:indexPath];

        header.captionLabel.text = self.headTitleArray[indexPath.section];

        view = header;

    }

    return view;

}





- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionViewCell *cell;



    ItemCell *aCell = (ItemCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"itemCell" forIndexPath:indexPath];



    if (indexPath.section == 2) {

        aCell.label.backgroundColor = [Helper colorWithSetting:(self.itemPresets[indexPath.section][indexPath.row])];

        aCell.label.text = @"";

    }

    else

    {

        aCell.label.text = self.itemPresets[indexPath.section][indexPath.row];

        aCell.label.textAlignment = NSTextAlignmentCenter;

    }

    cell = aCell;



    cell.selectedBackgroundView.backgroundColor = [UIColor darkGrayColor];

    return cell;

}







- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

{

    CGSize size;

    if (indexPath.section == 6)

    {

        size = CGSizeMake(140, 30);

    }

    else if (indexPath.section <= 5 && indexPath.section >= 0)

    {

        size = CGSizeMake(80, 30);

    }

    else

    {

        size = CGSizeMake(self.collectionView.frame.size.width, 150);

    }



    return size;

}



#pragma mark <UICollectionViewDelegate>



- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

{

  NSArray * selectedRows = self.collectionView.indexPathsForSelectedItems;



  for (NSIndexPath * selectedRow in selectedRows) {

    if ((selectedRow.section == indexPath.section) && (selectedRow.row != indexPath.row)) {

      [self.collectionView deselectItemAtIndexPath:selectedRow animated:NO];

    }

  }

  switch (indexPath.section) {

    case 0:

      self.setting.itemKeyA = self.itemPresets[indexPath.section][indexPath.row];

      NSLog(@“ValueA in case -----> %@",self.itemPresets[indexPath.section][indexPath.row]);

      break;

    case 1:

      self.setting.itemKeyB = self.itemPresets[indexPath.section][indexPath.row];

      NSLog(@“ValueB in case -----> %@",self.itemPresets[indexPath.section][indexPath.row]);

      break;

    case 2:

        self.setting.itemKeyC = self.itemPresets[indexPath.section][indexPath.row];

      NSLog(@“ValueC in case -----> %@",self.itemPresets[indexPath.section][indexPath.row]);

      break;

    default:

      break;

  }



    NSLog(@“ValueA in set -----> %@",self.setting.itemKeyA);

    NSLog(@“ValueB in set -----> %@",self.setting.itemKeyB);

    NSLog(@“ValueC in set -----> %@",self.setting.itemKeyC);



}



# pragma mark - sync with Parse

- (void)register

{

    if (!self.setting.KeyA || !self.setting.KeyB || !self.setting.KeyC)

    {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@" Request Incomplete" message:@"Please select all the necessary fields." delegate:self cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok") otherButtonTitles:nil, nil];

        [alert show];

        return;

    }



    PFObject *postActivity = [PFObject objectWithClassName:@"Activity"];

    [postActivity setObject:@“Apply" forKey:@“activityType"];

    [postActivity setObject:[PFUser currentUser] forKey:@"fromUser"]; // Set fromUser

    [postActivity saveInBackground];



    PFObject *post = [PFObject objectWithClassName:@“Apply"];

    [post setObject:[PFUser currentUser] forKey:@"User"]; // Set fromUser

    NSLog(@“keyA -----> %@",self.setting.KeyA);

    NSLog(@“keyB -----> %@“,self.setting.KeyB);

    NSLog(@“keyC -----> %@",self.setting.KeyC);

    [post setObject:self.setting.KeyA forKey:@“keyA"];

    [post setObject:self.setting.KeyB forKey:@“keyB"];

    [post setObject:self.setting.KeyC forKey:@“keyC"];



    self.HUD = [[MBProgressHUD alloc] initWithView:self.view];

    [self.view addSubview:self.HUD];



    // Set determinate mode

    self.HUD.mode = MBProgressHUDModeIndeterminate;

    self.HUD.delegate = self;

    self.HUD.labelText = @"Applying  ...";

    self.HUD.dimBackground = YES;

    [self.HUD show:YES];



    [post saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {

        if (succeeded) {

            [self.HUD hide:YES];



        [self performSegueWithIdentifier:@"unwindItemCollectionViewController" sender:self];

        }

    }];
}

The logs:

2015-10-15 14:12:10.530 x itemPresets --> 0
2015-10-15 14:12:10.530 x itemPresets --> 0
2015-10-15 14:12:10.674 x itemPresets --> 3
2015-10-15 14:12:10.674 x itemPresets[section] --> 9
2015-10-15 14:12:10.675 x itemPresets[section] --> 6
2015-10-15 14:12:10.675 x itemPresets[section] --> 10

не уверен, почему я сначала получаю 0 дважды, но приведенные выше NSLogs верны

2015-10-15 14:12:11.434 x ValueA in case -----> Correct / Selected value
2015-10-15 14:12:11.435 x ValueA in set -----> (null)
2015-10-15 14:12:11.435 x ValueB in set -----> (null)
2015-10-15 14:12:11.436 x ValueC in set -----> (null)
2015-10-15 14:12:12.217 x ValueB in case-----> Correct / Selected value
2015-10-15 14:12:12.217 x ValueA in set -----> (null)
2015-10-15 14:12:12.218 x ValueB in set -----> (null)
2015-10-15 14:12:12.218 x ValueC in set -----> (null)
2015-10-15 14:12:14.516 x ValueC in case-----> Correct / Selected value
2015-10-15 14:12:14.517 x ValueA in set -----> (null)
2015-10-15 14:12:14.517 x ValueB in set -----> (null)
2015-10-15 14:12:14.518 x ValueC in set -----> (null)

Как вы можете видеть из NSLogs выше, значение выбирается изначально и регистрируется правильно, но не сохраняется (хотя оно остается выделенным), так что когда пользователь нажимает кнопку и вызывает метод регистра, все значения равны нулю. Информация, предоставленная пользователем, не может быть сохранена. Приложение вызывает предупреждение (или происходит сбой при удалении проверки на ноль). PostActivity работает и сохраняет данные, как ожидается, в базу данных, но Post для класса Apply ломается.

Я пробовал множество исправлений. Ошибки, которые я получаю (снова, когда проверка начинается) включают в себя:

int main (int argc, char * argv []) {@autoreleasepool {return UIApplicationMain (argc, argv, nil, NSStringFromClass ([класс AppDelegate])); }}

*** Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Невозможно использовать nil для ключей или значений в PFObject. Используйте NSNull для значений.

Я попытался UICollectionView методы источника данных не вызывается, но устанавливаются в init

Также изменено свойство itemCell и itemKeyA и т. Д. На сильное или сохраненное (и неатомичное).

Я попытался повторно подключить UIOutlet / раскадровку

Это проблема nib / xib? Я признаю, что не до конца понимаю, как обеспечить правильную настройку.

Спасибо

1 ответ

Когда вы назначаете значение ключу, связанному с экземпляром PFObject, У вас есть случай, когда ваша ценность nil, В Parse они думают, что вы пытаетесь обнулить значение, связанное с ключом. Тем не менее, я думаю, что вы случайно назначить nil значение для этого. Итак, просто пытаюсь понять, что ты пытаешься сделать. Прежде чем присваивать какие-либо значения, вы можете использовать if-else чтобы проверить, является ли это nil или нет.

Другие вопросы по тегам