Выбранная ячейка не сохраняется в 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
или нет.