以编程方式选择TabBarController视图?

时间:2014-01-09 02:10:06

标签: ios objective-c uitabbarcontroller

为了启动并运行我的自定义菜单,我最终使用了UITabBarController,并且需要更改以编程方式显示的视图,而不是屏幕上的标准选项卡式菜单。

除了东西之外,一切都按预期工作。我试图使用:

[self setSelectedIndex:index];

此代码位于自定义委托方法中的UITabBarController子类中。 (这样我就可以在与菜单交互时以编程方式调整视图)。但是,在调用此代码时,它什么都不做?

是否必须从其中一个标签视图中调用它?我希望从TabBarController内部运行它,以避免重复每个选项卡式子控制器中的代码。

更新

发现使用[self setSelectedIndex:index];viewDidLoad中工作正常。但是当它在委托方法中调用时,它不会更改视图。它正在使用正确的索引号并被调用,但没有从该方法做任何事情。

此外,当我在self中记录viewDidLoad与我的委托方法时,标签控制器似乎是一个不同的对象。那么为什么我会丢失对原始控制器的引用呢?

它只是另一个视图控制器中容器中的UITabBarController。

委托代码:

@interface

@protocol SLMenuDelegate <NSObject>

@required -(void)menuDidChangeViewToIndex:(NSInteger)index;

@end

@property (nonatomic, assign) id<SLMenuDelegate>menuDelegate;

@implementation

@synthesize menuDelegate;

self.menuDelegate = [self.storyboard instantiateViewControllerWithIdentifier:@"TabBarViewController"];

[menuDelegate menuDidChangeViewToIndex:[self.menuItemButtons indexOfObject:sender]];

的UITabBarController

-(void)menuDidChangeViewToIndex:(NSInteger)index
{
    [self setSelectedIndex:index];
}

设置断点并运行NSLog,毫无疑问该方法被调用并且所有代码都运行。

2 个答案:

答案 0 :(得分:0)

尝试使用延迟效果:

 dispatch_async(dispatch_get_main_queue(), ^{
      [self setSelectedIndex:index];
 });

答案 1 :(得分:0)

我无法找到确切问题的解决方案,但我发现了一种解决我的问题的同样好方法。

我停止使用委托发送我的按钮点击消息并更改视图。相反,我做了以下事情:

SLTabBarViewController *tabBar = [self.childViewControllers objectAtIndex:0];
[tabBar setSelectedIndex:[self.menuItemButtons indexOfObject:sender]];

这将获得嵌入式标签栏控制器,我只需直接从原始视图控制器更改按钮来自的按钮。

它可能不是一个智能解决方案,但它是一个简单而实用的解决方案,不会产生任何问题。