0

我遇到了一个非常奇怪的问题。我创建了自己的 UITabBarController 来自定义它,它工作得很好……除了模态视图。当我用动画关闭模态视图(从 UITabBarController 呈现/关闭)时,它会等到动画完成并转到选项卡栏的第一个控制器!

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

谢谢

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

4

3 回答 3

1

在阅读了您对我的第一个答案的评论后,我更好地理解了您在做什么,尽管如果不看代码就很难弄清楚出了什么问题。我使用自定义选项卡栏控制器(从 子类化)创建了另一个项目,UIViewController其中一个选项卡式视图有一个显示模式视图控制器的按钮。当我关闭模式视图时,它会返回到我所在的选项卡。

在您的问题中,您说由选项卡栏管理的视图控制器位于主窗口上,并且当您呈现模态视图时,您将选项卡栏控制器视图置于前面。这对我来说没有意义。

在我的示例中,我为带有两个选项卡栏项和两个视图控制器的选项卡栏创建了CustomTabBarController一个子类并创建了实例变量。UIViewController我添加了标签栏和成员视图控制器的两个视图作为视图的子CustomTabBarController视图(我设置了视图控制器视图的框架,因此它们不会与标签栏重叠)。我还将 设置CustomTabBarController为标签栏的代表。当一个标签栏项目被选中时,我将消息发送bringSubviewToFront:CustomTabBarController' 的视图,并以适当的子视图作为参数。

成员视图控制器视图之一有一个按钮,当点击该按钮时,它会显示模态视图。视图控制器可以presentModalViewController:在点击按钮时调用,但是,因为你说你的标签栏控制器正在这样做,所以我在视图控制器中有一个 IBAction 方法(这是呈现模式视图的按钮的目标),它调用方法CustomTabBarController调用presentModalViewController:. 视图控制器有一个 ivar CustomTabBarController(因为视图控制器属于CustomTabBarController这个很容易设置)。

模态视图控制器类也有一个 ivar CustomTabBarController(我在调用之前设置了这个presentModalViewController:),并且我在模态视图中有一个按钮,可以关闭模​​态视图。该按钮连接到模态视图控制器类中的 IBAction,然后调用CustomTabBarController.

当我这样做时,一切都按预期工作。我确定您有创建自定义标签栏控制器的理由,但我怀疑它是否真的有必要。我希望这有帮助。

于 2010-04-28T22:05:59.240 回答
0

我怀疑您正在做很多(太多?)初始化工作,viewDidLoad其中之一是选择第一个选项卡?

也许您可以与我们分享您的自定义标签栏控制器类中的初始化/加载顺序?

您的选项卡栏控制器视图可能会在显示模式视图时卸载,并viewDidLoad在模式关闭时重新加载(调用)。

我的建议是在选项卡切换和视图加载方法处设置一些调试器断点,并检查调用堆栈以确保选项卡栏控制器的生命周期符合您的理解。

于 2010-07-12T16:19:51.190 回答
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's Owner 设置为 MyModalViewController。我将视图的背景颜色设置为与上述两种颜色不同的颜色,并在视图中添加了一个按钮。我将按钮的目标设置为 MyModalviewController 中的操作“returnToTabBar:”。

显然,我必须将标签栏视图添加到应用程序委托中窗口的子视图中。这对我有用,并在我在第二个选项卡上时呈现了一个模态视图控制器,当我关闭它时,我返回到选项卡栏控制器中的第二个选项卡。

我希望这有帮助!

于 2010-04-27T03:11:14.157 回答