【问题标题】:Not reloading the right data in UITabeView未在 TableView 中重新加载正确的数据
【发布时间】:2025-12-09 22:35:02
【问题描述】:

我编写了这段代码来重新加载 UItableView,其日期与用户单击主视图控制器中今天的事件 UIButton 时的当前日期相同,但问题是下面的代码没有重新加载正确的数据(它只是给出了初始数据,没有将事件的日期与 iPhone 中的日历日期进行比较),我的数据来自项目中的一个 json 文件,由事件的 NSArray 组成,每个键都有不同的值和其中一个键是该事件的数据(“日期”),谁能帮我澄清一下为什么下面的代码没有返回正确的数据??

  @implementation MainViewController {
 NSArray *_events;
 }



.... 

- (IBAction)upcomingEvents:(id)sender {

NSDate *currDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"dd-MM-YYYY"];
NSString *dateString = [dateFormatter stringFromDate:currDate];


for (Events *event in _events){

    if([event.date isEqualToString:dateString]){

       [self.myTableView reloadData];

    }

}


}

【问题讨论】:

  • 如果_events 是您的数据源,那么您只需过滤数组,然后将reloadData 消息发送到您的tableview 以进行刷新。现在你只是在刷新你的 tableview 而不对你的数据源数组做任何改变。
  • @Alladinian 以及如何过滤数组?? (我对 Xcode 和 Objective-C 很陌生)

标签: ios objective-c json uitableview xcode4.6


【解决方案1】:

如果您使用的是 UITableViewDataSource,则应确保它仅返回符合您的条件[event.date isEqualToString:dateString]的事件@

你可以的

NSArray * dateEvents = [_events filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Events * event, NSDictionary *bindings)
{
    return [event.date isEqualToString:dateString];
}];

然后您可以将dateEvents 用于您的 UITableViewDataSource。

【讨论】:

  • 是的,我正在使用 UITableViewDataSource,这是否意味着我不必再次使用 for 条件?我应该在哪里包含上述声明?在 IBAction 内?
  • 您可能希望在 'upcomingEvents' 方法中更新 dateEvents。并确保 UITableViewDataSource 使用 dateEvents 而不是事件。您可能希望将 dateEvents 设置为您班级的属性。
  • 当我在我的代码中包含上面的代码时,我在 [_events] 中出现错误,说 (UNKNOWN RECEIVER) 即使我在我的实现部分中声明了该数组 (NSArray *_events) .. 我不不懂!!!以及如何在我的 UITableViewDataSource 中包含 dateEvents ? (我对这一切都很陌生,我将不胜感激任何进一步的澄清)
  • @user3066516,不清楚为什么 _events 会给你这个错误,因为你在上一个问题中使用了它,并且它在那里工作。要使用 dateEvents 而不是 _events 作为数据源,您只需在数据源方法(numberOfRowsInSection、cellForRowAtIndexPath 等)中使用它,而不是使用 _events。您可能希望有一个 if-else 子句来选择您使用的数组,具体取决于您在即将到来的事件方法中设置的标志。
  • 查看更多代码可能有助于了解您需要更改的内容。另外,你得到的错误到底是什么?未知的接收者意味着未知的标识符。您确定 _events 在您使用它的范围内吗?是编译时错误还是运行时错误?