我正在为ipad创建一个主要的详细信息应用程序,该应用程序应该保存用户正在键入的内容(使用弹出窗口视图上的按钮,该按钮将一些文本放在该弹出视图中的标签上)在主视图控制器的表视图中。
所以基本上我有一个popover视图,其中包含一个名为inputDisplayLabel的UILabel,以及用户按下该按钮文本进入该UILabel的任何按钮。按下输入按钮后,它会将该文本添加到tableviews cel。现在我想保存该表视图中的任何内容,当我退出应用程序并重新开始时,文本仍保留在tableview cel中。
我尝试添加一个名为SaveValue的按钮并将其编码为:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.inputDisplayLabel.text forKey:@"savedValue"];
[defaults synchronize];
现在我尝试使用以下代码添加另一个名为loadValue的按钮来加载它:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.tableView = [defaults objectForKey:@"SavedValue"];
但它不起作用。我在哪里实际放置加载代码,以便在应用程序启动时它就在那里,这样我就不必使用另一个按钮了。
我希望有人可以帮助我。感谢。
编辑:
-(void)setTheTextOfLabelWith:(NSString *)str
{
text = str;
if (!_objects) {
_objects = [[NSMutableArray alloc] init];
}
//[_objects insertObject:[NSDate date] atIndex:0];
[_objects insertObject:[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)] atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.inputViewPopover dismissPopoverAnimated:YES];
}
答案 0 :(得分:1)
目标C区分大小写“savedValue”与“SavedValue”不同。当然,tableview不能直接使用字符串。您必须将字符串/文本分配给例如tableviewcell中的标签。 将代码放在viewDidLoad中,因此在那里设置标签的文本,如果它在tableViewCell中,则必须在“cellForRowAtIndexPath”方法中设置它。也许应该看一下viewcontroller生命周期以及UITableViewDelegate和DataSource协议。
//编辑: 我不这么认为..基本上你有一个动态的tableview,并希望多个单元格显示你保存在用户默认值中的一些文本? 要拥有动态tableview,通常在ViewController中实现UITableViewDataSource和UITableViewDelegate协议,它们显示/管理tableview。在那里,您使用UITableViewDataSource协议中的“cellForRowAtIndexPath”方法创建单元格。由于您希望保存多个条目,因此可以使用数组将所有内容保存在用户默认值中,并在cellForRow中进行迭代..以获取单元格中的所有文本。
E.g。
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return self.yourArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(theCell == nil)
{
theCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
theCell.textLabel.text = [self.yourArray objectAtIndex:indexPath.row];
return theCell;
}
如果你想保存很多数据,可以考虑使用CoreData或某种XML来保存数据,因为用户默认值通常用于保存某种设置(但仅限于某些“文本”)应该完全解决。)
// edit2: 签出项目后,我注意到你试图在NSUserDefaults中保存标签,这是不可能的。您必须保存这些标签的文本,然后从NSUserDefaults加载后使用这些文本恢复标签。 最简单的解决方案(或者至少是没有很多修改的解决方案)是修改你的负载并保存方法,如下所示:
- (IBAction)load
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *texts = [defaults objectForKey:@"items"];
for(NSString *currentText in texts)
{
[self setTheTextOfLabelWith:currentText];
}
}
- (void)savingData
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *textToSave = [[NSMutableArray alloc] init];
for(UILabel *currentLabel in _objects)
{
[textToSave addObject:currentLabel.text];
}
[defaults setObject:textToSave forKey:@"items"];
[defaults synchronize];
}
您还可以找到该解决方案作为对您邮件的回复。