在iPhone上使用一个视图调用选项卡式视图的最佳方法

在iPhone上使用一个视图调用选项卡式视图的最佳方法,iphone,objective-c,xcode,multiview,Iphone,Objective C,Xcode,Multiview,编辑让我简化这个问题:假设您的应用程序 两个视图,主视图和选项卡式视图 使用3个选项卡查看。主视图已显示 三个名为“Tab1”的标准按钮, “表2”和“表3”。当你点击 “Tab1”,选项卡式视图应为 打开时选择了选项卡1,并且 Tab2和Tab3也是如此 有什么提示吗? /EDIT 我想做的是:当我的iPhone应用程序初始化时,它会显示一个带有一个按钮的视图。当我点击这个按钮时,它应该进入一个选项卡式视图 我所做的和它不起作用的方式(得到一个未捕获的异常):我从基于视图的模板创建一个项目开始

编辑让我简化这个问题:假设您的应用程序 两个视图,主视图和选项卡式视图 使用3个选项卡查看。主视图已显示 三个名为“Tab1”的标准按钮, “表2”和“表3”。当你点击 “Tab1”,选项卡式视图应为 打开时选择了选项卡1,并且 Tab2和Tab3也是如此

有什么提示吗?
/EDIT

我想做的是:当我的iPhone应用程序初始化时,它会显示一个带有一个按钮的视图。当我点击这个按钮时,它应该进入一个选项卡式视图

我所做的和它不起作用的方式(得到一个未捕获的异常):我从基于视图的模板创建一个项目开始。在自动创建的视图控制器上,我声明了另一个名为TabbedViewController的视图控制器。下面是头文件:

#import <UIKit/UIKit.h>

@class TabbedViewController;

@interface DZBluePagesViewController : UIViewController {
    TabbedViewController *tabbedViewController;
}

@property (nonatomic, retain) TabbedViewController *tabbedViewController;

-(IBAction)goToTabbedView:(id)sender;

@end
我在insertSubview调用中收到一个未捕获的异常。。。到目前为止,我已经在多视图应用程序上做了3到4个教程(来自iPhone Development-Mark和LaMarche-book),我想我已经准备好在没有任何人牵着我的手的情况下做一个了。。。显然是错的。任何人都可以提供帮助?

当您遇到异常时,请打开运行控制台(shift-command-R)。把它贴出来。您可能还希望打开控制台,并在提示下键入“bt”作为“回溯”

发布异常。

当您收到异常时,打开运行控制台(shift-command-R)。把它贴出来。您可能还希望打开控制台,并在提示下键入“bt”作为“回溯”


发布异常。

我建议使用UINavigationController,然后在他们选择按钮后将tabController按到上面。如果不需要幻灯片动画,只需对动画:参数传递“否”。

我建议使用UINavigationController,然后在他们选择按钮后将tabController按到它上。如果您不需要幻灯片动画,只需对动画:参数传递“否”。

回答您的简化问题 我认为您需要第三个“根”视图和视图控制器来作为主视图和选项卡栏视图的超级视图

当应用程序启动时,根视图将加载主视图的内容。可以在根视图控制器内使用以下行执行此操作:

homeViewController.view.frame = self.view.bounds;
[self.view addSubview:homeViewController.view];
然后,当您想要切换到选项卡栏视图时,可以执行以下操作:

[homeViewController.view removeFromSuperview];
tabBarViewController.view.frame = self.view.bounds;
[self.view addSubview:tabBarViewController.view];
这里有一个陷阱:viewwillappease:,viewdiddappease:方法不会被调用,除非您自己调用它们,所以您也必须将它们插入正确的位置

按照Ben Gottlieb的建议,使用UINavigationController作为根视图可能会更容易。(我指的是根视图,因为我一直在使用它,导航控制器的根视图将是您的主视图。)然后,代替上面的代码,您只需调用pushViewController:方法即可将tabBarViewController滑入。如果您这样做,您将需要自定义UINavigationController以隐藏导航栏,因为您可能不需要它,而且苹果实际上不建议在导航视图层次结构中放置选项卡栏

关于例外情况 您发布的代码似乎与您发布的异常无关。这样,您就可以使用调试器来找出您自己的程序中有问题的代码行。

来回答您的简化问题 我认为您需要第三个“根”视图和视图控制器来作为主视图和选项卡栏视图的超级视图

当应用程序启动时,根视图将加载主视图的内容。可以在根视图控制器内使用以下行执行此操作:

homeViewController.view.frame = self.view.bounds;
[self.view addSubview:homeViewController.view];
然后,当您想要切换到选项卡栏视图时,可以执行以下操作:

[homeViewController.view removeFromSuperview];
tabBarViewController.view.frame = self.view.bounds;
[self.view addSubview:tabBarViewController.view];
这里有一个陷阱:viewwillappease:,viewdiddappease:方法不会被调用,除非您自己调用它们,所以您也必须将它们插入正确的位置

按照Ben Gottlieb的建议,使用UINavigationController作为根视图可能会更容易。(我指的是根视图,因为我一直在使用它,导航控制器的根视图将是您的主视图。)然后,代替上面的代码,您只需调用pushViewController:方法即可将tabBarViewController滑入。如果您这样做,您将需要自定义UINavigationController以隐藏导航栏,因为您可能不需要它,而且苹果实际上不建议在导航视图层次结构中放置选项卡栏

关于例外情况
您发布的代码似乎与您发布的异常无关。这样,您就可以使用调试器来找出您自己的程序中有问题的代码行。

为什么要有一个冗余的菜单视图?为什么不让tab视图作为自己的视图,让用户选择他们想要选择的选项卡呢?我不明白为什么你需要一个菜单,当选项卡栏界面在没有菜单的情况下打开一个特定的选项卡时,却需要一个菜单…

为什么要有一个冗余的菜单视图?为什么不让tab视图作为自己的视图,让用户选择他们想要选择的选项卡呢?我不明白为什么你需要一个菜单,当选项卡栏界面在没有菜单的情况下打开一个特定的选项卡时,它只是打开一个特定的选项卡…

问题出在TabbedViewController中,你能提供更多关于错误的信息吗?这是调试器控制台2010-01-02 11:02:00.869 DZBluePages[5604:207]的粘贴***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“不允许直接修改由选项卡栏控制器管理的选项卡栏。”2010-01-02 11:02:00.871 DZBluePages[5604:207]堆栈:(292629392525458249,…问题出在TabbedViewController中,你能提供更多关于你得到的错误的信息吗?这是调试器控制台2010-01-02 11:02:00.869 DZBluePages[5604:207]***由于未捕获的异常“nsInternalInconsistenceException”终止应用程序,原因: