如何禁用/启用特定的UITabBar项,

时间:2014-04-09 16:44:07

标签: ios objective-c uitabbarcontroller uitabbaritem

我的UITabbarController中有3个标签,是我在Appdelegate中创建的。

当我打开应用程序时,我已将选定的tabbarItem作为第三个tabbarItem。

用户只能在登录时选择索引0处的UITabBarItem

我试图限制用户在TabBarItem_0时转到TabBarItem_2。 但没有任何效果。我用了

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{

}

但它没有按照我的意愿工作。我检查了stackoverflow,发现了几乎相同的问题,在那里我找到了这个委托。但这并不适合我。我用谷歌搜索,但除了stackoverflows链接之外无法找到任何解决方案,这次没有帮助。

点击禁用的TabBar项目,我必须弹出一个弹出窗口。我该如何实现呢?

6 个答案:

答案 0 :(得分:15)

尝试这样的事情,

 - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController; 
{    
       if (tabBarController.selectedIndex == 0) {
            if(isUserLoggedIn)
                return YES;
            else
                return NO;
        }

        return YES; 
}

如果这不起作用,

在app delegate

中创建栏栏后添加此项
[[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:FALSE];

登录后再次启用

[[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:TRUE];

答案 1 :(得分:6)

这就是我在Swift 2.1中所做的:

public class BaseActivity extends AppCompatActivity {

    protected MyApp application;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        application = (MyApp) getApplication();

        if (application.getAuth() == null || !application.getAuth().isLoggedIn()) {

            startActivity(new Intent(this, LoginActivity.class));
            finish();
            return;
        }

    }        
}

答案 2 :(得分:6)

当我点击标签栏项目时,我常常在当前视图的顶部显示弹出窗口。

在TabBarViewController类中,实现UITabBarControllerDelegate并记住设置self.delegate = self

之后

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    if viewController.title == "Unique_title" //set an unique title for the view controller in storyboard or the view controller class.
    {
        performSegueWithIdentifier("YourModalViewIdentifier", sender: nil)
        return false
    } else {
        return true
    }
}

这应该可以帮助您在uitabbaritem上收到点击时显示模态视图。我知道使用title作为唯一标识符是不好的做法,但只是快速解决方案来实现你想要的。

希望有所帮助。

答案 3 :(得分:4)

您可以在代码中执行此操作

- (void)viewDidLoad {
    ...
    [self checkLogin];
    ...
}

- (void)checkLogin {
    if (!loggedIn) {
        [[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:NO];
    } else {
        [[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:YES];
    }
}

- (void)tapLogin {
  // Do the login action
}

- (void)processLoginResult {
  // Process the result of the login action
  // If the result is success, set 'loggedIn = YES'
  // Otherwise, set 'loggedIn = NO'
  ...
  [self checkLogin];
  ...
}

答案 4 :(得分:3)

如果您想使用故事板,只需在目标视图控制器场景中选择TabBarItem,并取消选中Enabled框。

答案 5 :(得分:0)

以下是在 Swift 3和4

中禁用标签栏项目的方法
tabBarController.tabBar.items![0].isEnabled = false