我遇到了很多人已经报告过的问题,didSelectViewController
不会被调用,但就我而言,有时会被调用。我有三个选项卡和三个视图控制器。每次用户按下第二个或第三个选项卡时,我都需要执行一些代码。在我的 SecondViewController 和 ThirdViewController 中,我有:
UITabBarController *tabBarController = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController;
[tabBarController setDelegate:self];
现在,SecondViewController 一切正常,didSelectViewController
每次按下第二个选项卡时都会被调用。也在第三个 ViewController 中didSelectViewController
每次按下第三个选项卡时都会调用,但仅当同时未按下第二个栏时才会调用。因此,当我在 FirstViewController 和 ThirdViewController 之间来回切换时,一切正常。但是当我采用第一->第二->第三这样的模式时,那么didSelectViewController
不会在第三个 ViewController 中被调用。另外,当我像第一->第三->第二->第三时didSelectViewController
第一次在 Third ViewController 中被调用,但第二次则不会。有任何想法吗?
很难理解你到底在做什么,但据我了解,你是通过更改选项卡开关来响应的UITabBarController
的代表来回SecondViewController
and ThirdViewController
.
如果这是真的,我建议不要这样做。相反,我建议您尝试以下操作:
- 分配一个永不改变的委托。首先,您可以使用您的应用程序委托,但如果您有一个专门的小班来做这件事可能会更好。我确信现在你有一个不变的委托,它将获得 100% 的所有调用
tabBarController: didSelectViewController:
.
- 作为委托的对象必须具有对这两个对象的引用
SecondViewController
and ThirdViewController
实例。如果您使用 Interface Builder 设计 UI,您可以通过添加两个IBOutlet
s 到委托类并将适当的实例连接到插座。
- 现在当代表收到
tabBarController: didSelectViewController:
它可以简单地将通知转发到SecondViewController
or 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];
}
EDIT
有关如何将上面的示例代码集成到您的项目中的一些提示:
- 添加一个实例
TabBarControllerDelegate
到还包含以下内容的 .xib 文件TabBarController
- 连接
delegate
的出口TabBarController
' 到TabBarControllerDelegate
实例
- 连接
secondViewController
的出口TabBarControllerDelegate
to the SecondViewController
实例
- 连接
thirdViewController
的出口TabBarControllerDelegate
to the ThirdViewController
实例
- 添加一个方法
- (void) doSomething
to SecondViewController
- 添加一个方法
- (void) doSomethingElse
to ThirdViewController
- 确保您没有留下任何代码
SecondViewController
and ThirdViewController
改变了TabBarController
代表!
一旦一切准备就绪并且一切正常,您可能需要进行一些清理:
- 更改通知方法的名称
doSomething
and doSomethingElse
做一些更明智的事情
- 如果您关注评论中的讨论,也许您也想摆脱
secondViewController
and thirdViewController
outlets
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)