didSelectViewController在某些情况下不会被调用

flo*_*wer 2 uitabbarcontroller ios

我有许多已经报告的问题,didSelectViewController没有被调用,但在我的情况下它有时被调用.我有三个选项卡和三个视图控制器.每次用户按下第二个或第三个选项卡时,我都需要执行一些代码.在我的SecondViewController和ThirdViewController中,我有:

UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
[tabBarController setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

现在一切正常,使用SecondViewController,didSelectViewController每次按下第二个选项卡时都会调用它.同样在ThirdViewController中didSelectViewController,每次按下第三个选项卡时都会调用它,但仅在第二个选项卡未被按下时才会被调用.所以当我在FirstViewController和ThirdViewController之间来回切换时,一切正常.但是当我进入第一个 - >第二个 - >第三个模式时,则didSelectViewController不会在ThirdViewController中调用.此外,当我第一次 - >第三次 - >第二次 - >第三次didSelectViewController在第三次调用时,第一次调用而不是第二次调用.有任何想法吗?

fel*_*iun 5

我也有这个问题并且厌倦了它.我决定子类化UITabBarController并覆盖以下方法.我之所以这样做的原因是由于某种原因,应用程序启动setSelectedViewController:时没有被调用.

- (void)setSelectedIndex:(NSUInteger)selectedIndex
{
    [super setSelectedIndex:selectedIndex];
    // my code
}

- (void)setSelectedViewController:(UIViewController *)selectedViewController
{
    [super setSelectedViewController:selectedViewController];
    // my code
}
Run Code Online (Sandbox Code Playgroud)


her*_*ube 5

很难跟着你在做什么,但是从我的理解,你是通过改变响应标签交换机UITabBarController的代表之间来回SecondViewControllerThirdViewController.

如果这是真的,我建议不要这样做.相反,我建议你尝试以下方法:

  • 分配永不改变的委托.首先,您可以使用您的应用程序委托,但如果您有专门的小类可能会更好.我相信现在你有一个不变的委托,它将获得所有电话的100%tabBarController: didSelectViewController:.
  • 作为委托的对象必须具有对SecondViewControllerThirdViewController实例的引用.如果您使用Interface Builder设计UI,则可以通过向IBOutlet委托类添加两个s并将适当的实例连接到出口来实现此目的.
  • 现在,当委托收到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];
}
Run Code Online (Sandbox Code Playgroud)

编辑

有关如何将上面的示例代码集成到项目中的一些提示:

  • 添加一个TabBarControllerDelegate也包含该.xib文件的.xib文件的实例TabBarController
  • 将' delegate插座TabBarController' 连接到TabBarControllerDelegate实例
  • 该连接secondViewController的插座TabBarControllerDelegateSecondViewController实例
  • 该连接thirdViewController的插座TabBarControllerDelegateThirdViewController实例
  • 添加一个方法- (void) doSomethingSecondViewController
  • 添加一个方法- (void) doSomethingElseThirdViewController
  • 确保您没有任何代码SecondViewControllerThirdViewController更改TabBarController代理!

一旦你完成所有设置并且一切正常,你可能想要清理一下:

  • 更改通知方法的名称,doSomething以及doSomethingElse更合理的方式
  • 如果你按照评论中的讨论,也许你也想摆脱secondViewControllerthirdViewController出口