Objective c 如何使用NSUserDefaults存储行属性
我有一个基于选项卡栏的应用程序,选项卡上有一个Objective c 如何使用NSUserDefaults存储行属性,objective-c,nsuserdefaults,Objective C,Nsuserdefaults,我有一个基于选项卡栏的应用程序,选项卡上有一个TableViewController 当我更新我的应用程序时,我会在我的表中添加一个新行 我要做的是,在插入新控件后,立即存储我的TableViewController的一行的高亮颜色,至少保存3个会话 我知道我必须使用NSUserDefaults,但是,在哪里? 我的意思是:我应该将它用于我的rowViewController(这是一个UIViewController)还是用于我的TableViewController(我有所有行的地方) 如何将
TableViewController
当我更新我的应用程序时,我会在我的表中添加一个新行
我要做的是,在插入新控件后,立即存储我的TableViewController的一行的高亮颜色,至少保存3个会话
我知道我必须使用NSUserDefaults
,但是,在哪里?
我的意思是:我应该将它用于我的rowViewController
(这是一个UIViewController
)还是用于我的TableViewController
(我有所有行的地方)
如何将单元格属性导入到UIViewController
(如果在其中我必须使用NSUserDefaults
)中
我有点像:
- (void) applicationDidFinishLaunching:(NSNotification*) notice {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:cell];
if ([(NSInteger*)[[NSUserDefaults standardUserDefaults] integerForKey:cell] intValue] < 3) {
// render highlighted...
} else {
// render normal
} }
我应该添加一些东西来实现单元格,然后设置其属性(颜色)吗
提前感谢。您可以像在问题中那样做,但代码中有一个大问题。使用NSInteger就像它是一个对象一样,而它是一个原子类型
不要混淆NSInteger
和NSNumber
:
NSNumber
是一个旨在将数字封装在Objective-C对象中的类,这样您就可以在请求NSObjects
的地方使用它(比如当您想将它们存储在nsdictionary
中时)
NSInteger
是整数类型的别名(typedef)。使用方法与使用int
相同
因此,在您的代码中,NSUserDefaults
的setInteger:forKey:
和integerworkey:
使用NSInteger值(即原子值,而不是对象)。无需使用*
和intValue
即可检索实际值,您已经拥有了它!(您编写的代码肯定会崩溃,将整数值解释为指向内存地址的指针!)
此外,您不能将单元格用作NSUserDefaults
的键NSUserDefaults
仅接受键的字符串,而且UITableViewCells
被重复使用(每次滚动时循环使用)而不是持久化。您应该构建一个使用单元格的nsindepath
的字符串,并将其用于NSUserDefaults
键;然后将单元格/行的背景色存储在UITableView
中的给定位置(无论如何,在MVC设计模式中,这样可以更好地分离模型和视图)
我不清楚为什么需要为此使用NSUserDefaults。它总是一样的颜色吗?你需要在应用程序会话之间存储颜色吗?我需要使用NSUserDefaults,以便在添加具有背景颜色(例如黄色)的新行时,该行在3个会话中保持黄色。谢谢,我将试着弄明白,您可以在实现UITableViewDelegate
协议(通常是UITableViewController
)的类中直接使用NSUserDefaults
)。无需将单元格“导入”到UIViewController中(实际上这并不意味着什么)。一定要阅读Apple文档中的“Table View Programming Guide”(表格视图编程指南),它将帮助您深入理解UITableView
的机制,包括布局/显示周期和重用机制(单元被重用/回收的事实)。还可以阅读有关MVC设计模式的文档,它将帮助您理解如何将信息从“显示”以及与“模型”和元数据相关的信息中分离出来。PS:我编辑了我的答案,添加了一些示例代码,不推荐使用代码中的-description方法。与其说它是一种序列化或唯一标识符方法,不如说它更像是一种调试辅助工具。Loool我完全同意你的看法,这让我感到遗憾,因为我是第一个告诉别人(即使在这里)不要将说明用于调试以外的任何事情的人!!;)将立即编辑此,谢谢
@interface rowViewController : UIViewController
// Build a string from the IndexPath that will be used as a unique key for your userdefaults, to store info on the corresponding row in your tableview
NSString* key = [NSString stringWithFormat:@"bkg_%i:%i",indexPath.section,indexPath.row];
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:key];
if ([[NSUserDefaults standardUserDefaults] integerForKey:key] < 3)
{
// render highlighted...
} else {
// render normal
}
// These lines...
NSNumber* nbrObj = [[NSUserDefaults standardUserDefaults] objectForKey:@"mykey"];
NSInteger nbr = [nbrObj integerValue];
// are equivalent to the following, shorter line:
NSInteger nbr = [[NSUserDefaults standardUserDefaults] integerForKey:@"mykey"];