gpt4 book ai didi

iphone - NSFetchedResultsChangeDelete 未被触发

转载 作者:行者123 更新时间:2023-12-03 19:46:36 26 4
gpt4 key购买 nike

有人遇到过这种情况吗?

当我选择从 tableView(由 FRC 填充)中删除一行时,应用程序不会崩溃或挂起。它没有任何作用。删除按钮保持选中状态,如果我单击模拟器上的其他位置,删除按钮将取消选择并消失,但单元格永远不会从 UI 中删除。我确信我在这里犯了一个愚蠢的疏忽,但我无法发现它。以下是我的代码的相关部分。

我的 UITableViewController 接口(interface)声明如下:

#import <UIKit/UIKit.h>
#import "RubricAppDelegate.h"


@interface ClassList : UITableViewController <NSFetchedResultsControllerDelegate> {
NSMutableArray *classList;
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;

}

@property(nonatomic,retain) NSMutableArray *classList;
@property(nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property(nonatomic, retain) NSManagedObjectContext *managedObjectContext;

- (IBAction) grade:(id)sender;

@end

在其实现文件中,我有:

- (void)viewDidLoad {

[super viewDidLoad];

RubricAppDelegate *appDelegate = (RubricAppDelegate *)[[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"myClass" inManagedObjectContext:managedObjectContext];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"classID" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];


fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
NSError *error;
[fetchedResultsController performFetch:&error];
}

还有

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
myClass *result = (myClass *)[fetchedResultsController objectAtIndexPath:indexPath];
[managedObjectContext deleteObject:result];
NSError *error;
[managedObjectContext save:&error];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
//Not yet implemented
}
}

还有

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

UITableView *tableView = self.tableView;

switch(type) {

case NSFetchedResultsChangeInsert:

[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];

break;

case NSFetchedResultsChangeDelete:

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];

break;

case NSFetchedResultsChangeUpdate:

[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];

break;

case NSFetchedResultsChangeMove:

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];

[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];

break;
}

}

还有

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == [[fetchedResultsController fetchedObjects] count]) {
return UITableViewCellEditingStyleInsert;
}
return UITableViewCellEditingStyleDelete;
}

上面的代码使位于我的提取填充单元格之外的单元格成为插入单元格,但其余的单元格删除单元格。

我将 UITableView 连接到我的文件所有者,以获取 IB 中的委托(delegate)和数据源。我需要更改什么才能触发 NSFetchedResultsChangeDelete:

更新:

我已将 [managementObjectContext save:&error]; 添加到 commitEditingStyle 中,并通过断点验证当我选择删除单元格时它是否被命中。我知道保存处理正确,因为如果我退出并重新运行应用程序,我选择删除的单元格实际上会被删除。

但是,当我按下删除按钮时,仍然没有任何反应。该按钮保持选中状态,直到我单击其他位置,从而取消选择它。

最佳答案

你能展示一下构建NSFetchedResultsController的代码吗?现在您已经按照 @DVG 建议保存了代码,那么您应该会收到回调。也许您的委托(delegate)设置不正确。

更新

正如我怀疑的那样,您没有在 NSFetchedResultsController 上设置委托(delegate):

[fetchedResultsController setDelegate:self];

在调用 -performFetch: 的位置添加该行后,您应该开始接收更新。

关于iphone - NSFetchedResultsChangeDelete 未被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3368087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com