我遇到了一个非常奇怪的问题。我创建了自己的UITabBarController来自定义它并且它工作得很好......除了模态视图。当我用动画关闭模态视图(来自UITabBarController的present / dismiss)时,它等待动画完成并转到标签栏的第一个控制器!
为什么控制器会改变?我该如何解决?
由于
PS:我的UITabBarController视图位于主窗口上,上面有一个UITabBar。控制器(由标签栏管理)位于标签栏控制器视图上方的主窗口上,高度较短。当我呈现模态视图时,我将标签栏控制器视图置于前面。
答案 0 :(得分:1)
在阅读了我对第一个答案的评论之后,我更了解你在做什么,虽然在没有看到代码的情况下弄清楚出了什么问题是非常困难的。我创建了另一个带有自定义标签栏控制器的项目(从UIViewController
继承),其中一个标签视图有一个按钮,用于显示模态视图控制器。当我关闭模态视图时,它会返回到我所在的选项卡。
在您的问题中,您说由标签栏管理的视图控制器位于主窗口上,当您显示模式视图时,您将标签栏控制器视图置于前面。这对我没有意义。
对于我的示例,我使CustomTabBarController
成为UIViewController
的子类,并为具有两个标签栏项和两个视图控制器的标签栏创建了实例变量。我添加了标签栏和成员视图控制器的两个视图作为CustomTabBarController
视图的子视图(我设置了视图控制器视图的框架,因此它们不与标签栏重叠)。我还将CustomTabBarController
设置为标签栏的代理。选择标签栏项目后,我将消息bringSubviewToFront:
发送到CustomTabBarController
的视图,并以相应的子视图作为参数。
其中一个成员视图控制器视图有一个按钮,在点击时会显示模态视图。当点击按钮时,视图控制器可以调用presentModalViewController:
但是,因为你说你的标签栏控制器正在这样做,我在视图控制器中有一个IBAction方法(这是显示模式的按钮的目标)视图)调用CustomTabBarController
中调用presentModalViewController:
的方法。视图控制器具有CustomTabBarController
的ivar(因为视图控制器属于CustomTabBarController
,这很容易设置)。
模态视图控制器类也有一个CustomTabBarController
的ivar(我在调用presentModalViewController:
之前设置它)并且我在模态视图中有一个关闭模态视图的按钮。该按钮连接到模态视图控制器类中的IBAction,然后调用CustomTabBarController
中的方法。
当我这样做时,一切都按预期工作。我确定你有理由创建一个自定义标签栏控制器,但我怀疑它是否真的有必要。我希望这会有所帮助。
答案 1 :(得分:0)
我有一些问题:
1)当你说“创建我自己的UITabBarController”时你的意思是你将UITabBarController子类化了吗?
2)如何调用模态视图控制器?是否有一个按钮或被点击的东西,它会调用以呈现模态视图控制器?
您说控制器“在主窗口上”,并且当您呈现模态视图时,您“将标签栏控制器视图置于前面”。这让我很困惑。视图控制器应“属于”标签栏控制器。
我创建了一个小项目,让它对我有用,所以这就是我所做的:
1)我创建了UITabBarController的子类:
@interface MyTabBarController : UITabBarController
{
}
- (IBAction)presentModalView:(id)sender;
- (void)dismissModalview;
@end
@implementation MyTabBarController
- (IBAction)presentModalView:(id)sender
{
MyModalViewController* myModalView = [[MyModalViewController alloc] initWithNibName:@"ModalView" bundle:nil];
[myModalView setTbc:self];
[self presentModalViewController:myModalView animated:YES];
}
- (void)dismissModalview;
{
[self dismissModalViewControllerAnimated:YES];
}
@end
2)然后,对于我的模态视图控制器,我创建了一个UIViewController的子类:
@interface MyModalViewController : UIViewController
{
MyTabBarController* tbc;
}
@property (retain) MyTabBarController* tbc;
- (IBAction)returnToTabBar:(id)sender;
@end
@implementation MyModalViewController
@synthesize tbc;
- (IBAction)returnToTabBar:(id)sender;
{
[tbc dismissModalview];
}
@end
3)我将标签栏控制器拖入MainWindow.xib,将其文件所有者设置为MyTabBarController,并将视图控制器添加到两个标签(我使用检查器将每个标签的背景颜色设置为不同的颜色)。在第二个选项卡的视图控制器中,我添加了一个按钮,并将其目标设置为MyTabBarController中的操作“presentModalView:”。
4)我创建了一个新的xib,它包含一个名为ModalView的视图,并将其File的Owner设置为MyModalViewController。我将视图的背景颜色设置为与上面两个颜色不同的颜色,并在视图中添加了一个按钮。我将按钮的目标设置为MyModalviewController中的动作“returnToTabBar:”。
显然,我必须将标签栏视图添加到app delegate中的窗口子视图中。当我在第二个选项卡上时,这对我有用,并提供了一个模态视图控制器,当我解除它时,我被返回到标签栏控制器中的第二个选项卡。
我希望这有帮助!
答案 2 :(得分:0)
我怀疑你在viewDidLoad
做了很多(太多?)初始化工作,其中一个就是选择第一个标签?
也许您可以在自定义Tab栏控制器类中与我们分享init / load的顺序?
显示模态视图时,您的标签栏控制器视图可能正在卸载,并在模式被解除时重新加载(调用viewDidLoad
)。
我的建议是在制表符切换和视图加载方法中设置一些调试器断点,并检查调用堆栈以确保Tab栏控制器的生命周期符合您的理解。