在 UItableview 中保存和加载数据

Posted

技术标签:

【中文标题】在 UItableview 中保存和加载数据【英文标题】:save and load data in UItableview 【发布时间】:2017-03-11 20:01:58 【问题描述】:

我在 UITableView 中保存和加载数据时遇到了一些问题。按button2后,我找不到我保存的数据(可能我没有保存)。

我的.h 文件:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>

    NSMutableArray * arrayIdea;
    NSMutableArray * arrayEdit;

    IBOutlet UITableViewCell * cell;


@property(nonatomic,strong)IBOutlet UITextField * txtField;
@property(nonatomic,strong)IBOutlet UITableView * tabel1;
-(IBAction)button2:(id)sender;
-(IBAction)button1:(id)sender;
@end

我的 .m 文件:

#import "ViewController.h"

@interface ViewController ()<UITextFieldDelegate>

@end

@implementation ViewController
-(BOOL)textFieldShouldReturn:(UITextField *)textField
    [textField resignFirstResponder];
    return YES;

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

    arrayIdea = [[NSMutableArray alloc] init];



-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if (arrayIdea.count > 0) 
        return arrayIdea.count;

    
    return 0;



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    cell = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
        if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell1"];

    
    cell.textLabel.text =[NSString stringWithFormat:@"%@", arrayIdea[indexPath.row]];

    return cell;



-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(nonnull NSIndexPath *)indexPath

    if(editingStyle == UITableViewCellEditingStyleDelete) 
        [arrayIdea removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation: UITableViewRowAnimationFade];
    

-(IBAction)button1:(id)sender;

    [arrayIdea addObject:self.txtField.text];
    [self.tabel1 reloadData];
     self.txtField.text = @"";
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:arrayIdea forKey:@"savedstring"];
    [defaults synchronize];



-(IBAction)button2:(id)sender;
    NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
    cell.textLabel.text =[defaults objectForKey:@"savedstring"];


@end

【问题讨论】:

我试过你的代码,似乎代码在cell.textLabel.text =[defaults objectForKey:@"savedstring"];这一行崩溃了,因为你正在保存一个数组并试图将数组分配到一个文本字段中。而是尝试检索回数组并分配到文本字段中。希望这些有所帮助。 【参考方案1】:

您需要对数组进行编码/解码才能在 NSUserDefaults 中保存/检索它。

保存

NSData *dataSave = [NSKeyedArchiver archivedDataWithRootObject: arrayIdea];
[[NSUserDefaults standardUserDefaults] setObject:dataSave forKey:@"savedstring"];
[[NSUserDefaults standardUserDefaults] synchronize];

阅读

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedstring"];
NSArray *savedArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

【讨论】:

感谢您回答我的问题!我试过了,但它说“使用未声明的标识符'currentDefault”,所以我想知道在哪里可以定义它。 现在检查,currentDefault 只不过是 NSUserDefault 对象。我以为你会自己想办法。 好的!谢谢! @TonyChen 如果您从我的回答中获得帮助,请投票并接受作为回答。【参考方案2】:

您可以像这样保存和检索..

保存

[[NSUserDefaults standardUserDefaults]setObject:arrayIdea forKey:@"savedstring"];

并检索

[[NSUserDefaults standardUserDefaults] objectForKey:@"savedstring"];

【讨论】:

【参考方案3】:
In cellForRowAtIndexpath, If you write code like below.

cell.textlabel.text = [[defaults objectForKey:@"saved string"] objectAtIndex:indexPath.row]; 

instead of passing array.
In numberOfRowsInSection you can pass

[[defalts objectForKey:@"saved string"] count];

You already called table reload method, so there is no need of button 2.
Please try.

【讨论】:

以上是关于在 UItableview 中保存和加载数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 与 Swift 3.0 UITableView

UITableView 在 TableView 中间加载单元格。为啥?

从 XIB 加载的 UITableView Sectionheader 有时显示不正确

保存和加载 UITableView 数组 - iOS Swift Parse

关闭模式视图时如何在 UITableView 中显示数据

UITableView 强制 sectionIndex 更新而不调用 reloadData