iOS UITableView:使用来自 JSON 对象的信息的自定义部分,而不仅仅是计算它

Posted

技术标签:

【中文标题】iOS UITableView:使用来自 JSON 对象的信息的自定义部分,而不仅仅是计算它【英文标题】:iOS UITableView: Custom sections using information from a JSON object, not just counting it 【发布时间】:2012-12-18 23:38:02 【问题描述】:

假设我有这个 JSON:

[
    "x":"01", "ID":"1",
    "x":"02", "ID":"2",
    "x":"02", "ID":"3",
    "x":"03", "ID":"4",
    "x":"03", "ID":"5",
    "x":"03", "ID":"6",
    "x":"03", "ID":"7"
]

我想像这样创建一个 UITableView:

------------
Section 01
------------
ID: 1
------------
Section 02
------------
ID: 2
ID: 3
------------
Section 03
------------
ID: 4
ID: 5
ID: 6
ID: 7

我怎样才能知道我需要多少节以及如何在每个节中输出正确的数据?

【问题讨论】:

你能改变你的 JSON 格式吗? 不...它会破坏很多其他的东西 您是从您控制的 Web 服务中检索此 JSON,还是与您的应用程序捆绑在一起?如果你愿意,你能改变它吗?我问的唯一原因是您必须在客户端上编写代码才能将其解析为您想要的格式。如果您可以创建漂亮的 JSON,它只会让您的生活更轻松。 我绝对明白你的意思。我可以改变它,是的,但是因为它会破坏很多其他的东西,我可以让我的客户将它解析成我可以使用的格式。无论如何,这是很好的锻炼:) 【参考方案1】:

要做的第一件事就是将该 JSON 转换为 Objective-c 数据结构。我推荐一个数组数组,其中“X”是每个“ID”值数组的索引。

类似:

NSMutableArray *tableSections;
NSMutableArray *sectionData;

CustomDataObject *yourCustomDataObject;

int sectionIndex;

//Pseudo-code to create data structure
for(data in json) 

    sectionIndex = data.X;

    yourCustomDataObject = [[CustomDataObject alloc] initWithId:data.ID];

    //Do index check first to insure no out of bounds
    if(sectionIndex != OutOfBounds)
        sectionData = [tableSections objectAtIndex:sectionIndex];

    //Create the new section array if there isn't one for the current section
    if(!sectionData) 
        sectionData = [NSMutableArray new];
        [tableSections insertObject: sectionData atIndex: sectionIndex];
        [sectionData release];
    

    [sectionData addObject: yourCustomDataObject];
    [yourCustomDataObject release];

上面的代码只是帮助您入门的伪代码。创建这个数组数组可能是你以前做过的事情。

重要的部分是通过实现 UITableViewDataSource 协议来访问这些数据。我建议继承 UITableView 并在您的自定义子类中实现 UITableViewDataSource 协议。

您将需要这些方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return [tableSections count];
 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return [[tableSections objectAtIndex: section] count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    //Implement as you normally would using the data structure you created

    NSMutableArray *sectionData = [tableSections objectAtIndex: indexPath.section];
    CustomDataObject *dataObject = [sectionData objectAtIndex: indexPath.row];

    NSLog(@"\n**** Debug Me *****indexPath: section: %i row: %i \ndataObject%@", indexPath.section, indexPath.row, dataObject);

这应该足以让您入门。弄清楚其余的细节应该是一种很好的做法。

【讨论】:

所以基本上我应该得到:[ "01": "ID":"1" "02": "ID":"2", "ID":"3" "03": "ID":"4", "ID":"5", "ID":"6", "ID":"7" ] 然后使用它? 大括号在表示objective-c结构时会让人困惑......可能更像:[ ["1"], ["2","3"], ["4", " 5”、“6”、“7”]] 为了更紧密地遵循您的符号...[ ["ID":"1"], ["ID":"2","ID":"3"], ["ID":"4", "ID":"5", "ID":"6", "ID":"7"] ]。方括号表示一个数组。花括号表示自定义数据对象。 我想要一个包含多个数组的数组,每个数组都由键(部分)标识并包含每个部分的数据。我想我们互相理解。不过,您的可能更好,因为您没有具体定义它,并且部分从 0 开始。我会随时告诉您这是如何工作的! 对不起,@Brandon,但我这辈子都想不通。我已经尝试过使用您能想到的所有可能方式的伪代码,但 tableSections 将始终为空。检查此粘贴pastebin.com/AWBbFdLQ【参考方案2】:

假设“x”的值将从 1 增加到 n 而没有跳过任何值,那么您需要的部分数将只是“x”的最后一个值(即 n)。

如果没有,您确实必须遍历“x”的值以查看有多少唯一值。

【讨论】:

【参考方案3】:

最终得到了这个解决方案:

    NSMutableDictionary *result = [NSMutableDictionary dictionary];
    for(NSDictionary* dict in data) 
        NSNumber *x = [dict objectForKey:@"x"];
        NSMutableArray *resultsForX = [result objectForKey:x];

        if(!resultsForX) 
            resultsForX = [NSMutableArray array];
            [result setObject:resultsForX forKey:x];
        

        [resultsForX addObject:dict];
    

    NSMutableArray *newArr = [result allValues];

【讨论】:

以上是关于iOS UITableView:使用来自 JSON 对象的信息的自定义部分,而不仅仅是计算它的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上将 Wordpress JSON 解析为 UITableView

使用 NSDictionary 填充 UITableView,其中包含来自 mysql db 的已解析 JSON 数据

IOS:来自 Json 的 LazyLoad 图像

从iOS中的json动态创建UITableView中的UILabels?

如何使用来自不同 ViewController 的 JSON 响应填充 UITableView?

在 Swift 2 和 Xcode 7 中使用来自 youtube 视频的 JSON 数据填充 UITableView