Я хочу реализовать функцию прокрутки, такую как приложение Facebook, где нажмите на элемент панели вкладок при прокрутке страницы вниз и нажмите на тот же элемент панели вкладок, который начинает прокручиваться сверху.
Вот мой код -
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
let indexOfTab = tabBar.items?.index(of: item)
if indexOfTab == 0{
let feed = HomeFeedViewController()
feed.scrollToTop()
print("pressed tabBar: \(String(describing: indexOfTab))")
}else if indexOfTab == 1{
print("pressed tabBar: \(String(describing: indexOfTab))")
}else if indexOfTab == 2{
print("pressed tabBar: \(String(describing: indexOfTab))")
}else if indexOfTab == 3{
let feed = QueueViewController()
print("pressed tabBar: \(String(describing: indexOfTab))")
}else if indexOfTab == 4{
print("pressed tabBar: \(String(describing: indexOfTab))")
}
}
func scrollToTop(){
feedsTableView.setContentOffset(.zero, animated: true)
}
Пожалуйста, попробуйте мой код
var canScrollToTop:Bool = true
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
// Allows scrolling to top on second tab bar click
if (viewController.isKindOfClass(CustomNavigationBarClass) && tabBarController.selectedIndex == 0) {
if (viewControllerRef!.canScrollToTop) {
viewControllerRef!.scrollToTop()
}
}
}
// Scrolls to top
func scrollToTop() {
self.View.setContentOffset(CGPoint.zero, animated: true)
self.tblView.setContentOffset(CGPoint.zero, animated: true)
self.collView.setContentOffset(CGPoint.zero, animated: true)
}
// Called when the view becomes available
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
canScrollToTop = true
}
// Called when the view becomes unavailable
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
canScrollToTop = false
}
Для Свифта
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: self.view)
}
}
Использовать
var previousController: UIViewController?
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
//when user is in FeedViewController and scroll at last record and want to
if previousController == viewController {
if let navVC = viewController as? UINavigationController, let vc = navVC.viewControllers.first as? HomeViewController {
if vc.isViewLoaded && (vc.view.window != nil) {
vc.scrollToTop()
}
print("same")
}
}
else{
print("No same")
}
previousController = viewController
return true;
}
Я делаю отдельный класс для контроллера tabBarr и доступа в HomeFeedViewController. Итак, где писать этот код
реализовать этот метод делегата для отдельного класса для контроллера tabBarr и проверить.
Вам нужно нажать дважды, если нажмите еще раз, и он напечатает «то же самое» в журнале, в то время он поднимется. попробуй отладить твой случай
Мой tableview не будет получать доступ, всегда получаю нулевые значения при нажатии несколько раз
В моем tableview есть 7 пользовательских ячеек, когда я нажимаю на кнопку первой панели вкладок, затем происходит сбой из-за неожиданного значения nil для tableview.
попробуйте указать коды, по которым мы можем предложить