1

セグエ後に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];

}
4

1 に答える 1

4

いくつかの問題があります。

まず、選択したインデックスパスに基づいてパラメータをセグエに渡す適切な方法は、にivarを設定せずdidSelectRowAtIndexPath:、でこのivarを使用すること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;

セグエを区別する条項のにそれらを置くことによって。if

次に、主に外観上の問題は、アニメーションなしでピッカーのプロパティを設定しているという事実です。viewDidAppear:経験則として、コントロールが画面外にある場合はアニメーションを使用しないでください。そうでない場合、アニメーションは正常です。UI要素の値を設定する適切な場所は、内または内にviewWillAppear:さえあります。viewDidLoad:つまり、表示される前です。

于 2013-01-25T00:53:34.887 に答える