iOS:将 json 项循环到 SESpringboard
iOS: Looping json items to SESpringboard
所以!我有一个 NSDictionary,可以很好地从我的数据库中提取 json。我还有一个 mutable 数组,用于为我漂亮的 SESpringboard 视图创建项目。问题是,最初我只有几个项目,所以我是手动创建每个项目。但是现在我有成千上万的项目,我想在 php 中做一些类似 "while" 循环的事情,它会一直创建项目,直到它遍历整个 table.
这是我得到的代码:
Goods *g = [[Goods alloc] init];
g.GID = [dict objectForKey:@"id"];
g.GName = [dict objectForKey:@"name"];
NSLog(@"bk:%@",g.GName);
g.GImg = [dict objectForKey:@"image"];
g.GDesc = [dict objectForKey:@"description"];
NSMutableArray *items = [NSMutableArray array];
[items addObject:[SEMenuItem initWithTitle:g.GName imageName:g.GImg viewController:self removable:NO]];
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];
这绝对没问题……除了它所做的是将所有名称和所有图像一个接一个地放在另一个之上,而不是为每个结果创建一个新项目。
如果这是 php 我会做类似 "g.items" 的事情,它只会为每个 "g" 创建一个新项目,但我不确定在这里做什么。任何帮助,将不胜感激。 (我用谷歌搜索但找不到类似这样的 SESSpringBoard 项目……)
假设您在名为 allGoods
的变量中解析 json,并且它是一个包含表示 "Goods" 对象的字典的数组。
你可以这样做:
NSMutableArray *items = [NSMutableArray array];
for (NSDictionary *dictionary in allGoods) {
[items addObject:[SEMenuItem initWithTitle:[dictionary objectForKey:@"name"] imageName:[dictionary objectForKey:@"image"] viewController:self removable:NO]];
}
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];
我删除了您对 "Goods *g" 的使用,因为看起来您不需要保留对此类对象的引用。
编辑:这是您要求的 5 件物品限制
for 循环中的 "MIN" 是为了防止 allGoods
包含少于 5 个项目。
for (int i = 0; i < MIN(5, allGoods.count); i++) {
NSDictionary *dictionary = [allGoods objectAtIndex:i];
[items addObject:[SEMenuItem initWithTitle:[dictionary objectForKey:@"name"] imageName:[dictionary objectForKey:@"image"] viewController:self removable:NO]];
}
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];
所以!我有一个 NSDictionary,可以很好地从我的数据库中提取 json。我还有一个 mutable 数组,用于为我漂亮的 SESpringboard 视图创建项目。问题是,最初我只有几个项目,所以我是手动创建每个项目。但是现在我有成千上万的项目,我想在 php 中做一些类似 "while" 循环的事情,它会一直创建项目,直到它遍历整个 table.
这是我得到的代码:
Goods *g = [[Goods alloc] init];
g.GID = [dict objectForKey:@"id"];
g.GName = [dict objectForKey:@"name"];
NSLog(@"bk:%@",g.GName);
g.GImg = [dict objectForKey:@"image"];
g.GDesc = [dict objectForKey:@"description"];
NSMutableArray *items = [NSMutableArray array];
[items addObject:[SEMenuItem initWithTitle:g.GName imageName:g.GImg viewController:self removable:NO]];
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];
这绝对没问题……除了它所做的是将所有名称和所有图像一个接一个地放在另一个之上,而不是为每个结果创建一个新项目。
如果这是 php 我会做类似 "g.items" 的事情,它只会为每个 "g" 创建一个新项目,但我不确定在这里做什么。任何帮助,将不胜感激。 (我用谷歌搜索但找不到类似这样的 SESSpringBoard 项目……)
假设您在名为 allGoods
的变量中解析 json,并且它是一个包含表示 "Goods" 对象的字典的数组。
你可以这样做:
NSMutableArray *items = [NSMutableArray array];
for (NSDictionary *dictionary in allGoods) {
[items addObject:[SEMenuItem initWithTitle:[dictionary objectForKey:@"name"] imageName:[dictionary objectForKey:@"image"] viewController:self removable:NO]];
}
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];
我删除了您对 "Goods *g" 的使用,因为看起来您不需要保留对此类对象的引用。
编辑:这是您要求的 5 件物品限制
for 循环中的 "MIN" 是为了防止 allGoods
包含少于 5 个项目。
for (int i = 0; i < MIN(5, allGoods.count); i++) {
NSDictionary *dictionary = [allGoods objectAtIndex:i];
[items addObject:[SEMenuItem initWithTitle:[dictionary objectForKey:@"name"] imageName:[dictionary objectForKey:@"image"] viewController:self removable:NO]];
}
SESpringBoard *thunderboard = [SESpringBoard initWithTitle:@"Boom" items:items launcherImage:[UIImage imageNamed:@"thor.png"]];