更改单元格中的数据后,UITableView中的自定义单元格将无法正确重新加载

时间:2014-03-02 13:40:39

标签: ios uitableview ios7

我在UITableView中创建了一个自定义单元格。样式设置为“自定义”。标识符设置为customCell。附件设置为详细信息。表视图内容设置为动态原型。

该表加载了核心数据中的数据,并在首次出现时显示完美。当用户点击单元格中的细节图标时,会出现一个新视图的segue,以便用户可以编辑单元格中的数据并将其保存到核心数据中。当用户完成编辑并点击“保存”按钮后,视图将返回到UITableView,但刚刚编辑过的单元格显示为“基本”单元格,而不是customCell。如果我点击单元格,它会突出显示并且自定义单元格内容显示在基本单元格内容之上。

我似乎无法解决这个问题。有谁能提出建议?

以下是发送到编辑视图控制器的prepareForSegue部分:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell*)sender {

if ([[segue identifier]isEqualToString:@"editPunchItemSegue"]) {
// DEFINE SEGUE DESTINATION
UINavigationController *navigationController = segue.destinationViewController;
EditPunchItemViewController *editPunchItemViewController = (EditPunchItemViewController*)navigationController.topViewController;

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
Punchitem *editPunchItem = (Punchitem*)[self.fetchedResultsController objectAtIndexPath:indexPath];

editPunchItemViewController.editPunchitem = editPunchItem;

现在,在编辑核心数据的目标View Controller中,这是saveButtonPressed方法的一部分:

 if  ([_editSaveButton.title isEqualToString:@"Save"]) {
    NSLog(@"Save Button has been PRESSED");

    editPunchitem.punchitemRoomNumber = _editPunchitemRoomNumberField.text;
    editPunchitem.punchitemDescription = _editPunchitemDescriptionField.text;
    editPunchitem.punchitemLocation = _editPunchitemLocationField.text;
    editPunchitem.punchitemRoomName = _editPunchitemRoomNameField.text;
    editPunchitem.punchitemDate = _editPunchitemDateField.text;

    // SAVE TO MANAGE OBJECT CONTEXT!
    [super saveAndDismiss];
}

有什么建议吗?

这是TableViewController中的cellForRowAtIndex

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));

    static NSString *CellIdentifier = @"customCell";

//  USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    Punchitem *punchitem = [self.fetchedResultsController objectAtIndexPath:indexPath];

//  USING CUSTOM PROTOTYPE CELL:
    cell.cellLocationLabel.text = punchitem.punchitemLocation;
    cell.cellDescriptionLabel.text = punchitem.punchitemDescription;
    cell.cellRoomNameLabel.text = punchitem.punchitemRoomName;

    return cell;
}

保存和关闭是子类的一部分。这是方法:

-(void) saveAndDismiss {

    NSError *error = nil;
    if ([self.managedObjectContext hasChanges]) {
        if (![self.managedObjectContext save:&error]) {  //SAVE FAILED
            NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]);
        } else {
            NSLog(@"SAVE SUCCEEDED!");
        }
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

4 个答案:

答案 0 :(得分:0)

您是否在从EditPunchItemViewController返回时尝试重新加载表?

放入主视图控制器:

- (void)viewWillAppear:(BOOL)animated {
   if (self.tableView) {
        [self.tableView reloadData];
    }
}

答案 1 :(得分:0)

你有这样的东西

[self.tableView beginUpdates];

如果是,你确定在完成时调用它

[self.tableView endUpdates];

大部分时间我们都使用NSFetchedResultsController ......

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}
...
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

答案 2 :(得分:0)

最后一个选项,你必须有条件调试......

所有在您的主ViewController中:

1)添加属性

@property (strong,nonatomic) NSIndexPath *DEBUGindexPath;

2)在

中设置DEBUGindexPath
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell*)sender {

if ([[segue identifier]isEqualToString:@"editPunchItemSegue"]) {
...
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
DEBUGindexPath = indexPath;
...

3)在

中添加BreakPoint
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

编辑断点以设置条件:

(self.DEBUGindexPath.row == indexPath.row) && (self.DEBUGindexPath.section == indexPath.section)

请勿设置自动继续...

好的,现在运行你的应用程序。当您从EditPunchItemViewController返回时,断点应仅触发所选行。一步一步检查你是否能找到一些东西

答案 3 :(得分:0)

  

视图返回到UITableView,但刚刚编辑过的单元格显示为“基本”单元格,而不是customCell。

仔细看cellForRowAtIndexPath,以下条件:

    //USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell =
                    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]
                             initWithStyle:UITableViewCellStyleDefault 
                           reuseIdentifier:CellIdentifier];
    }

当单元格为零时,您将其样式设置为UITableViewCellStyleDefault但您忘记通过代码设置其附件类型。

所以只需确保在if语句中设置其附件类型:

    //USING CUSTOM PROTOTYPE CELL:
    CustomTableViewCell *cell =
                    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]
                             initWithStyle:UITableViewCellStyleDefault 
                           reuseIdentifier:CellIdentifier];
        //Set accessory to Detail
        cell.accessoryType = UITableViewCellAccessoryDetailButton;
    }

以下是完整的风格列表:

typedef enum : NSInteger {
   UITableViewCellAccessoryNone,
   UITableViewCellAccessoryDisclosureIndicator,
   UITableViewCellAccessoryDetailDisclosureButton,
   UITableViewCellAccessoryCheckmark,
   UITableViewCellAccessoryDetailButton
} UITableViewCellAccessoryType;