如何将字段从 NSManagedObject 传递到控制器以对其进行修改
How to pass a field from a NSManagedObject to a controller to modify it
我有一个包含多个字符串字段的 NSManaged 对象,例如:
@interface myObject : NSManagedObject
@property (nonatomic, copy) NSString * name0;
@property (nonatomic, copy) NSString * name1;
@property (nonatomic, copy) NSString * name2;
我有一个显示此对象属性的 table 视图控制器,当有人单击某个单元格时,它会调用第二个视图控制器(下面的 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 方法来做到这一点。
更好的选择是同时传递托管对象和作为应更改键的字符串。然后,您的控制器可以使用该键来获取要显示的现有值,并设置该键的值以更新托管对象(然后需要保存该对象以存储更新)。
我有一个包含多个字符串字段的 NSManaged 对象,例如:
@interface myObject : NSManagedObject
@property (nonatomic, copy) NSString * name0;
@property (nonatomic, copy) NSString * name1;
@property (nonatomic, copy) NSString * name2;
我有一个显示此对象属性的 table 视图控制器,当有人单击某个单元格时,它会调用第二个视图控制器(下面的 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 方法来做到这一点。
更好的选择是同时传递托管对象和作为应更改键的字符串。然后,您的控制器可以使用该键来获取要显示的现有值,并设置该键的值以更新托管对象(然后需要保存该对象以存储更新)。