我遇到许多已经报道的问题,didSelectViewController
没有被调用,但在我的情况下,它有时会被调用。我有三个选项卡和三个视图控制器。每次用户按下第二个或第三个选项卡时,我都需要执行一些代码。在我的SecondViewController和ThirdViewController中,我有:
UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
[tabBarController setDelegate:self];
现在一切正常,使用SecondViewController,每次按下第二个选项卡时都会调用didSelectViewController
。同样在ThirdViewController中didSelectViewController
每次按下第三个选项卡时都会被调用,但仅在没有按下第二个选项卡的情况下被调用。所以当我在FirstViewController和ThirdViewController之间来回切换时,一切正常。但是当我进入第一个> second->第三个模式时,didSelectViewController
不会在ThirdViewController中被调用。此外,当我第一次去>第三次>第二次>第三次didSelectViewController
第一次在第三次调用时被调用,而不是第二次。有什么想法吗?
答案 0 :(得分:5)
我也有这个问题并且厌倦了它。我决定继承UITabBarController
并覆盖以下方法。我之所以这样做的原因是因为某些原因导致应用程序启动setSelectedViewController:
没有被调用。
- (void)setSelectedIndex:(NSUInteger)selectedIndex
{
[super setSelectedIndex:selectedIndex];
// my code
}
- (void)setSelectedViewController:(UIViewController *)selectedViewController
{
[super setSelectedViewController:selectedViewController];
// my code
}
答案 1 :(得分:5)
很难理解你到底在做什么,但据我所知,你通过在UITabBarController
和SecondViewController
之间来回更改ThirdViewController
的委托来回应制表符开关
如果这是真的,我建议不要这样做。相反,我建议你尝试以下方法:
tabBarController: didSelectViewController:
所有电话的100%。SecondViewController
和ThirdViewController
个实例。如果您使用Interface Builder设计UI,则可以通过向委托类添加两个IBOutlet
并将相应的实例连接到出口来实现此目的。tabBarController: didSelectViewController:
时,它可以简单地将通知转发到SecondViewController
或ThirdViewController
,具体取决于所选的标签。基本代码示例:
// TabBarControllerDelegate.h file
@interface TabBarControllerDelegate : NSObject <UITabBarControllerDelegate>
{
}
@property(nonatomic, retain) IBOutlet SecondViewController* secondViewController;
@property(nonatomic, retain) IBOutlet ThirdViewController* thirdViewController;
// TabBarControllerDelegate.m file
- (void) tabBarController:(UITabBarController*)tabBarController didSelectViewController:(UIViewController*)viewController
{
if (viewController == self.secondViewController)
[self.secondViewController doSomething];
else if (viewController == self.thirdViewController)
[self.thirdViewController doSomethingElse];
}
修改强>
有关如何将上面的示例代码集成到项目中的一些提示:
TabBarControllerDelegate
的实例添加到同时包含TabBarController
delegate
'的TabBarController
出口连接到TabBarControllerDelegate
实例secondViewController
的{{1}}出口连接到TabBarControllerDelegate
实例SecondViewController
的{{1}}出口连接到thirdViewController
实例TabBarControllerDelegate
ThirdViewController
- (void) doSomething
SecondViewController
- (void) doSomethingElse
和ThirdViewController
中没有任何代码更改SecondViewController
代表!一旦你完成所有工作并且一切正常,你可能想要清理一下:
ThirdViewController
和TabBarController
的名称更改为更明智的内容doSomething
和doSomethingElse
个网点答案 2 :(得分:0)
我只是在故事板上挖掘this tutorial,我想到了使用UITabBarControllerDelegate
的替代方案。如果你想坚持UITabBarControllerDelegate
,那么请随意忽略这个答案。
首先,创建一个UITabBarController
的子类,让我们称之为MyTabBarController
。在故事板编辑器中,您需要更改选项卡栏控制器的“类”属性,以便故事板能够选择新的类。
将此代码添加到MyTabBarController.m
- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"SecondVC"])
{
SecondViewController* secondViewController = (SecondViewController*)segue.destinationViewController;
[secondViewController doSomething];
}
else if ([segue.identifier isEqualToString:@"ThirdVC"])
{
ThirdViewController* thirdViewController = (ThirdViewController*)segue.destinationViewController;
[thirdViewController doSomethingElse];
}
}
在情节提要编辑器中,您现在可以选择连接到SecondViewController
和ThirdViewController
的两个segue,并将segue标识符分别更改为“SecondVC”和“ThirdVC”。
如果我没有记错的话,那就是你需要做的一切。