1

在 segue 之后更新 UI 时我遇到了一个奇怪的问题。这是一个非常标准的设计:用户在 tableview 中选择一个单元格,这会触发一个 segue 到一个详细屏幕,该屏幕反映了所选单元格中对象的值——在这种情况下,是一个芦苇——并允许用户编辑.

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

当我单击一个单元格时,segue 会继续,但 UI 不会更新——选择器保持默认状态,索引 0。

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

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

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

选择器在 ViewDidLoad 中分配(没有值),如果这有区别的话。然后它应该在 ViewDidAppear 中更新。

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

这是表格视图中的相关代码。reedToEdit 是这个类的一个属性,它被传递给细节控制器(它有一个同名的属性):

- (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];

}
4

1 回答 1

4

我看到几个问题。

首先,根据选定的索引路径将参数传递给您的 segue 的正确方法是设置 ivar indidSelectRowAtIndexPath:并使用此 ivar in prepareForSegue:。相反,您应该使用该sender对象。

UITableViewCell *cell = (UITableViewCell*) sender;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
Reed *reedToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath];

顺便说一句,你可以避免像这样的行的冗余

controller.managedObjectContext = self.managedObjectContext;
controller.delegate = self;

通过将它们放在区分 segues的子句之外。if

其次,主要是一个装饰性问题是您正在设置没有动画的选择器属性根据viewDidAppear:经验,如果控件不在屏幕上,则不应使用动画,否则动画是有序的。设置 UI 元素值的正确位置是 inviewWillAppear:或什至 in viewDidLoad:,即它们出现之前。

于 2013-01-25T00:53:34.887 回答