NSUserDefaults返回先前的结果

时间:2013-01-14 22:36:58

标签: ios objective-c xcode nsuserdefaults

我有一个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,我选择的下一个项目将获得我应该为第一个对象生成的结果,依此类推。

我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分: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

的原因

答案 1 :(得分:0)

从我在代码中看到的内容。您的问题是您首先执行seque,然后更新NSUserDefaults中的值,将此行[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell];移动到方法的末尾。 这应该可以使它工作,但你需要重构你的代码。