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"];