我在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];
}
答案 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;