Изменить NSManagedObject в UITextField внутри UITableViewCell - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть очень простой RootView Controller -> Detail View Controller, чтобы отобразить список основных объектов данных и показать детали выбранного объекта в DetailViewController.DetailViewController - это UITableView с пользовательским UITableViewCell, который имеет UITextField, позволяющий редактировать пользователя.Я могу отображать таблицу, редактировать текстовое поле и так далее.Однако я не уверен, как на самом деле обновить объект управления после того, как пользователь нажмет кнопку «Готово», или отменит изменения после действия кнопки «Отмена».Я понимаю, что, вероятно, могу достичь этого, используя EditViewController, который можно использовать для редактирования одного свойства за раз.Но меня интересует решение, в котором я мог бы поддерживать встроенное редактирование в DetailViewController.Любые предложения будут очень полезны.

Спасибо,

Пользовательский код ячейки UITableView

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        _textField = [[UITextField alloc] initWithFrame:CGRectZero];
        [_textField setTextAlignment:UITextAlignmentLeft];
        [_textField setReturnKeyType:UIReturnKeyDone];
        [_textField setClearButtonMode:UITextFieldViewModeWhileEditing];
        [_textField setDelegate:self];
        [[self contentView] addSubview:_textField];
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

-(void) layoutSubviews {
    [super layoutSubviews];
    CGRect contentRect = [self.contentView bounds];

    // In this example we will never be editing, but this illustrates the appropriate pattern

    if ([self isEditing]) {
        self.textLabel.frame = CGRectZero;
        self.textField.frame = CGRectMake(contentRect.origin.x + kCellLeftOffset, kCellTopOffset, contentRect.size.width - kCellLeftOffset, kCellHeight);
    }
    else {
        CGRect frame = CGRectMake(contentRect.origin.x + kCellLeftOffset, kCellTopOffset, 90, kCellHeight);
        CGRect textFrame = CGRectMake(frame.origin.x + frame.size.width + kCellLeftOffset, kCellTopOffset, 180, kCellHeight);

        self.textLabel.frame = frame;
        self.textField.frame = textFrame;
    }
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    if (!editing)
        [_textField resignFirstResponder];
}

-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
    return [self isEditing];
}

1 Ответ

0 голосов
/ 02 апреля 2012

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

Вот ваше решение:

Передайте managedObjectModel вашего корневого контроллера представления вашему контроллеру подробного просмотра в качестве свойства.Сделайте то же самое с управляемым объектом, который нужно отредактировать.

В методах делегатов вашего текстового поля обновите свойства объекта соответствующим образом

- (void)textFieldDidEndEditing:(UITextField *)textField {
   self.managedObject.textAttribute = textField.text;
}

Наконец, в ваших обработчиках Done и Cancel кнопки, сохранить или отменить изменения:

-(void)cancel {
   [self.managedObjectContext rollback];
   [self dismissModalViewControllerAnimated:YES];  // or pop
}

-(void)done {
   [self.managedObjectContext save:nil]; // better use proper error handling
   [self dismissModalViewControllerAnimated:YES];  // or pop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...