我在更新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];
}
答案 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:
,即之前。