NSUserDefaults不工作......还是我?

时间:2011-12-10 22:39:13

标签: iphone objective-c ios ios4 ios5

所以我试图在视图之间传递一个url。每当用户从tableview中进行选择时,我就会想到以下代码会踩到@“url”中的任何内容。实际发生的是第一次选择总是被返回并且永远不会被踩踏。嗯,也许是我?有任何想法吗?感谢。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0)
    {
        [self saveToUserDefaults:@"http://url1"];
        [self.navigationController pushViewController:self.webController animated:YES];
    }
    else if (indexPath.row == 1)
    {
        [self saveToUserDefaults:@"http://url2"];
        [self.navigationController pushViewController:self.webController animated:YES];
    }
}

-(void)saveToUserDefaults:(NSString*)myString
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

    if (standardUserDefaults) 
    {
        [standardUserDefaults setObject:myString forKey:@"url"];
        [standardUserDefaults synchronize];
    }
}

在接收端:

-(NSString*)retrieveFromUserDefaults
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    NSString *val = nil;

    if (standardUserDefaults) 
        val = [standardUserDefaults objectForKey:@"url"];

    return val;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSString *url = self.retrieveFromUserDefaults;
    [self handleURLRequest:url];
}

2 个答案:

答案 0 :(得分:6)

viewDidLoad仅在最初从xib文件加载视图时调用。如果弹出并重新推动视图控制器,则除非您收到内存不足警告,否则不会再次执行该方法。

将代码移至viewWillAppear,以确保每当您的视图出现时都会调用该代码。

答案 1 :(得分:1)

将NSString保存到NSUserDefaults的代码看起来是正确的,并且应该覆盖已为“url”键保存的任何值。也许在另一个视图中读取此值的方式有错误?你能从下一个视图控制器发布你的代码吗?

根据您的新代码,如果您要保留第二个视图控制器,则可能需要将代码放在viewWillAppear而不是viewDidLoad中。