0

管理対象オブジェクトの既存の属性値をモーダル セグエ ビューに渡して編集しようとしています。「編集モード」から、UITableViewController サブクラス (BreadRackTableViewController) からモーダル セグエを使用して、組み込みの UINavigationController を使用して UIViewController サブクラス (EditBreadRackTableViewController) に移動します。通常の TableViewCell 選択は別の UITableViewController サブクラスにプッシュされますが、それは当面重要ではありません。

ゲッターとして機能するために、編集ビュー コントローラー ヘッダー (および @syntheized) にプロパティを追加しました。

@property (nonatomic, strong) id existingBreadRackDataName;
@property (nonatomic, strong) id existingBreadRackDataDetails;

私がやろうとしているのは、編集ビューのフィールドに既存の Core Data Entity Attributes を入力することです。これは、以前にユーザーによって設定されていたはずです (理論上)。リテラル文字列値を渡せばデータを表示できますが、既存のデータを取得して渡す必要があります。

これが私が現在持っているものです:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"editBreadRackSegue"])
    {
        EditBreadRackTableViewController *ebrtvc = (EditBreadRackTableViewController *)[segue destinationViewController];

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        BreadRackClass *breadRackClass = [[self fetchedResultsController]objectAtIndexPath:indexPath];
        // [ebrtvc setBreadRackClass:breadRackClass];
        ebrtvc.existingBreadRackDataName = breadRackClass.breadRackDataName;
        ebrtvc.existingBreadRackDataDetails = [breadRackClass valueForKey:@"breadRackDataDetails"];
    }
}

この最後の 2 行のコードは...

ebrtvc.existingBreadRackDataName = breadRackClass.breadRackDataName;
ebrtvc.existingBreadRackDataDetails = [breadRackClass valueForKey:@"breadRackDataDetails"];

...どちらも nil を返します。ただし、リテラル文字列を指定すると、そのリテラル文字列が必要な場所に表示されます。

そうは言っても、私の質問は次のとおりです。

選択した行 (または textLabel と detailTextLabels のみ) の属性のキー値を取得し、それをセッターに割り当てるにはどうすればよいですか?

解決:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"editBreadRackSegue"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        BreadRackClass *breadRackClass = [[self fetchedResultsController]objectAtIndexPath:indexPath];
        [segue.destinationViewController setExistingBreadRackDataName:[breadRackClass valueForKey:@"breadRackDataName"]];
        [segue.destinationViewController setExistingBreadRackDataDetails:[breadRackClass valueForKey:@"breadRackDataDetails"]];
    }

    // code for other segues here...
}

最終的に ebrtv 変数を削除し、コードを少しクリーンアップしました。しかし、breadRackClass の indexPath を宣言するときに、 indexPathForSelectedRowの代わりにindexPathForCell:senderを使用していました。

4

1 に答える 1

0

indexPathForSelectedRow が問題になる可能性があると思います。

次のように、 didSelectRowAtIndexPath から prepareForSegue に indexPath を渡すだけです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"editBreadRackSegue" sender:indexPath];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"editBreadRackSegue"])
    {
        NSIndexPath *clickedIndexPath = (NSIndexPath*)sender;
        if( [clickedIndexPath isKindOfClass:[NSIndexPath class]] ){

            BreadRackClass *breadRackClass = [[self fetchedResultsController]objectAtIndexPath:clickedIndexPath];

            EditBreadRackTableViewController *ebrtvc = (EditBreadRackTableViewController *)[segue destinationViewController];
            ebrtvc.existingBreadRackDataName = breadRackClass.breadRackDataName;
            ebrtvc.existingBreadRackDataDetails = [breadRackClass valueForKey:@"breadRackDataDetails"];
        }
    }
}

それがあなたのために働くかどうか私に知らせてください。

于 2012-12-10T11:12:19.623 に答える