Xcode使用NSUserDefaults在Master View Controller上保存数据

时间:2013-03-30 17:41:08

标签: objective-c xcode uitableview nsuserdefaults

我正在为ipad创建一个主要的详细信息应用程序,该应用程序应该保存用户正在键入的内容(使用弹出窗口视图上的按钮,该按钮将一些文本放在该弹出视图中的标签上)在主视图控制器的表视图中。

所以基本上我有一个popover视图,其中包含一个名为inputDisplayLabel的UILabel,以及用户按下该按钮文本进入该UILabel的任何按钮。按下输入按钮后,它会将该文本添加到tableviews cel。现在我想保存该表视图中的任何内容,当我退出应用程序并重新开始时,文本仍保留在tableview cel中。

我尝试添加一个名为SaveValue的按钮并将其编码为:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.inputDisplayLabel.text forKey:@"savedValue"];
[defaults synchronize];

现在我尝试使用以下代码添加另一个名为loadValue的按钮来加载它:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.tableView = [defaults objectForKey:@"SavedValue"];

但它不起作用。我在哪里实际放置加载代码,以便在应用程序启动时它就在那里,这样我就不必使用另一个按钮了。

我希望有人可以帮助我。感谢。

编辑:

-(void)setTheTextOfLabelWith:(NSString *)str
{
    text = str;
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    //[_objects insertObject:[NSDate date] atIndex:0];
    [_objects insertObject:[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)] atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];


    [self.inputViewPopover dismissPopoverAnimated:YES];
}

1 个答案:

答案 0 :(得分:1)

目标C区分大小写“savedValue”与“SavedValue”不同。当然,tableview不能直接使用字符串。您必须将字符串/文本分配给例如tableviewcell中的标签。 将代码放在viewDidLoad中,因此在那里设置标签的文本,如果它在tableViewCell中,则必须在“cellForRowAtIndexPath”方法中设置它。也许应该看一下viewcontroller生命周期以及UITableViewDelegate和DataSource协议。

//编辑: 我不这么认为..基本上你有一个动态的tableview,并希望多个单元格显示你保存在用户默认值中的一些文本? 要拥有动态tableview,通常在ViewController中实现UITableViewDataSource和UITableViewDelegate协议,它们显示/管理tableview。在那里,您使用UITableViewDataSource协议中的“cellForRowAtIndexPath”方法创建单元格。由于您希望保存多个条目,因此可以使用数组将所有内容保存在用户默认值中,并在cellForRow中进行迭代..以获取单元格中的所有文本。

E.g。

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return self.yourArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(theCell == nil)
    {
        theCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                         reuseIdentifier:CellIdentifier];
    }

    theCell.textLabel.text = [self.yourArray objectAtIndex:indexPath.row];

    return theCell;
}

如果你想保存很多数据,可以考虑使用CoreData或某种XML来保存数据,因为用户默认值通常用于保存某种设置(但仅限于某些“文本”)应该完全解决。)

// edit2: 签出项目后,我注意到你试图在NSUserDefaults中保存标签,这是不可能的。您必须保存这些标签的文本,然后从NSUserDefaults加载后使用这些文本恢复标签。 最简单的解决方案(或者至少是没有很多修改的解决方案)是修改你的负载并保存方法,如下所示:

- (IBAction)load
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSArray *texts = [defaults objectForKey:@"items"];
    for(NSString *currentText in texts)
    {
        [self setTheTextOfLabelWith:currentText];
    }
}

- (void)savingData
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSMutableArray *textToSave = [[NSMutableArray alloc] init];
    for(UILabel *currentLabel in _objects)
    {
        [textToSave addObject:currentLabel.text];
    }

    [defaults setObject:textToSave forKey:@"items"]; 
    [defaults synchronize];
}

您还可以找到该解决方案作为对您邮件的回复。