我有一个NSManaged对象,其中包含几个字符串字段,例如:

@interface myObject : NSManagedObject

@property (nonatomic, copy) NSString * name0;
@property (nonatomic, copy) NSString * name1;
@property (nonatomic, copy) NSString * name2;


我有一个显示该对象属性的表视图控制器,当有人单击某个单元格时,它将调用第二个视图控制器(下面的EditTableViewController),该控制器将允许修改此特定单元格。我想将需要修改的第二个控制器传递给NSString *(取决于单击的单元格)。

因此,我为第二个控制器尝试了类似的操作:

@interface EditTableViewController : UITableViewController
@property (nonatomic) NSString *value;


在实现部分中,我(除其他外):

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

    EditPropertyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EditPropertyCell"];
    cell.valueTextField.text = self.value;
    cell.valueTextField.delegate = self;
    [cell.valueTextField becomeFirstResponder];
    [cell.valueTextField setReturnKeyType:UIReturnKeyDone];
    return cell;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    self.value = textField.text;
    [self.navigationController popViewControllerAnimated:TRUE];
    return YES;
}


第一个控制器拥有对myObject类型的对象的引用

@interface myObjectDetailTableViewController : UITableViewController
@property (nonatomic, strong) myObject * myObject;


并通过以下命令调用第二个控制器:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    EditTableViewController *etvc = [[EditTableViewController alloc] initWithStyle:UITableViewStyleGrouped];

    if ([indexPath row] ==0) {
        etvc.value = self.myObject.name0;
    }
    if ([indexPath row] ==1) {
        etvc.value = self.myObject.name1;
    }
    if ([indexPath row] ==2) {
        etvc.value = self.myObject.name2;
    }
    [self.navigationController pushViewController:etvc
                                     animated:YES];


}

问题是它不起作用,即当我在EditTableViewController中时,我可以正确看到我想要修改的值(例如name0),但是如果我修改,则不会保存它。我猜NSString *已经复制到某个地方,但是我不知道在哪里。我想知道它是否与NSManagedObject有关?

无论如何,也许我尝试执行此操作的方式完全不合适,在这种情况下,我也很高兴知道执行此操作的最佳方法是什么

(特别是稍后,我希望以后也能够设置被设置为nil的字段)。

最佳答案

您不能只传递字符串,因为您需要告诉托管对象字符串正在更改,并且可以通过为该属性调用托管对象setter方法来做到这一点。

更好的选择是同时传递托管对象和字符串(应更改的密钥)。然后,您的控制器可以使用该键获取要显示的现有值,并设置该键的值以更新托管对象(然后需要保存该对象以存储更新)。

10-07 19:27
查看更多