作为练习Objective-C的练习,我将Swift代码转换为Objective-C。在转换1.5k行之后,我发现自己在最后一期中被封锁了几天。
在我的TableViewController的几个单元格中,描述标签根本不显示。我检查了我的代码,似乎传递给单元格的字符串实际上是空的或没有。
我似乎在转换将日期返回到我的单元格的Swift代码时出现语法错误。我做了什么错误使日期为零?
...
NSDate const *now = [[NSDate alloc] init];
NSDate *date = [[NSDate alloc] init];
self.sections = [[NSMutableArray<NSString *> alloc]init];
self.items = [[NSMutableArray<NSMutableArray<TableItem *> *> alloc]init];
self.sectionItems = [[NSMutableArray<TableItem *> alloc]init];
...
这是没有正确加载的单元格数据(空字符串传递给theDescription
):
anItem = [[TableItem alloc ]initWithTitle: @"Custom: dd MMM yyyy HH:mm:ss" theDescription: [NSString stringWithFormat:@"%@", [now toString: [DateFormat CustomDateFormat:@"dd MMM yyyy HH:mm:ss"]]]];
[_sectionItems addObject: anItem];
//theDescription should be: @"25 April 2016 15:04:57" after this ^, but is actually nil or @""
anItem = [[TableItem alloc ]initWithTitle: @"ISO8601(Year)" theDescription: [NSString stringWithFormat:@"%@", [now toString: [DateFormat ISODateFormat: ISOFormatYear]]]];
[_sectionItems addObject: anItem];
//theDescription should be: @"2016" after this ^, but is actually nil or @""
在这里,我认为我犯了一个错误:
原始的Swift语法:
toString()函数
case .ISO8601(let isoFormat):
dateFormat = (isoFormat != nil) ? isoFormat!.rawValue : ISO8601Format.DateTimeMilliSec.rawValue
zone = NSTimeZone.localTimeZone()
我尝试了什么:
else if([format.dateFormatType compare: ISO8601DateFormatType] == NSOrderedSame) {
NSString *isoFormat = ISO8601DateFormatType;
dateFormat = (isoFormat != nil) ? isoFormat : ISOFormatDateTimeMilliSec;
zone = [NSTimeZone localTimeZone];
}
答案 0 :(得分:2)
问题出在这一行:
NSDateFormatter *formatter = [NSDate formatter : dateFormat : [NSTimeZone localTimeZone] : [NSLocale currentLocale]];
dateFormat
是@"Custom"
,因为它在此设置:
else if([format.dateFormatType compare: CustomDateFormatType] == NSOrderedSame) {
NSString *string = CustomDateFormatType;
dateFormat = string;
}
这会传递到您的NSDateFormatter
构造函数中:
formatter.dateFormat = format;
@"Custom"
不是有效的日期格式字符串。相反,传入format.formatDetails
:
NSDateFormatter *formatter = [NSDate formatter : format.formatDetails : [NSTimeZone localTimeZone] : [NSLocale currentLocale]];
我应该注意,在Objective-C中不使用命名参数会使你的代码更难阅读。