在 UITableViewCell 内的 UITextField 中编辑 NSManagedObject

Posted

技术标签:

【中文标题】在 UITableViewCell 内的 UITextField 中编辑 NSManagedObject【英文标题】:Edit NSManagedObject in a UITextField inside a UITableViewCell 【发布时间】:2012-04-02 14:00:31 【问题描述】:

我有一个非常简单的 RootView Controller ->Detail View Controller,用于显示核心数据对象列表并在 DetailViewController 中显示所选对象的详细信息。 DetailViewController 是一个带有自定义 UITableViewCell 的 UITableView,它有一个 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】:

文本编辑应该在控制器而不是视图中处理。您的自定义单元格是一个视图,放置文本字段委托方法的适当位置将是详细视图控制器。

这是您的解决方案:

将根视图控制器的managedObjectModel 作为属性传递给详细视图控制器。对要编辑的托管对象执行相同操作。

在文本字段的委托方法中,根据需要更新对象的属性

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

最后,在DoneCancel 按钮的处理程序中,保存或放弃更改:

-(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

【讨论】:

感谢您的建议。目前,我正在使用 ViewController 的 editButton 项来打开编辑状态。在这种情况下,我没有“完成”的操作处理程序。因此,我打算检查我的 managedObject 是否有任何更改并在 setEditing:animated 方法中调用保存。这是正确的方法吗? 这样,您无论如何都没有机会取消。然后保存。

以上是关于在 UITableViewCell 内的 UITextField 中编辑 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 内的 UIView 上的 UIGestureRecognizer

捏放大到 UITableViewCell 内的 UIImageView

UITableViewCell 内的 UIScrollView - 水平滚动

UITableViewCell 内的 UIStackView

修复触摸在 UITableViewCell 内的 UILabel 上不起作用?

如何增加 UItableviewcell 内的 UItableview 高度?