Ios 使用核心数据使用didSelectRowAtIndexPath编辑TableView单元格
我一直在遵循一些关于堆栈溢出的指南和问题,但在基本的表视图编辑中并没有得到期望的结果 我有一个应用程序,它是一个表视图控制器。如果我按下加号按钮,它会弹出一个视图控制器,允许我向4个文本字段(和一个日期选择器)添加信息。当我保存它时,它会保存到核心数据,表视图会显示信息。我现在只想能够点击表格视图中的一个单元格,被带到另一个视图控制器,并在需要时编辑单元格。此视图控制器看起来与添加视图控制器相同 当前在详细视图中,它没有显示文本字段中的值,并且NSLog返回空值 在表视图中,我使用NSFetchedResultsController填充数据库中的信息,应用程序委托中的NSManagedContext如下所示:Ios 使用核心数据使用didSelectRowAtIndexPath编辑TableView单元格,ios,objective-c,uitableview,core-data,didselectrowatindexpath,Ios,Objective C,Uitableview,Core Data,Didselectrowatindexpath,我一直在遵循一些关于堆栈溢出的指南和问题,但在基本的表视图编辑中并没有得到期望的结果 我有一个应用程序,它是一个表视图控制器。如果我按下加号按钮,它会弹出一个视图控制器,允许我向4个文本字段(和一个日期选择器)添加信息。当我保存它时,它会保存到核心数据,表视图会显示信息。我现在只想能够点击表格视图中的一个单元格,被带到另一个视图控制器,并在需要时编辑单元格。此视图控制器看起来与添加视图控制器相同 当前在详细视图中,它没有显示文本字段中的值,并且NSLog返回空值 在表视图中,我使用NSFetch
- (NSManagedObjectContext *)managedObjectContext
{
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)])
{
context = [delegate managedObjectContext];
}
return context;
}
- (NSFetchedResultsController *)fetchedResultsController
{
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
if (_fetchedResultsController != nil)
{
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Information" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date.historyDate" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"date.historyDate" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
CellforRow=
cell.textLabel.text = information.vendor;
cell.detailTextLabel.text = information.type;
我的didSelectRowAtIndexPath方法如下:
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] init];
Information *selectedInformation = [self.fetchedResultsController objectAtIndexPath:indexPath];
detailViewController.selectedInformation = selectedInformation;
[self.navigationController pushViewController:detailViewController animated:YES];
}
DetailViewController具有以下信息的属性:
@property (nonatomic, strong) Information *selectedInformation;
详图中的viewDidLoad如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = self.selectedInformation.vendor;
self.editingNameField.text = self.selectedInformation.vendor;
NSLog(@"%@", self.editingNameField.text);
}
编辑:更新以包括prepareForSegue
NSIndexPath *indexPath = [self.timelineTableView indexPathForCell:sender];
Information *selectedInformation = [self.fetchedResultsController objectAtIndexPath:indexPath];
if ([segue.identifier isEqualToString:@"Editable Cell"])
{
DetailViewController *selectedInformationTVC = [segue destinationViewController];
[selectedInformationTVC setSelectedInformation:selectedInformation];
}
它调用setSelectedInformation:
-(无效)设置所选信息:(信息*)所选信息
{
self.title=self.selectedInformation.vendor
self.editingNameField.text = self.selectedInformation.vendor;
NSLog(@"%@", self.editingNameField.text);
}
我没有同时使用didSelectRow和prepareForSegue,这是其中之一,但两者都给出相同的结果
NSLog给我的是NULL,当视图控制器出现在屏幕上时,它在该字段中没有任何信息
我在storyboard中使用了这个新的视图控制器,所以我不确定是否应该使用prepareForSegue,但这也不起作用
我的问题是-我是否需要在DetailViewController中提取一些核心数据
我需要做些什么才能让它工作
谢谢 如果您使用的是故事板,您肯定应该在
prepareforsgue
方法中进行信息转换,因为故事板本身将实例化您的视图控制器
在您的didSelect
方法中:
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
Information *information = [self.fetchedResultsController objectAtIndexPath:indexPath];
// Save your selected information for later
self.selectedInformation = information;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"DetailViewSegue"])
{
DetailViewController *dvc = (DetailViewController *)segue.destinationViewController;
dvc.selectedInformation = self.selectedInformation;
}
}
}
在您的prepareforsgue
方法中:
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
Information *information = [self.fetchedResultsController objectAtIndexPath:indexPath];
// Save your selected information for later
self.selectedInformation = information;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"DetailViewSegue"])
{
DetailViewController *dvc = (DetailViewController *)segue.destinationViewController;
dvc.selectedInformation = self.selectedInformation;
}
}
那就够了 您的两种方法都有不同的问题: 当您使用
didDeceloseRowatingIndexPath
和viewDidLoad
时,您的问题是您正在创建一个从未放在屏幕上的视图控制器(因为segue创建了一个不同的视图控制器)
当您使用prepareforsgue
时,您的问题是调用setSelectedInformation
,它会立即尝试与editingNameField
进行交互,但这还不存在(因为视图尚未加载)
因此,您应该使用prepareForSegue
,但还需要使用viewDidLoad
。将信息设置为目标视图控制器。在目标中,加载视图后将该数据应用于该视图
最后,从调试的角度—记录源数据,而不仅仅是结果。这将引导您找到问题的根源。如果使用segue,则应使用
prepareforsgue
。显示代码。谢谢@Wain-我已经更新了代码以反映这一点谢谢你的回复-我尝试了,但不幸的是仍然得到了相同的结果,尽管现在NSLog看起来没有运行,这意味着我可以理解为什么这不起作用。NSLog位于viewDidLoad中。我在TableView中创建了一个Information selectedInformation属性,因此当我将self.selectedInformation放入didSelect中时,它会调用该属性。我也在DVC中选择了一条信息。。我想我们快到了!我现在想弄清楚为什么NSLog根本不运行首先,我使用了错误的方法:)我使用的是DIDDENSELECT….-你的代码现在可以用了,但它不会一直给我选定的单元格。。如果我有单元格1并单击它,它会显示单元格1。。如果我返回并单击单元格2,它会再次显示单元格1。。如果我返回并单击单元格3,它会显示单元格2。我想你可以在prepareForSegue的末尾添加self.selectedInformation=nil
?谢谢@Wain-这样做了。我坚持使用prepareForSegue方法和viewDidLoad,一切都进展顺利。非常感谢-非常感谢!