Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用核心数据使用didSelectRowAtIndexPath编辑TableView单元格_Ios_Objective C_Uitableview_Core Data_Didselectrowatindexpath - Fatal编程技术网

Ios 使用核心数据使用didSelectRowAtIndexPath编辑TableView单元格

Ios 使用核心数据使用didSelectRowAtIndexPath编辑TableView单元格,ios,objective-c,uitableview,core-data,didselectrowatindexpath,Ios,Objective C,Uitableview,Core Data,Didselectrowatindexpath,我一直在遵循一些关于堆栈溢出的指南和问题,但在基本的表视图编辑中并没有得到期望的结果 我有一个应用程序,它是一个表视图控制器。如果我按下加号按钮,它会弹出一个视图控制器,允许我向4个文本字段(和一个日期选择器)添加信息。当我保存它时,它会保存到核心数据,表视图会显示信息。我现在只想能够点击表格视图中的一个单元格,被带到另一个视图控制器,并在需要时编辑单元格。此视图控制器看起来与添加视图控制器相同 当前在详细视图中,它没有显示文本字段中的值,并且NSLog返回空值 在表视图中,我使用NSFetch

我一直在遵循一些关于堆栈溢出的指南和问题,但在基本的表视图编辑中并没有得到期望的结果

我有一个应用程序,它是一个表视图控制器。如果我按下加号按钮,它会弹出一个视图控制器,允许我向4个文本字段(和一个日期选择器)添加信息。当我保存它时,它会保存到核心数据,表视图会显示信息。我现在只想能够点击表格视图中的一个单元格,被带到另一个视图控制器,并在需要时编辑单元格。此视图控制器看起来与添加视图控制器相同

当前在详细视图中,它没有显示文本字段中的值,并且NSLog返回空值

在表视图中,我使用NSFetchedResultsController填充数据库中的信息,应用程序委托中的NSManagedContext如下所示:

- (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,一切都进展顺利。非常感谢-非常感谢!