2010-11-03 99 views
0

我正在尝试构建用户界面,以便用户可以编辑核心数据实体的属性。当用户点击编辑按钮时,选择一行将推动listDetailViewController,这只是一个显示属性的表格视图。它使用带有标签和UITextField的自定义表格视图单元格。 listDetailViewController正确显示属性,并会接受文本,但我不知道如何让用户输入的文本保存。无法将编辑保存到核心数据属性

如果我没有解释清楚,这里是一个例子。我想更改列表的名称,所以我点击编辑,点击列表,点击列表名称行,弹出键盘,输入新名称,点击完成,然后弹出我回到RVC,没有任何更改保存。我一直在这个问题上敲打我的头几天,并会喜欢一些帮助!

下面是相关的代码从ListDetailViewController

- (void)viewDidLoad { 
[super viewDidLoad]; 
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] 
           initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
           target:self 
           action:@selector(done)]; 
self.navigationItem.rightBarButtonItem = doneButton; 
[doneButton release]; 

self.tableView.allowsSelection = NO; 
self.tableView.allowsSelectionDuringEditing = NO; 
} 



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
// Return the number of rows in the section. 
return 3; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *DetailCellIdentifier = @"DetailCell"; 

ListDetailCell *cell = (ListDetailCell *)[tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier]; 
if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"ListDetailCell" owner:self options:nil]; 
    cell = listDetailCell; 
    self.listDetailCell = nil; 

// Configure the cell... 

    // list name 
    if (0 == indexPath.row) { 
     cell.label.text = @"List Name"; 
     cell.textField.text = self.selectedList.listName; 
     cell.textField.placeholder = @"Name"; 
    } 

    // Detail 1 
    if (1 == indexPath.row) { 
     cell.label.text = @"Detail 1"; 
     cell.textField.text = selectedList.detail1; 
     cell.textField.placeholder = @"Detail 1"; 
    } 

    // Detail 2 
    if (2 == indexPath.row) { 
     cell.label.text = @"Detail 2"; 
     cell.textField.text = selectedList.detail2; 
     cell.textField.placeholder = @"Detail 2"; 
    } 
} 

return cell; 
} 


- (void)done { 
[self.listDetailCell resignFirstResponder]; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

labeltextFieldListDetailCell声明,这是表格单元格笔尖我前面提到的高德。

回答

3

不知道我的问题是否正确,或者我的答案是最好的方法,但这是我最近做的。我有一个TableViewController和UITableView,它显示一系列用于编辑数据的自定义单元格。这基本上复制了我见过的其他许多应用程序创建数据编辑屏幕的过程。

每个自定义单元都有一个UITextField。当用户完成编辑单元格时,UITextField会触发一条消息到UITextFieldDelegate。所以我将UITextFieldDelegate协议添加到TableViewController中,并在cellForRowAtIndexPath中设置自定义单元格时,我将TableViewController设置为UITextFields委托。然后,当用户完成编辑时,发送结束编辑消息,然后我可以从UITextField获取值并将其存储回托管实体对象中。

我很抱歉,但我现在无法访问我的代码,或者我会为您剪切并粘贴一个示例。

无论如何,有些事情需要注意的:

  • 在您需要首先确定已经触发了呼叫的UITextField委托消息的代码。最好的方法是在创建包含它的UITableCell时,在UITextField上设置Tag属性。然后在委托方法中,您可以使用switch语句来选择要存储值的实体字段。

  • 当用户点击UITableView的不可编辑区域时,获取键盘骑行可能会非常棘手。你需要存储一个可以有键盘的对象列表,当点击发生时,循环它们并且让第一响应者辞职以从显示器上移除键盘。

  • 点击导航栏上的保存按钮或UITableView以外的其他位置不会删除键盘或退出第一响应者,因此当前正在编辑的字段的委托不会被调用。您需要添加代码来触发保存序列。

  • 如果你有任何UITextView的,他们使用不同的委托。

要添加你需要做这样的事情委托(从上面的代码获取):

@interface MyTableViewController : UITableViewController <UITextFieldDelegate> 

.... 

    if (0 == indexPath.row) { 
     cell.label.text = @"List Name"; 
     cell.textField.text = self.selectedList.listName; 
     cell.textField.placeholder = @"Name"; 

     cell.textField.delegate = self; // Setting controller as text field delegate. 
     cell.textField.tag = 1; // Really should use an enum here for clarity. 

    } 

.... 

-(void) textFieldDidEndEditing:(UITextField *) textField { 
    switch(textField.tag) { 
     case 1: //Again with the enum. 
      // Save field 1. 
      entity.someProperty = textField.text; 
     .... 
    } 
} 

这是处理一些文本字段。我发现的另一个解决方案是将更改的值存储在字典中,并且只在用户点击保存时更新实体。通过上面的解决方案,如果用户取消,则还必须重置实体属性。所以这是课程的马。

+0

我应该将委托添加到单元类,还是添加到'cellForRowAtIndexPath'方法?键盘不是问题,因为完成按钮和导航控制器按照他们应有的工作。为了清楚起见,我编辑了我的示例以更清晰! – 2010-11-04 01:14:34

+0

我上面更新了一些示例代码。小心输入错误,我把它输入:-) – drekka 2010-11-04 02:38:34

+0

这样做,谢谢!我仍然围绕着代表围绕我的大脑,并且每一个新点都有所帮助。 :) – 2010-11-04 04:06:19