2

ルートビューコントローラーとしてUIViewControllerを使用してナビゲーションコントローラーに接続されているタブバーアイテムがあります。タブバー項目を最初にタッチすると、そのビューに切り替わります。2番目のタッチがルートビューコントローラにポップします。3回目のタッチは上にスクロールしません。

他のアプリでこのスクロールからトップへの動作を見たことがありますが、Webを検索した後、それについて何もわかりません。

これは、タブバーアイテムに添付されたスクロールビューまたはテーブルビューのデフォルトの動作ですか、それとも自分で実装する必要がありますか?

4

4 に答える 4

3

これは古い質問だと思いますが、この動作を作成することも検討しており、より簡単な解決策があると思います。

まず、AppDelegateをのデリゲートに設定しますUITabBarController。次に、このメソッドを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;
}

これは、タブがルートビューとしてaまたはを指している場合に機能しUITableViewController、影響を受けるものを区別したり、通知を送信したりすることなどを心配する必要はありません。UINavigationControllerUITableViewControllerUITableViewController

于 2014-07-23T18:26:07.983 に答える
2

タブバーがクリックされたときにテーブルビューの一番上までスクロールするソリューションは次のとおりです

AppDelegateでタブバーデリゲートを設定します

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

HomeViewController.mで、ビューは通知をリッスンしました

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

リフレッシュ方法

 -(void)refreshView:(NSNotification *) notification{
        if (self == self.navigationController.topViewController)
            [self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
    }
于 2013-07-08T06:39:46.357 に答える
1

いいえ、これはデフォルトの動作ではありません。自分で実装する必要があります。

これを行うには、アプリケーションにタブバーコントローラーのデリゲートを委任させ、-tabBarController:didSelectViewController:を実装して通知を投稿します。テーブルビューコントローラでその通知をリッスンし、次のようにします。

if (self == self.navigationController.topViewController)
    [self.tableView scrollToTop];
于 2012-05-31T19:47:06.040 に答える
0

タブコントローラには1つのデリゲートしか持てないため、KVOを使用してタップをリッスンする方法を説明しているこの質問への回答を確認することをお勧めします。

于 2013-07-08T06:45:14.033 に答える