【问题标题】:Best approach for one view to call a tabbed view on iPhone一个视图在 iPhone 上调用选项卡式视图的最佳方法
【发布时间】:2010-01-02 00:57:48
【问题描述】:

编辑让我简化一下问题:假设您的应用程序有 两个视图,主视图和选项卡式 使用 3 个选项卡查看。主视图有 三个名为“Tab1”的标准按钮, “Tab2”和“Tab3”。当你点击 “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

我创建了一个名为TabbedView 的xib,并将文件所有者的类标识设置为TabbedViewController。我还拖了一个 Tab Bar Controller 到它上面。

我在主视图上添加了一个按钮,这是我在主视图控制器文件上与之关联的操作:

- (void)viewDidLoad {

    TabbedViewController *tvc = [[TabbedViewController alloc] 
                                 initWithNibName:@"TabbedView" bundle:nil];
    self.tabbedViewController = tvc;
    [tvc release];

    [super viewDidLoad];
}



-(IBAction)goToTabbedView:(id)sender {
//  [self.view removeFromSuperview];
    [self.view insertSubview:tabbedViewController.view atIndex:0];
}

我在 insertSubview 调用中遇到未捕获的异常...到目前为止,我已经完成了 3 或 4 个关于多视图应用程序的教程(来自 iPhone Development - Mark and LaMarche - book),我想我已经准备好了没有人牵着我的手……显然是错的。有人可以帮忙吗?

【问题讨论】:

  • 问题出在 TabbedViewController 中,您能否提供有关您遇到的错误的更多信息?
  • 这是来自调试器控制台的粘贴 2010-01-02 11:02:00.869 DZBluePages[5604:207] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“直接修改不允许由标签栏控制器管理的标签栏。 2010-01-02 11:02:00.871 DZBluePages[5604:207] 堆栈:(29262939、2525458249、...

标签: iphone objective-c xcode multiview


【解决方案1】:

回答您的简化问题

我认为您需要第三个“根”视图和视图控制器作为主视图和选项卡栏视图的超级视图。

当您的应用启动时,Root 视图将加载 Home 视图的内容。您可以在根视图控制器中使用以下几行来执行此操作:

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];

有一个问题:除非您自己调用 viewWillAppear:、viewDidAppear: 方法,否则它们不会被调用,因此您也必须将它们插入到正确的位置。

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

关于异常

您发布的代码似乎与您发布的异常无关。 See this blog post for instructions on setting a global breakpoint on thrown exceptions。这样您就可以使用调试器找出您自己程序中的违规代码行是什么。

【讨论】:

  • 谢谢!我会尝试这样做,但首先我想使用您链接中的提示收集有关异常的更多信息。
【解决方案2】:

遇到异常时打开运行控制台(shift-command-R)。发布那个。您可能还想打开控制台,并在提示符下键入“bt”作为“回溯”。

发布异常。

【讨论】:

  • 尝试进入界面生成器,删除tabview,然后添加一个新的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    为什么要有多余的菜单视图?为什么不将选项卡视图作为其自己的视图并让用户选择他们希望选择的选项卡?我不明白为什么你需要一个只打开特定标签的菜单,而标签栏界面在没有菜单的情况下仍然这样做......

    【讨论】:

    • 首页视图有额外的功能,为简单起见,这里不提了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多