Jeffery Thomas
Jeffery Thomas

Reputation: 42588

Tab bar item third touch for a table view not scrolling to the top

I have a tab bar item which is connected navigation controller with a UIViewController as the root view controller. The first touch on the tab bar item switches to that view. The second touch pops to the root view controller. The third touch does not scroll to the top.

I've seen this scroll-to-top behavior in other apps, but after searching the webs, I cannot find out anything about it.

Is this default behavior for scroll views or table views attached to tab bar items, or is it something I need to implement myself?

Upvotes: 2

Views: 1550

Answers (4)

Sean Mahan
Sean Mahan

Reputation: 478

I realize this is an older question, but I'm also looking to create this behavior, and I think I have a simpler solution.

First, set your AppDelegate to be the delegate for your UITabBarController. Then add this method to AppDelegate.m:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    if ([tabBarController.viewControllers objectAtIndex:tabBarController.selectedIndex]==viewController)
    {
        if ([viewController isKindOfClass:[UITableViewController class]])
        {
            [[(UITableViewController *)viewController tableView] setContentOffset:CGPointZero animated:YES];
        }
        else if ([viewController isKindOfClass:[UINavigationController class]])
        {
            UINavigationController *nav = (UINavigationController *)viewController;
            if ([nav.visibleViewController isKindOfClass:[UITableViewController class]])
                [[(UITableViewController *)nav.visibleViewController tableView] setContentOffset:CGPointZero animated:YES];
        }
    }

    return YES;
}

This works if your tab points at a UITableViewController or at a UINavigationController with a UITableViewController as the root view, and you don't have to worry about distinguishing between which UITableViewController is affected, sending notifications, etc.

Upvotes: 3

Simon
Simon

Reputation: 25983

Since your tab controller can only have one delegate, you may want to look at the answer to this question, which describes how to listen for the tap using KVO.

Upvotes: 0

vamsi575kg
vamsi575kg

Reputation: 604

Here is the solution to scroll to top of the table view when tab bar is clicked

In AppDelegate set tabbar delegate

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    if (tabBarController.selectedIndex == 0) {

        UINavigationController *selectedNav = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex];
        UIViewController *currentVC = selectedNav.visibleViewController;
        if([currentVC isMemberOfClass:NSClassFromString(@"HomeViewController")])
        {

            [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil];
        }
    }
    return YES;
}

In HomeViewController.m view did load listen for the notification

 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshView:)
                                                 name:@"refreshView"
                                               object:nil];

Refresh method

 -(void)refreshView:(NSNotification *) notification{
        if (self == self.navigationController.topViewController)
            [self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
    }

Upvotes: 2

hatfinch
hatfinch

Reputation: 3095

No, this isn't default behaviour, you have to implement it yourself.

I'd do it by making the application delegate the delegate of the tab bar controller, and implement -tabBarController:didSelectViewController: to post a notification. Listen for that notification in your table view controller and do something like:

if (self == self.navigationController.topViewController)
    [self.tableView scrollToTop];

Upvotes: 1

Related Questions