swift - UITabBarController 总是在 UIViewController 的顶部打开页面
问题描述
UIViewController
我最近在我的代码中实现了一种通过点击图标UITabBar
两次滚动到顶部的方法。该代码位于我的UITabBarController
代码中。它工作得很好,但是我发现不幸的副作用是每次我在我的应用程序上打开一个页面时,它现在位于顶部UIViewController
而不是我上次离开的地方。我确定这段代码的某处有错误
import UIKit
class TabViewController: UITabBarController, UITabBarControllerDelegate {
var pressedCount: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
// Do any additional setup after loading the view.
}
@IBAction func unwindToMain(segue: UIStoryboardSegue) {}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
pressedCount += 1
if pressedCount > 1 {
scrollToTop()
} else {
//do something for first press
}
print("Selected item")
}
// UITabBarControllerDelegate
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
print("Selected view controller")
}
func tabBarController(_ TabViewController: 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 {
if self is UITableViewController {
return (self as! UITableViewController).tableView.contentOffset.y == 0
}
for subView in view.subviews {
if let scrollView = subView as? UIScrollView {
return (scrollView.contentOffset.y == 0)
}
}
return true
}
}
解决方案
问题是,当您的ViewController消失时,它的pressedCount
属性仍然设置为 2
所以要viewWillAppear
添加这一行来重置它:
pressedCount = 0
还修复了 tabBar 项中的 if 语句以在用户每次按下 tabBar 项两次时didSelect
重置pressedCount
if pressedCount > 1 {
scrollToTop()
pressedCount = 0
} else {
//do something for first press
}
推荐阅读
- algorithm - 对一组对象及其属性进行递归分组的最小组数
- mongodb - Mongoengine FlaskRestful:如何更新嵌入文档的特定字段?
- ios - self.navigationController 在从 UINavigationController 推送的 ViewController 中返回 nil
- r - R中的提取函数为堆叠和单个栅格提供不同的结果
- .net - Asp .net Web 应用程序没有创建通常包含引导和 jquery 脚本的脚本文件夹
- drone - 无法增加超时或将自己添加为管理员
- python - Pandas 更新:如何排除更新 df 中某些值的更新?
- google-apps-script - 为某些用户发布谷歌编辑器插件的过程?
- python - 如何正确索引时间(IndexError 问题)?
- python - 为发布目的增加图像 dpi