点击标签栏滚动到UITableViewController的顶部并不总是有效

时间:2015-01-24 05:39:51

标签: ios uitableview swift uitabbarcontroller

我正在尝试实现代码,当我点击已经选中的标签栏项时,我的tableview将滚动到第一行。我通过查看其他堆栈溢出答案,大部分时间都可以使用此功能;但是,我注意到一种奇怪的行为。出于某种原因,如果我从不首先取消选择选项卡,则代码不起作用。

例如,当我第一次加载应用程序时,选择了选项卡0。如果我向下滚动并再次点击标签0,它不会滚动到顶部。但是,如果我选择选项卡1然后选择选项卡0,然后继续向下滚动并再次按下选项卡0,它会向上滚动。为什么第一次选择选项卡时我的代码不起作用?

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
  if viewController is UINavigationController {
    if navigationController == viewController {
      let topIndexPath = NSIndexPath(forRow: 0, inSection: 0)
      tableView.scrollToRowAtIndexPath(topIndexPath, atScrollPosition: .Top, animated: true)
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我不了解您当前实现的所有内容,但您可以通过覆盖负责选项卡选择的UITabBarControllerDelegate方法来检查当前所选视图控制器和将随后选择的视图控制器的相等性。

这是部分解决方案;

@interface AppDelegate () <UITabBarControllerDelegate>

@property (nonatomic, weak) UIViewController *previousViewController;

@end


@implementation AppDelegate 

 - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{
    self.previousViewController = tabBarController.selectedViewController;
    return YES;
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (self.previousViewController == viewController) {
        [viewController.tableView setContentOffset:CGPointZero animated:YES];
    }
}

@end

希望这有帮助。