更改更新核心数据属性的删除方法
Posted
技术标签:
【中文标题】更改更新核心数据属性的删除方法【英文标题】:Change deleting method for updating core data attribute 【发布时间】:2013-12-19 18:58:02 【问题描述】:过了一会儿,我现在可以在对选定行进行长按操作后从表视图中删除核心数据记录。根据我的应用程序要求,我不想永久删除记录,我只想将记录标记为已删除,因此我创建了一个名为 ToDoStatus 的属性,我想对其进行更新并将其内容更改为“标记为已删除” ' 当用户在所选行上执行长按操作时。 在这里,您拥有现在的代码(永久删除该行)。 恳请您告诉我如何更改 handleLongPress 方法中属性内容的值:
#import "RootViewController.h"
#import "AddToDoViewController.h"
#import "EditToDoViewController.h"
#import "MenuViewController.h"
@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
@end
@implementation RootViewController
@synthesize fetchedResultsController, managedObjectContext,AddToDoButton,MenuToDoButton;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad
[super viewDidLoad];
// [self setTitle:@"Today"];
[[self navigationItem] setRightBarButtonItem:[self editButtonItem]];
self.editButtonItem.tintColor = [UIColor redColor];
UILabel *lblTitle = [[UILabel alloc] init];
lblTitle.text = @"Today";
lblTitle.backgroundColor = [UIColor clearColor];
lblTitle.textColor = [UIColor blueColor];
lblTitle.shadowColor = [UIColor whiteColor];
lblTitle.shadowOffset = CGSizeMake(0, 1);
lblTitle.font = [UIFont fontWithName:@"Noteworthy" size:25.0];
[lblTitle sizeToFit];
self.navigationItem.titleView = lblTitle;
[self.editButtonItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Noteworthy" size:20], NSFontAttributeName,
[UIColor blueColor], NSForegroundColorAttributeName,
nil]
forState:UIControlStateNormal];
self.tableView.delegate = self;
self.tableView.dataSource = self;
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
- (void) viewWillAppear:(BOOL)animated
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
[self.tableView reloadData];
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
[[cell textLabel] setText:[[managedObject valueForKey:@"estado"] description]];
NSString *myString = [NSString stringWithFormat:@"%@",[[managedObject valueForKey:@"todoYear"] description]];
UIButton *urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(15, 25, 18, 18)];
[urgentButton setImage:[UIImage imageNamed:@"urgent"]forState:UIControlStateNormal];
[cell addSubview:urgentButton];
UIButton *yellowButton = [[UIButton alloc]initWithFrame:CGRectMake(305, 5, 10, 40)];
[yellowButton setImage:[UIImage imageNamed:@"Red"]forState:UIControlStateNormal];
[cell addSubview:yellowButton];
UIButton *doneButton = [[UIButton alloc]initWithFrame:CGRectMake(33, 27, 18, 18)];
[doneButton setImage:[UIImage imageNamed:@"alldone"]forState:UIControlStateNormal];
[cell addSubview:doneButton];
UIButton *doneButton2 = [[UIButton alloc]initWithFrame:CGRectMake(53, 27, 18, 18)];
[doneButton2 setImage:[UIImage imageNamed:@"alldone"]forState:UIControlStateNormal];
[cell addSubview:doneButton2];
UIButton *doneButton3 = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];
[doneButton3 setImage:[UIImage imageNamed:@"urgent"]forState:UIControlStateNormal];
[cell addSubview:doneButton3];
[[cell detailTextLabel] setText:@" "];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.textLabel.textColor = [UIColor blueColor];
cell.textLabel.font = [UIFont fontWithName:@"Noteworthy" size:22.0f];
cell.detailTextLabel.font = [UIFont fontWithName:@"Noteworthy" size:15.0f];
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
EditToDoViewController *detailViewController = [[EditToDoViewController alloc] initWithNibName:@"EditToDoViewController" bundle:nil];
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.selectedObject = selectedObject;
//[self.navigationController pushViewController:detailViewController animated:YES];
[self presentViewController:detailViewController animated:YES completion:nil];
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [[fetchedResultsController sections] count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"Cell"] autorelease];
//long press
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.00;
//seconds
[cell addGestureRecognizer:lpgr];
[self configureCell:cell atIndexPath:indexPath];
return cell;
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
CGPoint p = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil)
NSLog(@"long press on table view but not on a row");
else
if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
NSLog(@"UIGestureRecognizerStateEnded");
//Do Whatever You want on End of Gesture
else if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Announcement" message: @"You have long-pressed the row...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
NSLog(@"UIGestureRecognizerStateBegan.");
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
NSLog(@"long press on table view at row %d", indexPath.row);
// Update ToDoStatus
NSError *error1 = nil;
if (![[self fetchedResultsController] performFetch:&error1])
NSLog(@"Unresolved error %@, %@", error1, [error1 userInfo]);
abort();
NSError *error = nil;
if (![context save:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
[self.tableView reloadData];
//Do Whatever You want on Began of Gesture
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
NSError *error = nil;
if (![context save:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
NSError *error1 = nil;
if (![[self fetchedResultsController] performFetch:&error1])
NSLog(@"Unresolved error %@, %@", error1, [error userInfo]);
abort();
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"To-Do Deleted" message: @"You have marked To-Do as deleted...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
[self.tableView reloadData];
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
return YES;
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toIndexPath:(NSIndexPath *)destinationIndexPath;
NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy];
// Grab the item we're moving.
NSManagedObject *thing = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];
// Remove the object we're moving from the array.
[things removeObject:thing];
// Now re-insert it at the destination.
[things insertObject:thing atIndex:[destinationIndexPath row]];
// All of the objects are now in their correct order. Update each
// object's displayOrder field by iterating through the array.
int i = 0;
for (NSManagedObject *mo in things)
[mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"];
[things release], things = nil;
[managedObjectContext save:nil];
#pragma mark -
#pragma mark Fetched results controller
- (IBAction)AddToDoAction:(id)sender
AddToDoViewController *viewController = [[AddToDoViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
#pragma mark Fetched results controller
- (IBAction)MenuToDoAction:(id)sender
MenuViewController *viewController = [[MenuViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
- (NSFetchedResultsController *)fetchedResultsController
if (fetchedResultsController) return fetchedResultsController;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"FavoriteThing"
inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor =
[[NSSortDescriptor alloc] initWithKey:@"displayOrder"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]
initWithObjects:sortDescriptor, nil];
NSNumber *yearBuscado = @2013;
NSNumber *mesBuscado = @12;
NSNumber *diaBuscado = @13;
NSString *tipourgente = @"Urgent";
NSString *tipocolor = @"Yellow";
NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear == %@", yearBuscado];
NSPredicate *monthPredicate = [NSPredicate predicateWithFormat:@"todoMonth == %@", mesBuscado];
NSPredicate *dayPredicate = [NSPredicate predicateWithFormat:@"todoDay == %@", diaBuscado];
NSPredicate *urgentPredicate = [NSPredicate predicateWithFormat:@"urgent == %@", tipourgente];
NSPredicate *colorPredicate = [NSPredicate predicateWithFormat:@"color == %@", tipocolor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSPredicate *busqueda = [NSCompoundPredicate andPredicateWithSubpredicates:@[yearPredicate, monthPredicate,dayPredicate,urgentPredicate]];
[fetchRequest setPredicate:busqueda];
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
[self setFetchedResultsController:aFetchedResultsController];
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
- (void)dealloc
[fetchedResultsController release];
[managedObjectContext release];
[super dealloc];
@end
【问题讨论】:
这就像更改任何对象的任何属性值一样。你不明白哪一部分?[[fetchedResultsController objectAtIndexPath:indexPath] setValue:@"Gone" forKey:@"ToDoStatus"]
那是@Wain,谢谢...
@Wain,您介意将您的提案作为我问题的答案发布,以便我接受吗?
【参考方案1】:
您当前拥有deleteObject:
的位置,替换为:
[[fetchedResultsController objectAtIndexPath:indexPath] setValue:@"Gone" forKey:@"ToDoStatus"]
仅此而已。
【讨论】:
以上是关于更改更新核心数据属性的删除方法的主要内容,如果未能解决你的问题,请参考以下文章