我有一个标签栏项目,它连接了导航控制器和UIViewController作为根视图控制器。标签栏项目上的第一次触摸切换到该视图。第二个触摸弹出到根视图控制器。第三次触摸不滚动到顶部。
我在其他应用中看到过这种滚动到顶部的行为,但在搜索网络后,我找不到任何相关信息。
这是附加到标签栏项目的滚动视图或表视图的默认行为,还是我需要自己实现的?
答案 0 :(得分: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;
}
如果您的标签指向UITableViewController
或UINavigationController
且UITableViewController
作为根视图,则此方法有效,您无需担心区分哪个{{ 1}}受影响,发送通知等
答案 1 :(得分:2)
点击标签栏时滚动到表格视图顶部的解决方案
在AppDelegate中设置tabbar委托
- (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];
}
答案 2 :(得分:1)
不,这不是默认行为,您必须自己实现。
我通过让应用程序委托标签栏控制器的委托来实现它,并实现-tabBarController:didSelectViewController:发布通知。在表视图控制器中侦听该通知,并执行以下操作:
if (self == self.navigationController.topViewController)
[self.tableView scrollToTop];
答案 3 :(得分:0)
由于您的标签控制器只能有一个委托,您可能需要查看this question的答案,其中介绍了如何使用KVO监听点击。