2012-04-02 27 views
0

Ich habe einen sehr einfachen RootView Controller -> Detailansicht Controller, um eine Liste der Kerndatenobjekt anzuzeigen und Details zu einem ausgewählten Objekt in der DetailViewController anzuzeigen. Der DetailViewController ist ein UITableView mit benutzerdefiniertem UITableViewCell, das über ein UITextField verfügt, um Benutzeränderungen zu ermöglichen. Ich kann die Tabelle anzeigen, bearbeiten das Textfeld und so weiter. Ich bin mir jedoch nicht sicher, wie ich das Verwaltungsobjekt tatsächlich aktualisieren soll, wenn der Benutzer die Schaltfläche "Fertig" ausgewählt hat, oder die Änderungen bei der Aktion "Abbrechen" abbrechen. Ich verstehe, dass ich das wahrscheinlich erreichen kann, indem ich einen EditViewController benutze, der benutzt werden kann, um eine Eigenschaft gleichzeitig zu bearbeiten. Aber ich bin an einer Lösung interessiert, mit der ich die Inline-Bearbeitung im DetailViewController unterstützen kann. Irgendwelche Vorschläge wären sehr hilfreich.Edit NSManagedObject in einem UITextField in einem UITableViewCell

Danke,

Benutzerdefinierte UITableView Zelle Code

- (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]; 
} 

Antwort

0

Die Textbearbeitung sollte wirklich eher in einem Controller gehandhabt werden als eine Ansicht. Ihre benutzerdefinierte Zelle ist eine Ansicht, der geeignete Ort, um die Textfeld-Delegiertenmethoden zu platzieren, wäre der Detailansicht-Controller.

Hier ist Ihre Lösung:

Geben Sie die managedObjectModel Ihrer Root-Ansicht-Controller auf Ihre Detailansicht Controller als Eigenschaft. Machen Sie dasselbe mit dem zu bearbeitenden verwalteten Objekt.

In den Delegatmethoden Ihres Textfeld aktualisieren die Eigenschaften des Objekts entsprechend

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

schließlich in Ihrem Handler der Done und Cancel Tasten, die Änderungen speichern oder verwerfen:

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

Danke für Ihren Vorschlag. Momentan verwende ich den ViewController-Befehl editButton, um den Bearbeitungsstatus zu aktivieren. In diesem Fall habe ich keinen Aktionshandler für "Fertig". Also plane ich zu überprüfen, ob mein managedObject irgendwelche Änderungen hat, und rufe das Speichern in setEditing: animated method auf. Ist das der richtige Ansatz? – user320587

+0

Auf diese Weise haben Sie ohnehin die Möglichkeit, abzubrechen. Mach einfach einen Speichervorgang. – Mundi

Verwandte Themen