2016-11-25 26 views
3

我遇到了一个问题,我无法向自己解释,我希望你能指向我在正确的方向,甚至提供我适合的解决方案UITableView跳到顶部,显示SearchBar,当“隐藏底部酒吧推”是从细胞继续为真

我有一个UITableViewController嵌入UINavigationController与自定义原型UITableViewCell。在我的Storyboard中,我添加了一个Segue来显示(推送)一个详细视图控制器到堆栈上。这工作正常,迄今为止没有任何意外。但是,当我按下我的详细信息视图控制器上的后退按钮时,它会返回到我的UITableViewController,但是这次,TableView跳转到顶部并显示TableViews HeaderView,其中放置了一个SearchBar。

发生这种情况时,我检查了“关于推动隐藏底栏”我的详细视图控制器,我需要这样的细节视图控制器隐藏在我嵌入NavigationController中的UITabBarController标签栏上。

我的层次看起来是这样的:

-UITabBarController 
--UINavigationController 
---UITableViewController (my table view controller) 
--(more view controllers for other tabs) 

奇怪的是,这不会立即发生。当我回去的时候,起初一切看起来不错,但是在很短的时间之后,它真的跳到了tableview的最顶端。

我登录意见表contentOffset及其类似这样之后我按后退按钮:

T0.000: viewDidLayoutSubviews => -20 
T0.011: viewWillAppear => 44 
T0.023: viewDidLayoutSubviews => -20 
T0.530: viewDidAppear => -20 (correct value, same as before the push) 
T0.540: viewDidLayoutSubviews => -64 (wrong value, showing search bar) 

轮半秒钟后不会发生什么事?为什么突然跳到顶端?我从来没有自己设置偏移量。它由系统自动完成,如果我在我的详细信息视图控制器中取消选中“隐藏底部栏”,则行为按预期工作,这意味着如果我之前可以看到搜索栏,它在后面可见并且是否可见隐藏之前,其仍然隐藏在之后。

回答

0

嗯,我没有找到如何解决这个问题,但至少我找到了一个解决方法来阻止跳跃。我在其他应用程序中观察到同样的问题,甚至苹果也不会隐藏应用程序启动时的搜索栏。也许是因为这个问题,谁知道?所以这是我的解决方案。

首先,只有当您的表格视图的单元格少于填充整个屏幕所需的单元格时,才会发生此问题。只要你的屏幕上有更多的单元格,在进入详细视图并返回到主视图后,tableview不会跳转并保持在相同的位置。

有了这些知识,我就可以创建一个解决方法。我的解决方法很简单。我使用segues来显示我的应用程序的各个部分,因此在我的UITableViewController中是“主”,在准备(for segue:sender :)之前,我显示详细视图,我检查表视图的第一个单元格是否可见。如果是这样,我滚动tableview显示搜索栏。

if let firstCell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) { 
    if tableView.visibleCells.contains(firstCell) && !searchController.isActive { 
     let offset = CGPoint(x: 0, y: -tableView.contentInset.top) 
     tableView.setContentOffset(offset, animated: true) 
    } 
} 

当单击其中一个单元格时,将显示一个用于显示条目详细信息的segue。如果第一个单元格是可见的,我将tableview向下滚动一点以显示搜索栏。

一个更好的方法可能是实际计算在屏幕上可以放置多少个单元格以及总共有多少个单元格,所以当没有足够的单元格时我们确实只显示搜索栏,但是我发现此解决方案很好对我来说足够了,因为它可以防止跳跃

相关问题