过滤 json 数据并将结果数据重新加载到 myTableView
Posted
技术标签:
【中文标题】过滤 json 数据并将结果数据重新加载到 myTableView【英文标题】:Filtering json data and reloading the resulted data into myTableView 【发布时间】:2014-02-02 22:32:03 【问题描述】:我试图在按下今天的按钮时将与今天的日期匹配的事件(数据)(来自 json 文件)加载到我的 tableView 中,然后只有具有今天日期的数据将被加载到那里,当按下未来按钮时,事件稍后的日期将被加载,我在这里遇到的唯一问题是当我运行我的程序时,当我按下这些 UI 按钮中的任何一个时,实际上什么都没有发生,我得到了所有事件,不管它们的日期,甚至没有点击任何 UIButton,你可以请看下面我的一些代码,如果有人能弄清楚那里的问题是什么,那就太好了,因为我不确定如何使用谓词来过滤数据:
@property (strong, nonatomic) NSArray *dateEvents;
@end
@implementation HomeViewController
NSArray *_events;
NSArray *_dateEvents;
- (IBAction)upcomingEvents:(id)sender
NSDate *currDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"dd-MM-YYYY"];
NSString *dateString = [dateFormatter stringFromDate:currDate];
NSLog(@"mama");
_dateEvents = [_events filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Events * event, NSDictionary *bindings)
return [event.date isEqualToString:dateString];
]];
self.myTableView.dataSource = self;
[self.myTableView reloadData];
NSLog(@"yes");
谢谢,
【问题讨论】:
你确认upcomingEvents
被调用了吗? _dateEvents
过滤后内容是否正确? _dateEvents
是否在cellForRowAtIndexPath
和其他数据源方法中使用?
@MartinR 我有一个 json 文件,其中包含所有日期的所有事件,未调用即将到来的,我不知道过滤后 _dateEvents 是否具有正确的内容,因为所有事件都加载一次无论我按下今天还是未来的按钮,我都会启动我的应用程序.. 我怀疑这是我的问题!我没有在我的数据源方法中调用 _dateEvents,因为我不知道如何调用,我只是调用了 _events,顺便说一下,我在 tableView 中使用了自定义单元格。
【参考方案1】:
我不确定这一定会有所帮助,因为我看不到足够的代码,所以请确定这是您的问题,但您可能会发现将所有日期转换为 NSDate 很有用对象(以便您可以确定问题不在于字符串实际上不相等),然后通过在 NSDate 上使用此类别方法检查日期是否为当天:
NSDate+Extensions.m:
static NSCalendar* ___calendar;
@implementation NSDate (Extensions)
- (BOOL)isSameDay:(NSDate*)date
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:self];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
-(NSCalendar*)currentCalendar
if(___calendar == nil)
___calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
return ___calendar;
@end
NSDate+Extensions.h
@interface NSDate (Extensions)
- (BOOL)isSameDay:(NSDate*)date;
@end
【讨论】:
我什至不确定是否必须执行此过程,因为我已经将事件日期声明为 NSString 并且我已经检查了上述代码(我的代码)是否返回当前日期,并显示日期它与 json 文件上的日期格式完全匹配,所以我不认为这是一个匹配问题,这里的问题是应用程序加载所有事件,即使默认情况下(今天事件的 UIButton 应该只显示今天的事件和时间未来事件的 UIButton 被按下,所有未来事件都应该被加载)但这没有发生,老实说我不知道我应该做什么.. 你认为我必须使用两个 UITables 吗?? PS,有关我的 json 文件和我的代码的更多信息,请查看我之前的问题。 OK - 如果日期检查绝对不是问题,那么可能是稍微不同的方法。两件事:首先,当您第一次加载数据时,您可以将其分成两个数组 - 第一个是今天的数据,第二个是未来所有日子的数据。然后在某处有一个带有选项 TableViewDatesToday、TableViewDatesFuture 的枚举,并在您的表视图的数据源方法中,有一个 switch 或 if 语句,以便如果您使用 TableViewDatesToday,则使用 TodayArray 作为数据源,如果使用 TableViewDatesFuture,则使用 FutureDates 数组. 第二种可能是在数据加载后手动调用即将到来的事件,然后将此返回值存储到 dateEvents 并确保使用 dateEvents 数组而不是 events 数组作为表视图数据源。当用户更改为今天的事件时,您需要另一个名为 todayEvents 或类似的方法,并在重新加载表视图之前将此值存储到 dateEvents。以上是关于过滤 json 数据并将结果数据重新加载到 myTableView的主要内容,如果未能解决你的问题,请参考以下文章