回到顶端,为什么UITableView只显示一半的数据

时间:2018-08-20 00:15:41

标签: ios objective-c uitableview reloaddata

我的UITableView有一个非常奇怪的行为。当我在启动应用程序后第一次调用它时,所有数据都会按原样显示。当我移到另一个Viewcontroller并返回到tableview时,它仅显示一半的数据。我发现viewwillappear中的[tableview reloaddata]会引起问题。如果我将其注释掉,所有数据将保持不变。因此,我想回来时检索数据时出了点问题。我需要告诉您数据来自2个不同的数组,这些数组填充了自定义UITableViewCell中的标签。由于我在设置此单元格时遇到其他困难(标签不符合设置的约束条件),首先我认为标签可能看不到。但是现在我很确定数组之一的数据都消失了。

有人知道,第一次加载数据和重新加载数据是否有所不同?是否可能是时序问题,并且tableviewcontroller没有足够的时间来检索数据?如果是,我该怎么办?可能还有其他原因导致它不起作用吗? 请告诉我是否应该发布一些代码。我不知道该如何解决这个问题。

在此先感谢您的帮助。

`

-(void)viewWillAppear:(BOOL)animated
{

    [super viewWillAppear:animated];

    [self fetchAllTermine]; //method to retrieve data from array #1
    NSLog(@"viewWillAppear: %@", [self fetchAllTermine]);//logfile always shows data
    events = (NSMutableArray*) [self getEventsFromCalendar]; //method to retrieve data from array #2  , events is a global variable  
[self.tableView reloadData];//after reloadData data from array #1 are missing

}

-(NSMutableArray*)fetchAllTermine
{
    NSFetchRequest<Termine *> *tfetchRequest = [Termine fetchRequest];
    NSError *error ;
    NSMutableArray * fetchedTermine = [[[self managedObjectContext] executeFetchRequest:tfetchRequest error:&error]mutableCopy];
    self.termineArray = [[[self managedObjectContext] executeFetchRequest:tfetchRequest error:&error]mutableCopy];
  //  NSLog(@"fetchAllTermine in MonatTVC: %@", self.termineArray);
    return fetchedTermine;
}



-(NSArray*)getEventsFromCalendar
{

        [[EKEventStore new] requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (granted) {
                NSLog(@"Access to calendar granted");
            } else {
                NSLog(@"No access to calendar");
            }
        }];

        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSArray *calendars = [[EKEventStore new] calendarsForEntityType:EKEntityTypeEvent];

        NSDateComponents *tomorrowComponents = [[NSDateComponents alloc] init];
        tomorrowComponents.month = 0;
        NSDate *tomorrow = [calendar dateByAddingComponents:tomorrowComponents
                                                     toDate:[NSDate date]
                                                    options:0];

        // Create the end date components
        NSDateComponents *afterTomorrowComponents = [[NSDateComponents alloc] init];
        afterTomorrowComponents.month = +1;
        NSDate *afterTomorrow = [calendar dateByAddingComponents:afterTomorrowComponents
                                                          toDate:[NSDate date]
                                                         options:0];


        NSPredicate *predicate = [[EKEventStore new] predicateForEventsWithStartDate:tomorrow
                                                                             endDate:afterTomorrow
                                                                           calendars:calendars];

        NSArray *eventListe = [[EKEventStore new] eventsMatchingPredicate:predicate];
    return eventListe;

}

`

coming back to the view

first call of the view with all data shown

3 个答案:

答案 0 :(得分:0)

您应该复制数组数据以将其显示在单元格上。否则,您将无法获得想要显示的总数据。

答案 1 :(得分:0)

快速浏览一下您的代码可能有什么问题。在viewWillAppear()中使用reloadData是不可行的:

  1. 首先,在尚未创建视图时调用viewWillAppear visible和reloadData导致重绘和其他操作 取决于/需要可见的视图(例如,单元格的高度);
  2. 第二,当视图变为 可见,因此您的reloadData在这里没有用;
  3. 每当您的视图变为可见时,就会调用
  4. viewWillAppear() 关闭子视图控制器后。你真的想要桌子吗 每次在原点闪烁和滚动时重新加载 这样的情况?

除此之外,没有足够的代码来查看其他错误。在viewDidLoad中如何初始化表,如何创建和填充单元格,等等。

答案 2 :(得分:0)

感谢所有回答我问题的人。现在,我找到了解决问题的方法。第一次初始化后,每次回到表视图时,我都会重写terminData-Array。现在一切正常,我可以使用两个并行数组在tableview中填充数据。

BR

Debhelapara