2012-04-02 2 views
0

非常に単純なRootView Controller - > Detail View Controllerを使用して、コアデータオブジェクトのリストを表示し、DetailViewControllerの選択したオブジェクトの詳細を表示します。 DetailViewControllerは、ユーザーの編集を許可するUITextFieldを持つカスタムUITableViewCellを持つUITableViewです。 私はテーブルを表示することができ、テキストフィールドを編集することができます。しかし、ユーザーが「完了」ボタンを選択したり、「キャンセル」ボタン操作で変更を取り消したりすると、管理オブジェクトを実際に更新する方法がわかりません。 私はおそらくEditViewControllerを使ってこれを達成できます。これは、一度に1つのプロパティを編集するために使用できます。しかし、私はDetailViewControllerでインライン編集をサポートできるソリューションに興味があります。どんな提案も非常に役に立ちます。UITableViewCell内のUITextFieldでNSManagedObjectを編集します。

おかげで、

カスタムの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]; 
} 

答えて

0

は、テキスト編集は本当にコントローラではなくビューで処理する必要があります。カスタムセルはビューです。テキストフィールドの委譲メソッドを配置する適切な場所はディテールビューコントローラです。

は、プロパティとして、あなたの詳細ビューコントローラにルートビューコントローラのmanagedObjectModelを渡します

はここにあなたのソリューションです。編集する管理オブジェクトと同じ操作を行います。あなたのテキストフィールドのデリゲートメソッドで

DoneCancelボタンのあなたのハンドラでは、適切な

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

として、オブジェクトのプロパティを更新し、変更を保存するか破棄:

-(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 
} 
+0

あなたの提案をありがとう。現在、私はEditController editButton項目を使用して編集状態を有効にしています。この場合、「完了」のアクションハンドラはありません。ですから、私は自分のmanagedObjectが何らかの変更をしているかどうかをチェックし、setEditing:animatedメソッドでsaveを呼び出すことを計画しています。これは正しいアプローチですか? – user320587

+0

この方法では、とにかくキャンセルする可能性があります。ちょうど保存してください。 – Mundi

関連する問題