我想遍历一个json项列表,以便在我的分区tableView中使用。为此,我想重新构建数据以进行section->数组设置,其中array包含一个会话数组。
首先,我不知道这是否是首选的方式,可能有更简单的方法。我不断收到错误,我不允许使用'section'作为字典中的标识符。此外,当我使用别人而不是“部分”时,字典会被覆盖。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSString *day = _json[@"days"][3];
NSString *key;
NSUInteger count = 0;
NSMutableArray *sessionList = [[NSMutableArray alloc] init];
NSArray *timeslotsSorted = [[_json[@"schedule"][day] allKeys]
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSArray *locationsSorted = [[_json[@"schedule"][day][timeslotsSorted[section]] allKeys]
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
for (key in locationsSorted) {
NSDictionary *temp = _json[@"schedule"][day][timeslotsSorted[section]][key];
if ([temp isKindOfClass:[NSDictionary class]]) {
[sessionList addObject:temp[@"title"]]; //test array
count++;
}
}
_sessionDict = @{
section: sessionList
};
return count;
}
答案 0 :(得分:1)
您正在完成在错误的位置构建数据结构的所有工作。假设您的数据中有10个部分。这将调用tableView: numberOfRowsInSection
方法10次,这使得这个工作非常低效。您还必须实现返回要显示的节数以及显示每个行的方法的方法。
我将在viewWillLoad
方法中构建我的数据结构,然后将其存储在本地,并在所有tableView
方法中重复使用。
答案 1 :(得分:0)
首先,这就是NSInteger:
typedef int NSInteger;
您必须将其包装到对象中。类似的东西:
[NSNumber numberWithInteger:section]
然后将其添加到您的词典中。
答案 2 :(得分:0)
我真的不知道您的timeslotsSorted
和locationsSorted
包含正确的项目,但我们可以这样说。我建议您在调用- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
和- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
之前进行此排序。
让我们说,你收到了JSON,所以你必须像你一样解析它,然后调用[tableView reloadData]
或用动画重新加载可见的单元格。
然后将调用您的tableView数据源方法,您将执行以下操作:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [sessionList count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSString* key = [self.sessionList objectAtIndex:section];
return [[self.secions objectForKey:key] count];
}
并且不要忘记为self.sections
和self.sessionList