iPhone - 通过UITabBarController关闭模态视图

时间:2010-04-26 22:44:43

标签: iphone objective-c dismiss modal-view

我遇到了一个非常奇怪的问题。我创建了自己的UITabBarController来自定义它并且它工作得很好......除了模态视图。当我用动画关闭模态视图(来自UITabBarController的present / dismiss)时,它等待动画完成并转到标签栏的第一个控制器!

为什么控制器会改变?我该如何解决?

由于

PS:我的UITabBarController视图位于主窗口上,上面有一个UITabBar。控制器(由标签栏管理)位于标签栏控制器视图上方的主窗口上,高度较短。当我呈现模态视图时,我将标签栏控制器视图置于前面。

3 个答案:

答案 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栏控制器的生命周期符合您的理解。