gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:15 26 4
gpt4 key购买 nike

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

UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
[tabBarController setDelegate:self];

现在 SecondViewController 一切正常,每次按下第二个选项卡时都会调用 didSelectViewController。同样在 ThirdViewController 中,每次按下第三个选项卡时都会调用 didSelectViewController,但仅在同时未按下第二个栏时调用。因此,当我在 FirstViewController 和 ThirdViewController 之间来回切换时,一切正常。但是当我进入像 first->second->third 这样的模式时,didSelectViewController 不会在 ThirdViewController 中被调用。此外,当我像 first->third->second->third didSelectViewController 一样第一次在 ThirdViewController 中被调用时,但不是第二次。有什么想法吗?

最佳答案

很难理解您到底在做什么,但据我了解,您是通过在 SecondViewController 之间来回更改 UITabBarController 的委托(delegate)来响应选项卡切换和 ThirdViewController

如果这是真的,我建议不要这样做。相反,我建议您尝试以下操作:

  • 分配一个永不改变的代表。一开始你可以使用你的应用委托(delegate),但如果你有一个专门的小类可能会更好。我确信现在您有一个不变的委托(delegate),它将获得对 tabBarController: didSelectViewController: 的所有调用的 100%。
  • 作为委托(delegate)的对象必须引用 SecondViewControllerThirdViewController 实例。如果您使用 Interface Builder 设计 UI,您可以通过向委托(delegate)类添加两个 IBOutlet 并将适当的实例连接到 socket 来实现。
  • 现在,当委托(delegate)收到 tabBarController: didSelectViewController: 时,它可以简单地将通知转发给 SecondViewControllerThirdViewController,具体取决于选项卡被选中。

基本代码示例:

// 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 的 .xib 文件中
  • TabBarControllerdelegate 导出连接到 TabBarControllerDelegate 实例
  • TabBarControllerDelegatesecondViewController 导出连接到 SecondViewController 实例
  • TabBarControllerDelegatethirdViewController 导出连接到 ThirdViewController 实例
  • 添加方法 - (void) doSomethingSecondViewController
  • 添加方法 - (void) doSomethingElseThirdViewController
  • 确保 SecondViewControllerThirdViewController 中没有任何代码会更改 TabBarController 委托(delegate)!

一旦一切就绪并且一切正常,您可能需要稍微清理一下:

  • 将通知方法 doSomethingdoSomethingElse 的名称更改为更合理的名称
  • 如果您关注了评论中的讨论,也许您还想摆脱 secondViewControllerthirdViewController socket

关于ios - didSelectViewController 在某些情况下不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17534330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com