【发布时间】:2017-04-14 13:12:52
【问题描述】:
我在使用此功能时遇到问题,我想获得一些帮助。
我的层次结构是TabBarController -> Navigation Controller -> TableViewController
我想要的是,如果您在当前选项卡上并且向下滚动,您将能够点击当前视图的 UITabBarItem,您将被滚动回顶部,例如 Instagram 和 Twitter。
我在这里尝试了很多东西:
但遗憾的是,没有一个答案对我有用。
对于这种方式的任何帮助,我将不胜感激, 提前谢谢!
这是我的 TableView`控制器的代码:
import UIKit
class BarsViewController: UITableViewController,UISearchResultsUpdating,UISearchBarDelegate,UISearchDisplayDelegate,UITabBarControllerDelegate{
//TableView Data & non related stuff....
override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.searchController.searchBar.resignFirstResponder()
self.searchController.searchBar.endEditing(true)
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let tabBarIndex = tabBarController.selectedIndex
if tabBarIndex == 0 {
let indexPath = IndexPath(row: 0, section: 0)
let navigVC = viewController as? UINavigationController
let finalVC = navigVC?.viewControllers[0] as? BarsViewController
finalVC?.tableView.scrollToRow(at: indexPath as IndexPath, at: .top, animated: true)
}
}
}
TabBarController.Swift 代码(代码不起作用):
import UIKit
class TabBarController: UITabBarController,UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
guard let viewControllers = viewControllers else { return false }
if viewController == viewControllers[selectedIndex] {
if let nav = viewController as? UINavigationController {
guard let topController = nav.viewControllers.last else { return true }
if !topController.isScrolledToTop {
topController.scrollToTop()
return false
} else {
nav.popViewController(animated: true)
}
return true
}
}
return true
}
}
extension UIViewController {
func scrollToTop() {
func scrollToTop(view: UIView?) {
guard let view = view else { return }
switch view {
case let scrollView as UIScrollView:
if scrollView.scrollsToTop == true {
scrollView.setContentOffset(CGPoint(x: 0.0, y: -scrollView.contentInset.top), animated: true)
return
}
default:
break
}
for subView in view.subviews {
scrollToTop(view: subView)
}
}
scrollToTop(view: view)
}
var isScrolledToTop: Bool {
for subView in view.subviews {
if let scrollView = subView as? UIScrollView {
return (scrollView.contentOffset.y == 0)
}
}
return true
}
}
【问题讨论】:
-
好的,请稍等......
-
我更新并添加了我认为相关的内容,如果你想要我可以添加的所有代码,请告诉我......@AntonBelousov
-
您没有在任何地方设置委托。你需要在
viewDidLoad做:delegate = self -
另外,在情节提要中,标签栏控制器的类设置为
TabBarController? -
是的,它在情节提要中连接到该类。
标签: ios swift uitableview scrolltop uitabbaritem