セグエ後にUIを更新する際に奇妙な問題が発生しています。これはかなり標準的なデザインです。ユーザーがテーブルビューでセルを選択すると、選択したセルのオブジェクト(この場合はリード)の値を反映する詳細画面へのセグエがトリガーされ、ユーザーが編集できるようになります。 。
詳細画面に、インデックス番号とブランドの2つのコンポーネントを含むピッカービューがあります。
セルをクリックすると、セグエは実行されますが、UIは更新されません。ピッカーはデフォルトの状態であるインデックス0のままです。
「キャンセル」を押してテーブルビューに戻り、同じセルをもう一度クリックすると、詳細ビューが正しく更新されます。
次にキャンセルを押して新しいセルを選択すると、詳細ビューには最後にクリックされたセルが反映されます。もう一度クリックすると、正しく更新されます。画像が表示されます。セルを更新するには、任意のセルを2回クリックする必要があります。
編集:ストーリーボードとコードを介して手動でセグエを2回呼び出していることに気付きました。手動でperformSegueを呼び出したコード行を削除しました...オブジェクトは1回だけ渡されますが、最初の試行ではまだ更新されません。
違いが生じる場合、ピッカーは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];
}