2016-05-09 34 views
4

与双击顶部的UITableView我想模拟在他们的名单Twitter或Instagram的行为:滚动上UITabBarItem

当UITabBarItem双击,在列表中滚动到顶部。有人知道我该怎么做? 我有我的UITabBarController中的4个项目,他们都是列表,所以我想为所有人做这件事。

问题是当我在mi列表的推视图中点击栏项时,此函数在获取导航的根视图控制器之前调用并检测双击。

我希望能清楚我的问题。

var previousController: UIViewController? 

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { 
    if previousController == viewController{ 
     if let navVC = viewController as? UINavigationController, vc = navVC.viewControllers.first as? HomeViewController { 
      vc.tableBusinessList.setContentOffset(CGPointZero, animated: true) 
      print("same") 
     } 
    }else{ 
     print("No same") 
    } 
    previousController = viewController 
} 

该行为是不正确的。 当我弹出与标签栏项目视图,根视图是对细胞0

enter image description here

+0

哦,我明白了!我会看看是否可以稍后回答。对不起 –

+0

真的很感谢@OlivierWilkinson,对不起我的问题不清楚。 – Dasoga

+0

@OlivierWilkinson我添加了一个gif向你展示我的实际行为 – Dasoga

回答

9

好了,所以我认为,最好的方法是检查你的tableView的的viewController是可见的,如果它不是,那么不要调用设置内容抵消。

所以:

var previousController: UIViewController? 

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { 
    if previousController == viewController { 
     if let navVC = viewController as? UINavigationController, vc = navVC.viewControllers.first as? HomeViewController { 

      if vc.isViewLoaded() && (vc.view.window != nil) { 
       // viewController is visible 
       vc.tableBusinessList.setContentOffset(CGPointZero, animated: true) 
      } 

      print("same") 
     } 
    }else{ 
     print("No same") 
    } 

    previousController = viewController 

} 
+0

嘿!感谢您的答案,它的作品!如果vc.isViewLoaded()&&(vc.view.window!= nil)' 那就是它!“第三条if语句'真的非常感谢您的帮助。 – Dasoga

+0

完全没问题!我很高兴我可以帮助:) –

+0

我会编辑我的答案,使其正确无误,欢呼的头! –

1

斯威夫特3

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; 
    } 

注:我用@Olivier威尔金森,并展示如何在使用需要使用扩展的地方离子的滚动到顶部。 (测试收集视图)