如何使用NSUserDefaults存储行属性

时间:2011-09-29 12:10:14

标签: objective-c nsuserdefaults

我有一个基于标签栏的应用程序,标签上有TableViewController

当我更新我的应用时,我向我的Table添加了一个新行。

我想要做的是在插入一个新的TableViewController行后,立即存储一行的高亮颜色,至少3个会话。

我知道我必须使用NSUserDefaults,但是,在哪里? 我的意思是:我应该将它用于我的rowViewControllerUIViewController)还是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
    } }

我不能这样做因为它是一个UIViewController,对吧?然后在.h at

@interface rowViewController : UIViewController

我应该添加一些东西以实现单元格,然后设置其属性(颜色)?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以按照问题的方式执行此操作,但代码中存在严重问题。你使用NSInteger就好像它是一个对象,而它是一个原子类型。

请勿混淆NSIntegerNSNumber

  • NSNumber是一个旨在将数字封装在Objective-C对象中的类,以便您可以在请求NSObjects的地方使用它(就像您希望将它们存储在NSDictionaries中一样)
  • NSInteger是整数类型的别名(typedef)。使用它与使用int
  • 的方式相同

因此,在您的代码中,NSUserDefaults的{​​{1}}和setInteger:forKey:使用NSInteger值(即原子值,而不是对象)。无需使用integerForKey:*然后检索真正的价值,您已经拥有它! (你编写的代码肯定会崩溃,将整数值解释为指向内存地址的指针!)


此外,您无法将此单元格用作intValue的密钥NSUserDefaults 只接受键的字符串,而且NSUserDefaults会被重复使用(每次滚动时都会回收)并且不会持久。您应该构建一个使用单元格UITableViewCells的字符串,并将其用于NSIndexPath键;然后将单元格/行的背景颜色存储在NSUserDefaults中的给定位置(无论如何,在MVC设计模式中更好地分离模型和视图)。

UITableView

请注意,// 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 } 可以看作是对integerForKey:的调用(在您的情况下会返回objectForKey:,通常是NSObject,这是一个封装了整数值)然后调用NSNumber

integerValue