传递Core Data对象 - segue不会更新U.I.第一次尝试

时间:2013-01-24 23:55:45

标签: uitableview ios5 core-data uistoryboardsegue

我在更新U.I时遇到了一个奇怪的问题。经过一段时间。这是一个非常标准的设计:用户在tableview中选择一个单元格,这会触发一个segue到一个细节屏幕,该屏幕反映了所选单元格中对象的值 - 在本例中为reed - 并允许用户编辑

我在详细信息屏幕中有一个选择器视图,其中包含两个组件,索引号和品牌。

当我点击一个单元格时,segue会离开U.I.不更新 - 选择器保持默认状态,索引0。

如果我点击“取消”返回到表格视图,然后再次点击同一个单元格,详细视图将正确更新。

如果我然后点击取消并选择一个新单元格,则详细视图仍会反映最后一个单击的单元格。如果我再次点击它,它会正确更新。你得到了图片:我必须两次点击任何给定的单元格才能更新它。

编辑:我意识到我在故事板中通过代码手动调用了两次segue。我删除了手动调用performSegue的代码行...现在该对象只被传递一次,但它仍然没有在第一次尝试时更新。

在ViewDidLoad中分配(没有值)选择器,如果这有所不同。然后它应该在ViewDidAppear中更新。

我的fetchedResultsController的缓存名称初始化为“nil”。这意味着没有缓存,对吧?那不是问题吗?

这是表格视图中的相关代码。 reedToEdit是此类的属性,它传递给detail控制器(具有相同名称的属性):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.reedToEdit = [fetchedResultsController objectAtIndexPath:indexPath];

}




-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *navigationController = segue.destinationViewController;
ReedDetailsViewController *controller = (ReedDetailsViewController *) [[navigationController viewControllers] objectAtIndex:0];

if ([segue.identifier isEqualToString:@"AddReed"]) {
    controller.reedToEdit = nil;
    controller.managedObjectContext = self.managedObjectContext;
    controller.delegate = self;
} else if ([segue.identifier isEqualToString:@"ShowReed"]) {
    controller.reedToEdit = self.reedToEdit;
    NSLog(@"*** prepareForSegue. reedToEdit = %@", controller.reedToEdit);
    NSLog(@"controller = %@", controller);

    controller.title = @"Edit Reed";
    controller.managedObjectContext = self.managedObjectContext;
    controller.delegate = self;
} else {
    NSLog(@"***Unrecognized segue");
    abort();
    }
}

这是来自详细控制器的代码(带有选择器视图)。

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.reedToEdit != nil) {
        isEditing = YES;
        [self updateInterface];
    }
}

-(void)updateInterface
{
    [picker selectRow:[self.reedToEdit.indexNumber intValue] -1
      inComponent:1
         animated:NO];

    [picker selectRow:[self rowForBrand: self.reedToEdit.brand]
      inComponent:0
         animated:NO];

}

1 个答案:

答案 0 :(得分:4)

我看到几个问题。

首先,基于所选索引路径将参数传递给segue的正确方法是didSelectRowAtIndexPath:中设置ivar并在prepareForSegue:中使用此ivar。相反,您应该使用sender对象。

UITableViewCell *cell = (UITableViewCell*) sender;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
Reed *reedToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath];
顺便说一句,你可以避免像

这样的行的冗余
controller.managedObjectContext = self.managedObjectContext;
controller.delegate = self;

放在 区分segue的if子句。

其次,主要是化妆品问题是你在viewDidAppear:中设置了没有动画的选择器的属性这一事实根据经验,如果控件在屏幕外,你不应该使用动画,否则动画是有序的。设置UI元素值的正确位置位于viewWillAppear:viewDidLoad:,即之前