3

MyNSMutableArray在我的 .h 文件中声明如下

@property (strong, nonatomic) NSMutableArray * numbers;

如何使用 NSMutableArray 保存输入的数据以保存到NSUserDefaults

感谢所有帮助

提前致谢

.h 文件中的代码

@property (retain, nonatomic) IBOutlet UITableView *myTableView;
@property (strong, nonatomic) NSMutableArray * numbers;

.m 中的代码

@synthesize myTableView, numbers;

-(void) viewDidLoad
{

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:numbers forKey:@"numberArray"];

    NSMutableArray *resultArray = [NSMutableArray arrayWithArray:[defaults objectForKey:@"numberArray"]];



    [super viewDidLoad];
    // instantiate our NSMutableArray
    numbers = [[NSMutableArray alloc]initWithObjects:@"",@"", nil];






    //Add a edit button
    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    //Add the Add button
    UIBarButtonItem * addButton = [[UIBarButtonItem alloc]
                                   initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target: self action: @selector(insertNewObject)];

    self.navigationItem.rightBarButtonItem = addButton;

}
-(void) didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

}

-(void)setEditing:(BOOL)editing animated:(BOOL)animated
{

    [super setEditing:editing animated:animated];
    [myTableView setEditing:editing animated:animated];




}


-(void) insertNewObject
{

    //Display a UIAlertView
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Enter HomeWork" message: @"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];


    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];

}



#pragma mark - UITableView Datasource

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return numbers.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier = @"cell";

    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier:cellIdentifier];

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

    cell.textLabel.text = [numbers objectAtIndex:indexPath.row];

    return cell;
}

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;

}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        //remove our NSMutableArray
        [numbers removeObjectAtIndex:indexPath.row];
        //remove from our tableView
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }


}


#pragma mark - UITableView Delegate methods


#pragma mark - UIAlertViewDelegate Methods


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //Only perform the following actions if the user hits the ok button
    if (buttonIndex == 1)
    {
        NSString * tmpTextField = [alertView textFieldAtIndex:0].text;



        if(!numbers)

            numbers = [[NSMutableArray alloc]init];




    [numbers insertObject:tmpTextField atIndex:0];



        NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

        [self.myTableView insertRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationAutomatic];



        }



}


@end

好的,在我的应用程序中,有一个 UITableView

当用户点击“加号”按钮时,会显示一个带有 UITextField 的 UIAlertView,当用户键入一个单词时,文本会转到 UITableView,但是当用户退出应用程序时,文本会从表格中消失。我想保存用户输入的文本,所以当用户退出应用程序并返回时,我希望保存文本。我想用 NSUserDefaults 保存它。

4

1 回答 1

16
//For saving 
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
[defaults setObject:self.numbers forKey:@"numberArray"];
[defaults synchronize];

//For retrieving  
NSMutableArray *resultArray = [NSMutableArray arrayWithArray:[defaults objectForKey:@"numberArray"]];

根据您在退出后运行应用程序时的场景......您应该viewDidLoad检查 keyExists 是否在NSUserDefaults然后检索数组中的结果并显示在UITableView. 对于保存数据,最好在用户最小化应用程序时听取通知,只需将数据保存到默认值即可。

这是您案例的工作代码

- (void)viewDidLoad{

   [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    //Add a edit button
   self.navigationController.navigationItem.leftBarButtonItem = self.editButtonItem;

  // check here if key exists in the defaults or not, if yes the retrieve results in array
  if([[NSUserDefaults standardUserDefaults] objectForKey:@"numberArray"] != nil) {
   self.numbers = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"numberArray"]];

}

   //Register for the notification when user go to background or minimize the app, just save the array objects in the defaults

[[NSNotificationCenter defaultCenter]   addObserver:self
                                                   selector:@selector(appWillGoToBackground:)
                                                       name:UIApplicationWillResignActiveNotification
                                                     object:[UIApplication sharedApplication]];



    //Add the Add button
UIBarButtonItem * addButton = [[UIBarButtonItem alloc]
                               initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target: self action: @selector(insertNewObject)];

self.navigationController.navigationItem.rightBarButtonItem = addButton;
}

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.myTableView setEditing:editing animated:animated];

}
-(void)appWillGoToBackground:(NSNotification *)note {
    NSLog(@"terminate");

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:self.numbers forKey:@"numberArray"];
    [defaults synchronize];

}

-(void)insertNewObject{
        //Display a UIAlertView
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Enter HomeWork" message: @"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];


    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];


}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
        //Only perform the following actions if the user hits the ok button
    if (buttonIndex == 1)
        {
        NSString * tmpTextField = [alertView textFieldAtIndex:0].text;



        if(!self. numbers){

            self.numbers = [[NSMutableArray alloc]init];
        }



        [self.numbers insertObject:tmpTextField atIndex:0];



        NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

        [self.myTableView insertRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationAutomatic];




}



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.numbers.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier = @"cell";

    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier:cellIdentifier];

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

    cell.textLabel.text = [self.numbers objectAtIndex:indexPath.row];

    return cell;
}

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;

}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
        {
            //remove our NSMutableArray
        [self.numbers removeObjectAtIndex:indexPath.row];
            //remove from our tableView
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }


}
于 2013-03-13T21:02:24.630 回答