1

リストから船を選択できるtableViewがあり、それをタップすると、情報が別の画面にポップアップ表示されます。私が現在これを行っている方法は次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{

cargoShips* ship=[boatsForOwner objectAtIndex:indexPath.row];
UITableViewCell *cell = [self.boatsTableView cellForRowAtIndexPath:indexPath];

[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell];




NSString *nameString = ship.name;
NSString *sizeString = ship.size;


NSUserDefaults *shipName = [NSUserDefaults standardUserDefaults];
[shipName setObject:nameString forKey:@"globalName"];
[shipName synchronize];
NSUserDefaults *shipSize = [NSUserDefaults standardUserDefaults];
[shipSize setObject:sizeString forKey:@"globalSize"];
[shipSize synchronize];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

そしてそれを(別のファイルで)テキストにロードし直します

 NSString *getName = [[NSUserDefaults standardUserDefaults]
                     objectForKey:@"globalName"];
NSString *getSize = [[NSUserDefaults standardUserDefaults]
                     objectForKey:@"globalSize"];

shipNameText.text = getName;
shipSizeText.text = getSize;

これは、infoView にアクセスするために選択したセルではなく、以前に選択したオブジェクトを返すという事実を除いて、うまく機能します。したがって、リストの最初のオブジェクトを選択すると、null が返され、次に選択したアイテムは、最初のオブジェクトに対して得られるはずだった結果を取得します。

私は何を間違えましたか、どうすれば修正できますか?

4

2 に答える 2

2

NSUserDefaultsオブジェクトを転送するためではなく、設定を保存するためのツールです。私があなただったら、私はこのようにしました:

#pragma mark - Segue
- (void)prepareForSegue:(UIStoryboardSegue *)segue
                 sender:(id)sender {
    if ([segue.identifier isEqualToString:@"boatInfoSegue"]) {

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        CargoShip *ship = boatsForOwner[indexPath.row];

        BoatViewController *vc = (BoatViewController *)segue.destinationViewController;
        vc.ship = ship;      
    }
}

クラス名は大文字にする必要があります。それが私が書いた理由ですCargoShip

于 2013-01-14T22:49:32.107 に答える
0

あなたのコードで私が見ることができるものから。あなたの問題は、最初にシークを実行してから、NSUserDefaultsこの行[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell];をメソッドの最後に移動する値を更新することです。これで機能するはずですが、コードをリファクタリングする必要があります。

于 2013-01-14T22:46:16.763 に答える