问:我正在尝试将托管对象的现有实体属性值传递给模式segue视图的字段,以进行编辑。
我的TableViewCells有两种选择:一种用于详细视图,另一种用于编辑视图。有一个UIToolBarButtonItem可以在导航栏中切换编辑。从“编辑模式”开始,我将从UITableViewController子类(BreadRackTableViewController)开始,使用模式搜索通过嵌入式UINavigationController转换为UIViewController子类(EditBreadRackTableViewController)。普通的TableViewCell选择会推送到另一个UITableViewController子类以进行详细信息视图,但这暂时并不重要。
我确实尝试将其放入我的didSelectRowAtIndexPath方法中,但是它破坏了导航栏的功能。我假设这样做是因为我在同一行中有多个分支。选择一个普通行,以及选择一个带有编辑附件的行必须是两个不同的事件。
我已将属性添加到编辑视图控制器头文件中(并在实现文件中@synthesized),以用作吸气剂。我也尝试将这些属性设置为id类型,并将它们的描述分配给目标字段。在大多数情况下,此过程正在分配值:
@属性(非原子的,强的)NSString * existingBreadRackDataName;
@属性(非原子的,强的)NSString * existingBreadRackDataDetails;
我想做的是使用现有的“核心数据实体属性”值填充编辑视图的字段,该值先前已由用户设置(理论上)。编辑视图具有一个UITextView和一个UITextField对象,我需要为其填充值。在我的数据模型中,实体属性也已经是String类型的。如果传递文字字符串值,则可以显示数据,但是我需要检索并传递现有数据。
这是我目前所拥有的:
-(void)prepareForSegue:(UIStoryboardSegue *)segue发件人:(id)sender
{
if([[segue identifier] isEqualToString:@“ editBreadRackSegue”])
{
NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow];
BreadRackClass * breadRackClass = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[segue.destinationViewController setExistingBreadRackDataName:[breadRackClass valueForKey:@“ breadRackDataName”]]];
[segue.destinationViewController setExistingBreadRackDataDetails:[breadRackClass valueForKey:@“ breadRackDataDetails”]]];
NSLog(@“发送名称:%@”,[breadRackClass valueForKey:@“ breadRackDataName”]);
NSLog(@“发送名称:%@”,
}
//另一个if语句为addButton设置在这里...
}
最后两行代码...
[segue.destinationViewController setExistingBreadRackDataName:[breadRackClass valueForKey:@“ breadRackDataName”]]];
[segue.destinationViewController setExistingBreadRackDataDetails:[breadRackClass valueForKey:@“ breadRackDataDetails”]]];
...它们都返回nil。但是,如果我指定文字字符串,则可以通过以下方式将该文字字符串传递到所需的位置:
[segue.destinationViewController setExistingBreadRackDataName:@“测试字符串”];
但是,我当然不希望它是一个静态值。我希望它可以填充现有的实体属性键值,因此用户可以看到自从屏幕更改后当前存在的内容。当我启动应用程序并执行editBreadRackSegue时,NSLog每次都会返回“已发送名称:(空)”。
我也确实按照Core Data视频中的Amit指示进行操作,以验证我的* .sqlite文件中是否确实存在数据。
我还尝试将其放入我的prepareForSegue中,以为我可以创建对所选单元格属性的某些引用,而不是对传递的Core Data的引用:
UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:[sender indexPathForSelectedRow]];
但是,当我尝试使用以下简单日志进行测试时:
NSLog(@“发送名称:%@”,cell.textLabel.text);
...这件事使我发了错:
-[UITableViewCell indexPathForSelectedRow]:无法识别的选择器已发送到实例
我试图引用单元格的文本标签,因为当我的BreadRackTableViewController实现绘制它们时,它们已经被正确地填充了。我确实觉得这种方法并不是最明智的方法,但我主要只是在修改代码,以查看是否可以使其以这种方式工作。
最后,尽管如此,我仍然希望引用进行segue的行的实体属性,并且至少能够将值成功发送到NSLog。
答:按照他的建议,我只替换了原始帖子中列出的一行代码。原来,我引用的是表中的行,而不是该表中该行的特定单元格。天哪!
这是最终结果:
-(void)prepareForSegue:(UIStoryboardSegue *)segue发件人:(id)sender
{
if([[[segue identifier] isEqualToString:@“ editBreadRackSegue”])
{
NSIndexPath * indexPath = [self.tableView indexPathForCell:sender];
BreadRackClass * breadRackClass = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[segue.destinationViewController setExistingBreadRackDataName:[breadRackClass valueForKey:@“ breadRackDataName”]]];
[segue.destinationViewController setExistingBreadRackDataDetails:[breadRackClass valueForKey:@“ breadRackDataDetails”]]];
}
//其他安全代码...
}
罪魁祸首是:
NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow];
...我已更改为:
NSIndexPath * indexPath = [self.tableView indexPathForCell:sender];