【问题标题】:Array or dictionary for saving a few instances?用于保存一些实例的数组或字典?
【发布时间】:2012-12-03 20:58:24
【问题描述】:
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.carMakes = [[NSArray alloc]
                     initWithObjects:@"Chevy",
                     @"BMW",
                     @"Toyota",
                     @"Volvo",
                     @"Smart", nil];

    self.carModels = [[NSArray alloc]
                      initWithObjects:@"Volt",
                      @"Mini",
                      @"Venza",
                      @"S60",
                      @"Fortwo", nil];

    self.carImages = [[NSArray alloc]
          initWithObjects:@"chevy_volt.jpg",
                      @"mini_clubman.jpg",
                      @"toyota_venza.jpg",
                      @"volvo_s60.jpg",
                      @"smart_fortwo.jpg", nil];
}

上面的代码填充在表格视图中。我想让用户选择一些汽车,这样汽车的名称、型号和图片将保存在另一个列表中。我不知道应该在哪里保存用户选择的数据以及如何保存。 我希望稍后能够在 TableView 上显示用户选择的汽车列表。

  • 我知道,如果我想保留新创建的列表,我需要将所选信息转换为 plist 文件或类似文件,但我不确定在此之前将数据保存在哪里。

【问题讨论】:

    标签: ios xcode nsarray nsdictionary


    【解决方案1】:

    您可以为此使用数组或字典。但更好的方法是创建一个模型类数组来保存这些数据。这最适合MVC architecture。例如,您可以创建一个模型类为Car,其中声明了属性NSString *makeNSString *modelUIImage *image。如果要填充表格视图,则需要创建这些汽车模型对象的数组,并在委托方法中使用它来填充单元格。如果要持久化数据,可以将其转换为字典形式,然后将其存储为 plist。更多详情,请查看tutorial from ray wenderlich

    一个典型的模型对象看起来像,

    @interface Car : NSObject {}
    @property (nonatomic, retain) NSString *make; 
    @property (nonatomic, retain) NSString *model;
    @property (nonatomic, retain) UIImage *image;
    @end
    

    创建模型对象数组,

    Car *carObject = [[Car alloc] init];
    carObject.make = @"Chevy";
    //set other properties and create more objects
    NSMutableArray *carList = [[NSMutableArray alloc] init];
    [carList addObject:carObject]; //you can do this in a loop
    

    在显示时您可以使用[carList objectAtIndex:indexPath.row].make 等。

    Car *myCar = [carList objectAtIndex:indexPath.row];
    cell.textLabel.text = myCar.model;
    

    当用户选择一些汽车时,将这些模型对象保存到一个单独的数组中并保存为 plist。

    【讨论】:

    • +1 鼓励面向对象的设计。从来不理解单独使用集合类来表示整个模型层的常见做法。
    • @NSBum,谢谢.. :) 这是更好的方法,而且总是易于维护。这种方法在我的项目中总是帮助我很多。 :)
    • "Model class as Car which has properties" 和 C 语言中的 struct 一样吗?
    • @MikaStern,不完全相同。但是,是的,这是一种类似的方法,因为它将所有这些属性包装在一个实体中。模型类也可以有方便的方法。例如,如果你想根据一些约束来操作一些数据,你可以使用模型类中的一些方法来做同样的事情。
    • @MikaStern,没关系。您可以在数组中包含任何对象。当您从数组中检索数据时,只需检查 if([object isKindOfClass:[Car class]]) 等。以验证它是汽车、猫还是人。 *更正的方法名称
    【解决方案2】:

    假设,您将以下汽车添加到数组中,如下所示。

    [arraySelectedCars addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"BMW", @"Makes", @"Mini", @"Model", @"chevy_volt.jpg", @"Image", nil]];
    [arraySelectedCars addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Toyota", @"Makes", @"Mini", @"Venza", @"toyota_venza.jpg", @"Image", nil]];
    

    您可以将它们保存到 NSUserDefaults 中,它驻留在用户的设备中,直到用户删除应用程序或直到您将其删除。

    [[NSUserDefaults standardUserDefaults] setValue:arraySelectedCars forKey:@"SelectedCars"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    稍后您可以访问数组并重新加载tableview,如下所示。

    NSMutableArray *arraySelectedCars = [[NSUserDefaults standardUserDefaults] valueForKey:@"SelectedCars"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多