我正在制作一个待办事项列表应用程序,我有一个包含自定义单元格的tableview。自定义单元格只有一个文本视图,用户可以在其中输入“任务”。此外,用户可以为更多任务添加行,如果他/她已在列表上完成该任务,则删除行。但是,如果应用程序关闭,则表格视图显然会被重置,并且用户会丢失他/她之前在单元格中写入的所有内容。这样,该应用程序几乎没用。
我的问题是:即使在应用关闭后,我怎么能保留每个单元格的TextView中的文本?
编辑我设法通过遍历每个单元格NSUserDefaults
并获取textview
属性来保存text
中的数据。但问题是,如果我在启动时将数据加载到array
并从textviews
中的array
填充单元格cellForRowAtIndexPath
,则textviews
中的文字是每当用户滚动tableview时,重置(对于在启动时加载的数据),再次调用cellForRowAtIndexPath
。
所以现在我的问题是:我怎么能克服这个问题?我只需要在启动时填充tableView,而不是每次都调用cellForRowAtIndexPath
。
我的代码:
我写了一个单独的方法来保存单元格的内容(注释只是一个空的可变数组)。
-(void)saveNotes{
NSArray *cells = [self.tableView visibleCells];
[notes removeAllObjects];
for (TableViewCell *cell in cells)
{
[notes addObject:cell.textView.text];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:notes forKey:@"notes"];
[userDefaults synchronize];
NSLog(@"notes saved!");
}
}
比在viewDidLoad
中我将tableview的dataSource数组设置为存储在NSUserDefaults中的数组:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if([userDefaults objectForKey:@"notes"]){
dataSource = [[userDefaults objectForKey:@"notes"] mutableCopy];
NSLog(@"Notes loaded");
}
else{
dataSource = [[NSMutableArray alloc]initWithObjects:@"", nil];
NSLog(@"Nothing found! :(");
}
之后,在cellForRowAtIndexPath
中,我设置了所有单元格的文字视图,以显示viewDidLoad
中加载的文字:
cell.textView.text = [dataSource objectAtIndex[indexPath row]];
答案 0 :(得分:0)
您使用NSFileManager()
,Core Data
有很多选择,它们都会在内部(在实际设备上)或实际数据库( Parse.com )保存您的数据这将保存在服务器上。
回答问题的第二部分
您可以创建queryFunction() or Retrieve function
进入ViewDidLoad()
,这样一旦应用变为有效状态,它将获取所有数据,然后将其显示在UITableViewCell
从NSMutableArray中检索* resultArray = [NSMutableArray arrayWithArray:[userDefaults objectForKey:@" notes"]]; 然后将 resultArray 分配到用于将数据填充到viewDidLoad
的数组中
答案 1 :(得分:0)
在应用关闭之前,在您的应用委托中,在applicationDidEnterBackground
中可以保存所有用户数据,数据可以保存在.plist文件或NSUserDefaults
中更多信息here
所以基本上你在用户编辑列表时,可以将所有信息保存在临时数据结构中,例如Array,应用程序何时关闭,保存数据。当用户再次打开应用时,在applicationDidBecomeActive
重新加载您之前保存过的数据。
答案 2 :(得分:0)
I happened to solve my own question by a really simple if
statement. I made an ivar in the header file of my ViewController named didHaveUserInteraction
. I set this in my viewDidLoad
to FALSE
. And in the textview delegate method: textViewDidChange
I set it to TRUE
. Than, in cellForRowAtIndexPath
I wrote:
if(!didHaveUserInteraction){
cell.textView.text = [dataSource objectAtIndex:[indexPath row]];
}
By doing this, the cells only get populated with the saved data on startup or if the user has not modified anything in any of the TextViews
yet.