gpt4 book ai didi

ios - 当 tableView 仍在滚动时 popToRootViewController 崩溃

转载 作者:可可西里 更新时间:2023-11-01 05:28:43 25 4
gpt4 key购买 nike

当我滑动 tableView 并在 tableView 结束滚动之前按下“后退”按钮时,我的应用程序崩溃了。我尝试了以下方法:

- (void) closeViewController
{
[self killScroll];
[self.navigationController popToRootViewControllerAnimated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}

- (void)killScroll
{
CGPoint offset = sellersTableView.contentOffset;
[sellersTableView setContentOffset:offset animated:NO];
}

那没用,同样的崩溃。我不明白为什么,我得到的错误如下:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

所以这意味着当一切都已经被释放时,tableView 仍在请求一个单元格。没有意义。然后我试了这个:

- (void) closeViewController
{
[self.navigationController popToRootViewControllerAnimated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}

- (void)dealloc
{
sellersTableView.dataSource = nil;
sellersTableView.delegate = nil;
sellersTableView = nil;
}

给我同样的错误。有什么想法吗?

更新:我的委托(delegate)方法

creation

if (textField == addSellerTextField) {
sellersTableView = [[UITableView alloc] initWithFrame:CGRectMake(addSellerTextField.frame.origin.x + addSellerTextField.frame.size.width + 10, addSellerTextField.frame.origin.y - [self heightForTableView] + 35, 200, [self heightForTableView])];
sellersTableView.delegate = self;
sellersTableView.dataSource = self;
sellersTableView.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.05];
sellersTableView.separatorColor = [[UIColor grayColor] colorWithAlphaComponent:0.15];
sellersTableView.rowHeight = 44;
sellersTableView.layer.opacity = 0;
[self.companyView addSubview:sellersTableView];
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{sellersTableView.layer.opacity = 1;} completion:nil];
}

cellForRowAtIndexPath

if (tableView == sellersTableView) {
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor clearColor];
if ([sellersArray count] > 0) {
cell.textLabel.text = [sellersArray objectAtIndex:indexPath.row];
} else {
UILabel *noSellersYetLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, sellersTableView.frame.size.width, [self heightForTableView])];
noSellersYetLabel.text = @"no sellers yet";
noSellersYetLabel.textAlignment = NSTextAlignmentCenter;
noSellersYetLabel.textColor = [UIColor grayColor];
[cell addSubview:noSellersYetLabel];
sellersTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
}

removing

- (void) textFieldDidEndEditing:(UITextField *)textField
{
if (textField == addSellerTextField) {
[self updateSellers:textField];
}
}
- (void)updateSellers:(UITextField *)textField
{
[textField resignFirstResponder];
[self hideSellersTableView];
}

- (void)hideSellersTableView
{
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{sellersTableView.layer.opacity = 0;} completion:nil];
sellersTableView.dataSource = nil;
sellersTableView.delegate = nil;
[sellersTableView removeFromSuperview];
sellersTableView = nil;
}

解决方案所以显然将 dataSource = nildelegate = nil 放入 textFieldDidEndEditing 解决了这个问题。谢谢大家的回答!

最佳答案

这是 UITableView 的奇怪行为。解决此问题的最简单方法是在调用函数 popToRootViewControllerAnimated 之前将 UITAbleViewdataSourcedelegate 属性设置为 nil 。此外,您可以使用更常见的解决方案,并将将属性设置为 nil 的代码添加到 -dealloc 方法中。此外,您不需要 -killScroll 方法。

经过短暂的研究,我意识到问题所在。这种异常行为出现在 iOS 7 中。它的 superview 保留的 ScrollView 可能会在 delegate 被释放后发送消息给 delegate。这是由于 -removeFromSuperview 实现 UIScrollView 触发 -setContentOffset: 并最终向委托(delegate)发送消息。

关于ios - 当 tableView 仍在滚动时 popToRootViewController 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26060727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com