在TableView

时间:2015-07-30 14:54:47

标签: ios objective-c uitableview

我正在制作一个待办事项列表应用程序,我有一个包含自定义单元格的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]];

3 个答案:

答案 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.