在viewDidLoad中,我有:
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
对于insertNewObjectMethod我有:
- (void)insertNewObject:(id)sender
{
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;
[self performSegueWithIdentifier:@"showCommodityTypesDetail" sender:sender];
}
还有:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showCommodityTypesDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
}
当我构建并运行该应用程序并选择+按钮时,它会转到详细信息页面,但不会加载newManagedObject信息。
我的猜测是performSegueWithIdentifier会触发对prepareForSeque的调用,并且由于没有选定的行,因此不会加载任何内容,但是此方法将覆盖较早的self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context =上下文;
我该如何解决?
首先猜测,insertNewObject创建newManagedObject。如何选择表格中显示的行?
从这里开始iOS程序员。
尤里卡
self.detailViewController
是iPad拆分视图控制器使用的详细视图控制器实例,而不是iPhone界面使用的详细视图控制器实例。performSegueWithIdentifier
确实向prepareForSegue
发送了一条消息。要解决我的问题,我必须做两件事。创建一个从主视图控制器到详细视图控制器的第二序列。
原始定序从表格视图行链接到详细信息视图控制器。第二个主题我从主视图控制器链接到详细视图控制器。 (使用Interface Builder中视图控制器的页脚中的视图控制器图标。)
在if语句中,将对象创建行从
insertNewObject
移到prepareForSeque
,该语句选择第二个序列的唯一名称。- (void)insertNewObject:(id)sender
{
[self performSegueWithIdentifier:@"ctAddButtonToDetail" sender:sender];
}
和
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ctMasterRowToDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
if ([[segue identifier] isEqualToString:@"ctAddButtonToDetail"]) {
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[[segue destinationViewController] setDetailItem:newManagedObject];
[[segue destinationViewController] setContext:context];
}
}
最佳答案
在您的insertNewObject:方法中,您有这两行-
self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;
...这表明您已经尝试初始化要使用的detailViewController。您不需要这样做,因为它已经在情节提要中链接了,所以它会自动初始化,并且您可以按照您实际的方式在prepareForSegue:sender:方法中将想要传递的任何信息传递给它。
至于获取正确的数据,也许您可以在tableView的委托方法tableView:didSelectRowAtIndexPath:中执行此操作,然后只需将ivar设置为所选行的行号,即可在prepareForSegue:方法中获取信息。
关于objective-c - 使用newManagedObject将insertNewObject分隔到detailViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10155280/