Сохранить текст из UITableViews - PullRequest
0 голосов
/ 02 декабря 2010

РЕДАКТИРОВАТЬ: Найдена фактическая причина сбоя.Мне нужно было удалить и переустановить, чтобы проверить должным образом без сбоев, как я изменил модель данных.Тем не менее, сейчас есть пример правильного сохранения массива coredata.Как я могу это сделать?

У меня есть UITableView, и я хочу иметь возможность вводить текст в ячейки, затем сохранять этот текст в массиве, а затем загружать текст обратно из массива, когда вызагрузить приложение.

Я использую CoreData, но, похоже, возникают некоторые проблемы.Вот что я имею до сих пор.

В функции cellForRowAtIndex я добавляю UITextFields в качестве подпредставления каждой ячейки, чтобы я мог их печатать и вводить их только тогда, когда включен мой UISwitch, editCells.В четырех ячейках есть предустановленный текст, который я установил.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(15, 20, 185, 30)];
    textField.delegate = self;

    // Configure the cell...

    if ([indexPath row] == 0) {
        [cell setAccessoryView:textField];
        textField.text = @"Before School";
        textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
        textField.enabled = FALSE;
    }

    else if ([indexPath row] == 3) {
        [cell setAccessoryView:textField];
        textField.text = @"Break Time";
        textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
        textField.enabled = FALSE;
    }

    else if ([indexPath row] == 6) {
        [cell setAccessoryView:textField];
        textField.text = @"Lunchtime";
        textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
        textField.enabled = FALSE;
    }

    else if ([indexPath row] == 9) {
        [cell setAccessoryView:textField];
        textField.text = @"After School";
        textField.font = [UIFont fontWithName:@"Helvetica-Oblique" size:16];
        textField.enabled = FALSE;
    }

    else if ([indexPath row] == 1 || [indexPath row] == 2 || [indexPath row] == 4 || [indexPath row] == 5 || [indexPath row] == 7 || [indexPath row] == 8) {
        [cell setAccessoryView:textField];
        textField.font = [UIFont fontWithName:@"Helvetica" size:16];
        if (editCells.on == TRUE) {
            textField.enabled = TRUE;
        }
        else {
            textField.enabled = FALSE;
        }
    }

    [monArrayA addObject:textField.text];

    [textField release];

    return cell;
}

Чтобы сохранить, я запускаю его, когда значение editCells изменяется, поэтому, когда пользователь завершит редактирование, его сохраненные данные будут переключены.выкл.Я делаю новый объект для сохранения с основными данными.Я сохраняю урок, который представляет собой массив со всем текстом ячейки и таблицей, в которой он должен находиться, но сохраняя его тег.Но, конечно, это приводит к ошибке SIGABRT и вылетает из приложения при щелчке переключателя.

[editCells addTarget:self action:@selector(editCells:) forControlEvents:UIControlEventValueChanged];

-(void)editCells:(id)sender{
    [monTable reloadData];

    //Create a new object to save.
    NSManagedObject *newLesson;
    //Tell it to be saved to the DatedText entity using the managedObjectContext, context_.
    newLesson = [NSEntityDescription insertNewObjectForEntityForName:@"TimeTable" inManagedObjectContext:self.managedObjectContext];
    //Set two values within this object, being the text the user entered and the date from the datePicker.
    //Save these to their appropriate properties within this entity.
    [newLesson setValue:monArrayA forKey:@"lessonName"];
    [newLesson setValue:monTable.tag forKey:@"table"];

    //Create error incase of failure to save.
    NSError *saveError = nil;
    //Try and access the data store via context_ and fall back on saveError if fails.
    [self.managedObjectContext save:&saveError];
    if (saveError != nil) {
        //Report error by printing it to the console.
        NSLog(@"[%@ saveContext] Error saving context: Error = %@, details = %@",[self class], saveError,saveError.userInfo);
    }
}

1 Ответ

0 голосов
/ 02 декабря 2010

Табличные представления работают немного иначе, чем вы ожидаете.Важно помнить, что tableView: cellForRowAtIndexPath: вызывается как для создания ячейки, так и для ее повторного использования.Вы должны создавать только подпредставления (например, textField) в пути if (cell == nil).Убедитесь, что вы присвоили каждому полю уникальный тег и добавили их в качестве подпредставлений ячейки.

Затем в пути configure cell (после возможного создания элементов) вы снова получите поля, вызвав [cell.contentView viewWithTag:YOUR_FIELD_TAG] изатем обновите поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...