【问题标题】:How to save data to NSMutableDictionary and load data from NSMutableDictionary如何将数据保存到 NSMutableDictionary 并从 NSMutableDictionary 加载数据
【发布时间】:2016-05-03 12:07:57
【问题描述】:

我正在尝试创建购物车。我想将来自NSDictionary 的所有数据NSMutableDictionary 与具有DataItem 变量的条形码编号为key。我用那个代码块创建了NSMutableDictionary

- (void)viewDidLoad {

    [super viewDidLoad];

    DataItem = [[[_response objectForKey:@"Data"] objectForKey:@"Items"] objectForKey:@"Item"];

    NSMutableDictionary *CartItems = [[NSMutableDictionary alloc]init];

    for(NSDictionary *transaction in DataItem)

    {
       [CartItems setValue:transaction  forKey:[transaction objectForKey:@"BarcodeNumber"]];
    }
}

当我推送另一个 viewController 以选择另一个放入购物车的项目时。再次推送viewController,它会从 CartItems 变量中删除之前的项目。

我知道我已将该代码块 NSMutableDictionary *CartItems = [[NSMutableDictionary alloc]init]; 放入 viewDidLoad 中。这就是为什么,它会生成新的 CartItems 变量。如果我想把它放在 .h 文件中,它会返回 nil。我没有找到任何解决方案。

有没有办法将数据加载到NSMutableDictionary 以供重复使用?还是有另一种方法来创建相同的逻辑?谢谢。

【问题讨论】:

  • DataItem 为零吗?也请遵循命名约定,类名以大写字母开头,变量以小写字母开头。
  • 您可以使用单例,作为两个答案的状态,或者您可以将字典的引用传递给每个视图控制器。这个问题有很多答案。

标签: ios objective-c nsmutabledictionary


【解决方案1】:

使用单例类来存储您的数据,例如 this 教程

【讨论】:

    【解决方案2】:

    为数据创建一个单例类,该类在第一次初始化时返回相同的对象,并将其用于存储数据。

    + (id)getBE {
        static MyBEClass *objMyBEClass = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            objMyBEClass = [[self alloc] init];
        });
        return objMyBEClass;
    }
    

    使 CarItems 字典成为 BE 类的属性,以便您可以从视图控制器中获取它。

    @property(strong)NSMutableDictionary *CartItems;
    

    在 BE 类的 init 方法中初始化你的数组/字典。

    CartItems = [[NSMutableDictionary alloc]init];
    

    【讨论】:

    • 请遵循命名约定!
    • 实际上我使用了相同的名称来询问用户,这样他就不会感到困惑。
    【解决方案3】:

    您可以使用NSUserDefaults 进行管理。这是viewDidLoad-

     - (void)viewDidLoad {
    
            DataItem = [[[_response objectForKey:@"Data"] objectForKey:@"Items"] objectForKey:@"Item"];
    
            NSUserDefaults *prefrence=[[NSUserDefaults alloc]init];
    
            if ([[NSUserDefaults standardUserDefaults]objectForKey:@"cartItems"]!=nil) {
    
                NSMutableDictionary *CartItems=[[NSUserDefaults standardUserDefaults]objectForKey:@"cartItems"];
    
                for(NSDictionary *transaction in DataItem)
                {
    
                    [CartItems setValue:transaction  forKey:[transaction objectForKey:@"BarcodeNumber"]];
    
                }
    
                [prefrence setObject:CartItems forKey:@"cartItems"];
    
            }else{
    
                NSMutableDictionary *CartItems = [[NSMutableDictionary alloc]init];
    
                for(NSDictionary *transaction in DataItem)
                {
    
                    [CartItems setValue:transaction  forKey:[transaction objectForKey:@"BarcodeNumber"]];
    
                }
                    [prefrence setObject:CartItems forKey:@"cartItems"];
            }
    
        }
    

    当您想清除购物车时,也可以使用 [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"cartItems"] 清除 NSUserDefaults

    【讨论】:

      【解决方案4】:

      我不建议将 Singleton 用于这样的事情,除非您构建一个包含许多控制器的大型应用程序,并且您在任何地方都需要您的图表。

      如果不是这种情况,我建议您将 char 作为参数从一个控制器传递给另一个控制器,然后像 guide 中那样使用委托将其传回。

      如果您有一个使用单个导航控制器构建的应用程序,请记住它没有被释放,因此您可以在那里保存数据。只需使变量的 getter 和 setter 可见(.h 文件)或变量本身,但请记住,这不是一个很好的做法,因为它看起来会被许多控制器修改,这也是您应该避免使用的另一个原因单身人士。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多