为啥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)
为啥活动通过 onCreate 而不是 onRestart 回到前面?