在 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];
}