- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有如下程序:..- 但是,我想在 TitleForHeaderInSection 中按日期降序排列数据,并且还想将标题中的日期格式化为
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
// [formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setDateFormat:@"EEE, d MMM yyyy"];
NSDate *headerDate = (NSDate *)[managedObject valueForKey:@"dateCreated"];
NSString *headerTitle = [formatter stringFromDate:headerDate];
代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
[self.navigationItem setTitle:@"List of Items"];
NSURL *serverURL = [NSURL URLWithString:SERVER_URL];
[[DataManager sharedInstance] loadData:serverURL withCompletion:^(NSArray *itemListArray, NSError *error) {
if (error != nil) {
UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Server Error" message:@"Unable to fetch Data from Server" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[errorAlertView show];
}
else {
fetchData = [self convertSectionTableData:itemListArray keyString:@"date"];
[self.listTableView reloadData];
}
}];
[self.listTableView reloadData];}
- (NSMutableDictionary *)convertSectionTableData:(NSArray *)convertDataSet keyString:(NSString *)keyString {
NSMutableDictionary *outputData = [NSMutableDictionary dictionary];
NSMutableArray *temp = [NSMutableArray array];
NSString *key = NULL;
for (NSDictionary *dic in convertDataSet) {
if (key == NULL) {
key = [dic objectForKey:keyString];
} else if (key != [dic objectForKey:keyString]) {
[outputData setValue:temp forKey:key];
temp = [NSMutableArray array];
key = [dic objectForKey:keyString];
}
if ([[dic objectForKey:keyString] isEqualToString: key]) {
[temp addObject:dic];
}
if (dic == [convertDataSet lastObject]) {
[outputData setValue:temp forKey:key];
}
}
return outputData;}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [fetchData count];}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[fetchData allValues][section] count];}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"CustomListTableCell";
CustomListTableCell *cell = (CustomListTableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
int section = (int)indexPath.section;
int row = (int)indexPath.row;
NSDictionary *data = [[fetchData allValues][section] objectAtIndex:row];
cell.homeLabel.text = [data objectForKey:@"home"];
return cell;}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [fetchData allKeys][section];}
@end
最佳答案
基本思想是字典是无序的,因此您需要某种方法以正确的顺序检索它们。我可能会建议构建字典键的排序数组。
// build dictionary of objects, keyed by date
NSMutableDictionary *objectsForDates = ...
// build sorted array of dates in descending order
NSArray *dates = [[objectsForDates allKeys] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1];
}];
然后您可以使用此 dates
对象来表示 TableView 的“部分”,然后使用它来了解要返回字典中的哪个条目:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.dates count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.objectsForDates[self.dates[section]] count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [self.formatter stringFromDate:self.dates[section]];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
Location *object = self.objectsForDates[self.dates[indexPath.section]][indexPath.row];
cell.textLabel.text = object.home;
return cell;
}
请注意,我建议对您的代码进行一些不相关的更改:
我建议对您的 JSON 内容使用自定义对象类型。这提供了比简单的 NSDictionary
更强的类型。
我还要确保类型的类型更自然(例如 id
看起来应该是 NSInteger
;date
看起来应该是 NSDate
)。
我还会为这个自定义类型提供一个 initWithDictionary
初始化程序,以简化解析代码。
构建按日期键控的字典(您的 convertSectionTableData
)的逻辑可以稍微简化。
您的 UI 日期格式化程序不应使用 en_US
的 locale
。解析 JSON 的格式化程序应该(或者更准确地说,它应该使用 en_US_POSIX
),但是在 UI 中呈现格式时,您应该使用用户自己的语言环境。
您的 UI 日期格式化程序也不应该使用固定的 dateFormat
字符串。使用预先存在的 dateStyle
之一,或者如果您必须使用 dateFormat
,请使用 dateFormatFromTemplate
构建本地化版本。
无论如何,把它们放在一起,你会得到类似的东西:
@interface Location : NSObject
@property (nonatomic) NSInteger identifier;
@property (nonatomic, copy) NSString *home;
@property (nonatomic, strong) NSDate *date;
- (instancetype)initWithDictionary:(NSDictionary *)dictionary;
@end
@implementation Location
- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
self = [super init];
if (self) {
self.identifier = [dictionary[@"id"] integerValue];
self.home = dictionary[@"home"];
[self setDateFromString:dictionary[@"date"]];
}
return self;
}
- (void)setDateFromString:(NSString *)string {
static NSDateFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
formatter.dateFormat = @"yyyy-MM-dd";
});
self.date = [formatter dateFromString:string];
}
@end
和
@interface ViewController ()
@property (nonatomic, strong) NSMutableDictionary *objectsForDates;
@property (nonatomic, strong) NSArray *dates;
@property (nonatomic, strong) NSDateFormatter *formatter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// set formatter for output
self.formatter = [[NSDateFormatter alloc] init];
[self.formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"EEEdMMMyyyy" options:0 locale:[NSLocale currentLocale]]];
self.formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
// perform request
NSURL *url = [NSURL URLWithString:@"http://borindatabase.000webhostapp.com/jsonData.php"];
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error || !data) {
NSLog(@"networkError: %@", error);
return;
}
NSError *parseError;
NSArray *values = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (![values isKindOfClass:[NSArray class]]) {
NSLog(@"parseError: %@", parseError);
}
// build dictionary of objects, keyed by date
NSMutableDictionary *objectsForDates = [[NSMutableDictionary alloc] init];
for (NSDictionary *value in values) {
Location *object = [[Location alloc] initWithDictionary:value];
NSMutableArray *objects = objectsForDates[object.date];
if (!objects) {
objects = [[NSMutableArray alloc] init];
objectsForDates[object.date] = objects;
}
[objects addObject:object];
}
// build sorted array of dates in descending order
NSArray *dates = [[objectsForDates allKeys] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1];
}];
// now update UI
dispatch_async(dispatch_get_main_queue(), ^{
self.objectsForDates = objectsForDates;
self.dates = dates;
[self.tableView reloadData];
});
}] resume];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.dates count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.objectsForDates[self.dates[section]] count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [self.formatter stringFromDate:self.dates[section]];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
Location *object = self.objectsForDates[self.dates[indexPath.section]][indexPath.row];
cell.textLabel.text = object.home;
return cell;
}
@end
关于ios - 如何对 TitleForHeaderInSection 上的日期进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44877601/
我的应用程序在4.3.1模拟器中显示此内容,在5.0模拟器中显示此内容。 这是代码: - (NSString *)tableView:(UITableView *)tableView titleFor
我有一个 UITableviewController ,其标题 View 类似于: https://github.com/andersonkxiass/UITableViewHeader 但是我的表格
我像这样从 plist 加载数据到 uitableview: - (void)viewDidLoad { [super viewDidLoad]; NSArray *documentP
问题是这两个部分有时是空的,所以我不知道当它们变空时如何防止崩溃。 self.globalSections 是一个全局 NSMutableArrays,由本地两个 NSMutableArrays 存储
此应用仅供研究和学习之用。我是开发新手,所以这没什么特别的,真的。 它应该显示一个包含一些联系人的 TableView,这些联系人分为两个不同的类别:最近和 friend 但是,当我尝试使用 Titl
这是我添加的。它只是列出了每个字母字符下的所有 objectsForCharacters。 - (void)tableViewDidLoadModel:(UITableView*)tableView
所以我的问题是我的部分上方的文字太长而被截断。 有什么方法可以解决这个问题,比如让它长两行? 感谢任何帮助 最佳答案 您需要定义heightForHeaderInSection 并自定义viewFor
就调用命名我的 header 而言,我似乎无法做到正确。 如果您想知道我的模型是关于什么的 - 它基本上是一本包含美丽地点的字典,按字母顺序书写。 有人可以帮助我吗,因为我真的无法弄清楚我做错了什么?
我有一个简单的项目,它有一个 View ,这个 View 里面只包含一个 TableView 。表格 View 被分组并且有一个简单的原型(prototype)单元格。 我已经实现了 titleFor
我有如下程序:..- 但是,我想在 TitleForHeaderInSection 中按日期降序排列数据,并且还想将标题中的日期格式化为 NSDateFormatter *formatter = [[
我将一个 TableView 添加到 View Controller ,然后尝试在 IOS 6.0 中更改其节标题。 每次调用特定函数时我都会更改 header 字符串,所以我不想处理 (UIView
我有一些非常简单的代码来返回节标题的标题: - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSIn
在长时间阅读和检查代码之后,我为拥有一个包含部分和部分标题的自定义表格 View 而感到自豪,所有这些都是从核心数据对象中填充的。现在我需要自定义部分标题和背景颜色。我已经看到它完成了,但是在 vie
在我的核心数据应用程序中,我使用 FetchedResultsController。通常要在 UITableView 中设置标题的标题,您将实现以下方法,如下所示: - (NSString *)tab
尝试在 tableView 的 titleForHeaderIn 部分返回复合字符串时遇到一个奇怪的问题。 如果我 NSLog 字符串,它似乎很好,但是当我返回它时,它崩溃了! 这是我的代码: - (
我用下面的代码在group tableview title header上设置标题,但是默认文本是AlignmentLeft,如何AlignmentCenter? - (NSString *)tabl
我正在使用 titleForHeaderInSection 来显示 UITableView 部分的标题。它适用于 iOS6 SDK,但 iOS7 SDK 以所有大写字母显示标题。 我猜这是 Apple
我正在尝试从 Controller 构建一个 tableView,而不仅仅是在 Storyboard中自己构建静态单元格。我的所有单元格都是从一个数组填充的,并且我希望节标题从不同的数组中显示。 nu
我有一个计算卡路里的应用程序。用户输入他们的卡路里(每一点食物都成为 TableView 中的一行。每个部分代表一天。 我有一个部分标题,添加了当天的所有卡路里。 现在我有一年的输入,加载应用程序的性
我正在使用 MRC(不要使用 ARC) 节.h @property (nonatomic, assign) NSString* headerTitle; section.m - (instancety
我是一名优秀的程序员,十分优秀!