为了启动并运行我的自定义菜单,我最终使用了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,毫无疑问该方法被调用并且所有代码都运行。
答案 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]];
这将获得嵌入式标签栏控制器,我只需直接从原始视图控制器更改按钮来自的按钮。
它可能不是一个智能解决方案,但它是一个简单而实用的解决方案,不会产生任何问题。