为啥UITableView回到前面时只显示一半的数据

Posted

技术标签:

【中文标题】为啥UITableView回到前面时只显示一半的数据【英文标题】:Why does UITableView shows only half the data when coming back to front为什么UITableView回到前面时只显示一半的数据 【发布时间】:2018-08-20 00:15:41 【问题描述】:

我的 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

【问题讨论】:

首先,提供的两个链接都显示相同的图片,就好像没有问题一样。你可能要重新检查一遍,否则就没用了。 两张图片都是一样的。 PI 重新检查附加图像 你的tableview self.termineArray 数组或事件数组的数据源是什么? @Edy 和 Happily Hemu:谢谢你告诉我我加载了错误的图像。 @dreamBegin:两个数组都是数据源。 events.array 中的数据每次都能正确显示,但 self.termineArray 似乎与单元格的连接松动。 【参考方案1】:

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

【讨论】:

你的意思是我应该把所有数据放在一个数组中然后显示出来?我会试试的。【参考方案2】:

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

BR

德贝拉帕拉

【讨论】:

【参考方案3】:

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

    首先,viewWillAppear 在视图还没有的时候被调用 visible 和 reloadData 会导致重绘和其他操作 依赖/需要可见视图(例如,单元格的高度); 其次,当视图变为 可见,所以你的 reloadData 在这里没用; viewWillAppear() 每次视图变得可见时都会被调用 关闭子视图控制器后。你真的想要桌子 每次都在原点闪烁和滚动重新加载 这样的情况?

除此之外,没有足够的代码来查看还有什么问题。在 viewDidLoad 中如何初始化表格,如何创建和填充单元格等。

【讨论】:

Cynichniy Bandera 您会推荐哪种方法来放置 reloadData?该方法的调用应该将新输入的数据带入 tableview。如果我不调用它,只有在重新启动应用程序后才会出现新数据。 叹息...这不是我可以推荐的,更多的是关于做正确的事。伙计,您肯定需要阅读某种“ios UI 傻瓜编程”。你需要它,相信我) 这个这个:appcoda.com/…

以上是关于为啥UITableView回到前面时只显示一半的数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 UIView 没有出现在 UITableView 前面?

UITableView 应该显示 2 个单元格时只显示 1 个单元格(Swift 3)

存储过程中为啥会丢失小数点前面的0

为啥活动通过 onCreate 而不是 onRestart 回到前面?

UITableView 滚动到最后一个单元格只显示一半的单元格

LabVIEW中如何设置打开前面板时只显示程序部分