2010-11-03 104 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