过滤 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的主要内容,如果未能解决你的问题,请参考以下文章

Django 应用过滤器重新加载数据表

extjs 嵌套数据网格过滤器和重新加载在 viewModel 上不起作用

过滤数据表并将结果复制到两个不同的数据表

在搜索期间重新加载 UITableView

无法使用新的json数据重新加载JQGrid

从 javascript POST 重新加载剃须刀页面