【问题标题】:UITabBarController - how to make "no tabs" selected at start up?UITabBarController - 如何在启动时选择“无标签”?
【发布时间】:2010-10-17 06:41:55
【问题描述】:

iPhone 中是否有任何方法可以取消选择 UITabBarController 的所有选项卡?即,我的应用程序有一个“主页”,它不属于下面显示的标签栏上的任何标签。现在,当用户触摸标签栏上的任何标签时,我想加载相应的标签。这可能吗 ?我已经试过了:

self.tabBarController.tabBarItem.enabled = NO; self.tabBarController.selectedIndex = -1;

但这无济于事。还有其他解决方案吗?请问?

【问题讨论】:

标签: iphone objective-c uitabbarcontroller


【解决方案1】:

我已经使用KVO 技巧成功地完成了这项工作。

这个想法很简单:当 UITabBarController 尝试设置其 selectedViewController 属性时,我们会追踪并立即将其设置回 nil。

示例代码:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Create the view controller which will be displayed after application startup
    mHomeViewController = [[HomeViewController alloc] initWithNibName:nil bundle:nil];

    [tabBarController.view addSubview:mHomeViewController.view];
    tabBarController.delegate = self;
    [tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL];

    // further initialization ...
}

// This method detects if user taps on one of the tabs and removes our "Home" view controller from the screen.
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if (!mAllowSelectTab)
    {
        [mHomeViewController.view removeFromSuperview];
        mAllowSelectTab = YES;
    }

    return YES;
}

// Here we detect if UITabBarController wants to select one of the tabs and set back to unselected.
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (!mAllowSelectTab)
    {
        if (object == tabBarController && [keyPath isEqualToString:@"selectedViewController"])
        {
            NSNumber *changeKind = [change objectForKey:NSKeyValueChangeKindKey];

            if ([changeKind intValue] == NSKeyValueChangeSetting)
            {
                NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey];

                if ([newValue class] != [NSNull class])
                {
                    tabBarController.selectedViewController = nil;
                }
            }
        }
    }
}

但是,有一点需要注意:tabbar 中的第一个视图控制器仍然会被加载(虽然时间很短),所以它的 viewDidLoad 和 viewWillAppear 将在启动后被调用。您可能需要添加一些逻辑来防止您可能在这些函数中执行的某些初始化,直到由于用户点击而“真实”显示该控制器(例如使用全局变量或 NSNotificationCenter)。

【讨论】:

  • 首先,很抱歉这么晚才回复。你拯救了我的一天。我一直在到处寻找合适的解决方案!它可以工作,而且效果很好。但我只有一个疑问,我尝试在代码中直接将 selectedViewController 设置为 nil (没有观察者方法),它从来没有工作过。你猜为什么会这样?你能解释一下观察者方法吗?大体看懂了,一行一行没看懂……
【解决方案2】:

显示未选择标签的标签栏会破坏用户体验。标签栏应始终选择一个元素并显示适当的页面 - 其他一切都令人困惑。

因此,如果您需要显示其他内容,则应将其设置为可以关闭的弹出框(即底部的滑动表)。

【讨论】:

  • 我同意。但我的客户想要这个!期望显示一个“主页”(单独的视图控制器)和一个标签栏,没有选择标签。当用户单击任何选项卡时,必须加载相应的视图控制器。即,主页必须是不属于任何选项卡的视图控制器?有任何想法吗 ?请帮忙?
  • 我不知道这是否会被应用商店接受,即使你让它工作。为什么不尝试在启动时在 TabControllerView 上方添加一个视图?
  • 在 iPad 上查看 Youtube 应用的搜索部分。 (如果你还有 iOS5 的话)
  • iPhone 上 iOS6 上的应用商店本身将呈现一个视图,显示选项卡栏,其中所有项目都被选中。
  • @kylef 好吧,这个答案已经有两年历史了。 :) 我认为 AppStore 有时会选择一个,而不是全部 - 但我现在根本无法重现它。也许现在已经修好了,我记得当我遇到这种情况时感到“惊讶和迷失方向”,因为我有点迷失在导航中。
【解决方案3】:

您可以将UITabBar 添加到您的视图控制器并通过UITabBarDelegate 从那里手动管理按钮。您的视图控制器将是“基本”视图,例如主页。

这相对容易做到,除非您想要UITabBarController 提供的特殊“更多...”视图控制器,您必须自己实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2015-09-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多