如何使用NSUserDefaults保存来自ViewController的数据,并在应用程序重新运行时将其检索到TableViewController

我绝望了,一直在解决这个问题。所以我有一个类“WishListItem”,一个TableViewController和一个ViewController。 我在保存数据块和从TableViewController检索它有困难? 如何有效地做到这一点?

我要粘贴所有的代码,因为我不知道是否有重要的东西必须包括在我的问题。 所以我很抱歉,请耐心等待。 这里是。

ViewController.h:

#import <UIKit/UIKit.h> #import "WishlistItem.h" @interface JLSViewController : UIViewController @property (strong, nonatomic) IBOutlet UIBarButtonItem *addWishListButton; @property (strong, nonatomic) IBOutlet UITextField *wishTextField; @property (strong, nonatomic) IBOutlet UITextField *descTextField; @property (strong, nonatomic) IBOutlet UIDatePicker *targetDatePicker; @property WishlistItem *wishItem; @end 

ViewController.m

 #import "JLSViewController.h" #import "WishlistTableViewController.h" @interface JLSViewController () @property NSMutableArray *wishlistItem; @end @implementation JLSViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSDate *myDate = self.targetDatePicker.date; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"MMM d, YYYY"]; NSString *prettyVersion = [dateFormat stringFromDate:myDate]; if (sender != self.addWishListButton) return; if (self.wishTextField.text.length > 0) { self.wishItem = [[WishlistItem alloc] init]; self.wishItem.wishlistItem = self.wishTextField.text; self.wishItem.descWishItem = self.descTextField.text; self.wishItem.targetDate = prettyVersion; } NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:self.wishItem.wishlistItem forKey:@"itemWish"]; [defaults setObject:self.wishItem.descWishItem forKey:@"itemDesc"]; [defaults setObject:self.wishItem.targetDate forKey:@"itemDate"]; [defaults synchronize]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; [super touchesBegan:touches withEvent:event]; } @end 

TableViewController.h

 #import <UIKit/UIKit.h> #import "DetailViewController.h" @interface WishlistTableViewController : UITableViewController - (IBAction)unwindToWishlistTableViewController:(UIStoryboardSegue *)unwindSegue; @property NSMutableArray *wishlistItem; @end 

TableViewController.m

 #import "WishlistTableViewController.h" #import "WishlistItem.h" #import "JLSViewController.h" #import "DetailViewController.h" @interface WishlistTableViewController () @end @implementation WishlistTableViewController - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.wishlistItem = [[NSMutableArray alloc]init]; } - (IBAction)unwindToWishlistTableViewController:(UIStoryboardSegue *)unwindSegue { JLSViewController *source = [unwindSegue sourceViewController]; WishlistItem *item = source.wishItem; if (item != nil) { [self.wishlistItem addObject:item]; [self.tableView reloadData]; } } - (IBAction)delete:(id)sender { } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { //#warning Potentially incomplete method implementation. // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //#warning Incomplete method implementation. // Return the number of rows in the section. return [self.wishlistItem count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"wishlistCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; WishlistItem *wish = [self.wishlistItem objectAtIndex:indexPath.row]; // Configure the cell... //Set target date string NSString *targetDate = [NSString stringWithFormat:@"Target Date: %@", wish.targetDate]; //Set wishlist item string NSString *wishItemString = wish.wishlistItem; cell.textLabel.text = wishItemString; cell.detailTextLabel.text = targetDate; return cell; } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { WishlistItem *wish = [self.wishlistItem objectAtIndex:indexPath.row]; DetailViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"dvcID"]; dvc.wishItemStr = wish.wishlistItem; dvc.dateItemStr = wish.targetDate; dvc.descItemStr = wish.descWishItem; [self.navigationController pushViewController:dvc animated:YES]; } // Delete row/cell - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { // Remove the row from data model [self.wishlistItem removeObjectAtIndex:indexPath.row]; // Request table view to reload [tableView reloadData]; } @end 

从我的ViewController,我想保存每一个被添加的条目,并稍后检索到我的TableViewController。 谢谢,我真的很抱歉张贴我所有的代码,因为我已经很沮丧,一直在解决这个问题好几个小时。 先谢谢你。

我在我的prepareForSegue中使用了NSUserDefaults。 但我想我无法从我的TableViewController正确检索它。

我已经包含了我的“保存数据”只使用NSUserDefaults,因为我不知道我将如何实现“加载数据”到我的TableViewController。

我很抱歉我的代码。 现在只是一个初学者。

我唯一的目标是保存我的3个string(愿望项目,希望描述,目标date),而我只想在应用程序重新运行时检索这些数据。

@Rhenzzz:你必须replace这个

 cell.textLabel.text = wishItemString; cell.detailTextLabel.text = targetDate; 

通过

 cell.textLabel.text = itemWish ; cell.detailTextLabel.text = itemDate; 

在Jay的代码中。

 -(void)yourSaveMethod { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setValue:@"My saved Data" forKey:@"infoString"]; } -(void)yourLoadMethod { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; cell.tableview.text = [defaults objectForKey:@"infoString"]; }`` 

为了保存你的数组状态,使用这个即在视图控制器

 NSString *valueToSave = @"someValue"; [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"preferenceName"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

使用这个地方你想要检索variables即。 intableViewController

  NSString *savedValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"preferenceName"]; 

我也会为此推荐Core Data。

但是,如果你真的想要使用NSUserDefaults你应该把一个NSDictionaryNSArray放在一个键中。 你现在正在做的事情,你一次只能在你的UITableView中显示一个项目,因为你每次准备prepareForSegue都要覆盖相同的键。

把它放在一个单独的头文件中,并在必要时导入:

 #define WISH_ITEMS_KEY @"wishItems" 

执行这个代码一次(可能在AppDelegate像这样):

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults registerDefaults:@{WISH_ITEMS_KEY: @[]}]; [defaults synchronize]; return YES; } 

然后在你的prepareForSegue

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray *wishItems = [[defaults arrayForKey:WISH_ITEMS_KEY] mutableCopy]; [wishItems addObject:@{@"itemWish": self.wishItem.wishlistItem, @"itemDesc": self.wishItem.descWishItem, @"itemDate": self.wishItem.targetDate}]; [defaults setObject:wishItems forKey:WISH_ITEMS_KEY]; [defaults synchronize]; 

在你的TableViewControllerviewDidLoad

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; self.wishlistItem = [[defaults arrayForKey:WISH_ITEMS_KEY] mutableCopy]; 

然后在你的cellForRowAtIndexPath你可以检索每个项目并设置你的单元格:

 NSDictionary *itemDictionary = self.wishlistItem[indexPath.row]; NSString *itemWish = itemDictionary[@"itemWish"]; NSString *itemDesc = itemDictionary[@"itemDesc"]; NSString *itemDate = itemDictionary[@"itemDate"]; 

希望有所帮助。