我正在为iOS 4.x / 5.0开发第一款iPhone应用程序,并对如何遵守推荐的Apple指南有一些疑惑。我还附上了代码段。
以下是该方案:
当应用加载时,我想在屏幕底部显示以下功能:测试,设置。我的第一个问题是我必须使用UISegmentedControl或UITabBar吗?最棘手的部分是我不希望自动选择第一个“测试”选项卡/按钮。我希望用户选择选项卡/按钮。在此之前,我想要一个运行显示一些文本的计时器。我尝试使用UITabBar,当应用程序加载时,选择第一个“Test”选项卡,默认显示关联的ViewController。我通过在AppDelegate.m中的“didFinishLaunchingWithOptions”方法中推送“根视图控制器”来规避这一点。这是有效的,当我点击“分数”选项卡时,它会弹出“根视图控制器”并按下“测试视图控制器”。但是,如果我在应用程序加载后立即选择“设置”选项卡并单击“测试”选项卡,则“测试”选项卡的视图控制器根本不会加载,但仍会显示“主视图控制器”。我在“测试”选项卡上也有一个UINavigationController,我将其隐藏在“viewDidAppear”事件中。当我点击“测试”标签时,我也希望消除动画(推回)。
我的困惑是:
我可以用其他控件替换UINavigationController,让用户在“测试视图控制器”中点击“开始/停止”按钮(显示在顶部)吗?
UITabBar中每个标签的标签上是否有点击事件?
我想从代码(添加控件除外)到ViewControllers执行所有操作。使用IB做同样的事情让我感到困惑。这是一个糟糕的方法吗?
以下是代码段:
#import "NavTabTestAppDelegate.h"
#import "RootViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation NavTabTestAppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RootViewController *rootViewController = [[RootViewController alloc ] initWithNibName:@"RootViewController" bundle: nil];
[rootViewController.view setBackgroundColor:[UIColor blueColor]];
// [rootViewController setTitle:@"RootViewController"];
FirstViewController *firstViewController = [[FirstViewController alloc ] initWithNibName:@"FirstViewController" bundle: nil];
[firstViewController.view setBackgroundColor:[UIColor yellowColor]];
[firstViewController setTitle:@"FirstViewController"];
SecondViewController *secondViewController = [[SecondViewController alloc ] initWithNibName:@"SecondViewController" bundle: nil];
[secondViewController.view setBackgroundColor:[UIColor redColor]];
[secondViewController setTitle:@"SecondViewController"];
//create the navigation controller and use NavRootController as its root
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:firstViewController];
//create an array of views that will be passed to our tabbar
NSArray *viewsArray = [NSArray arrayWithObjects:nav, secondViewController, nil];
//Now create our tab bar controller
UITabBarController *tabbarController = [[UITabBarController alloc] init];
//then tell the tabbarcontroller to use our array of views
[tabbarController setViewControllers:viewsArray];
[nav pushViewController:rootViewController animated:NO];
//nav.view.hidden = YES;
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
//then the last step is to add the our tabbarcontroller as subview of the window
self.window.rootViewController = tabbarController;
return YES;
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
// NSLog(@"Inside RootViewController.m viewWillAppear %@", animated);
}
- (void) viewWillDisappear:(BOOL)animated{
// NSLog(@"Inside RootViewController.m viewWillDisappear %@", "Done");
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
// NSLog(@"Inside FirstViewController.m viewWillAppear %@", animated);
}
- (void) viewWillDisappear:(BOOL)animated{
// NSLog(@"Inside FirstViewController.m viewWillDisappear %@", "Done");
[super viewWillAppear:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
单击选项卡(BAD_ACCESS)时,NSLog会抛出异常。无法弄清楚原因。
我来自Windows开发人员背景,我为长篇文章道歉。请帮忙。
感谢。
答案 0 :(得分:1)
我的第一个问题是我必须使用UISegmentedControl或 UITabBar?最棘手的部分是我不想要第一个“测试” 选项卡/按钮可自动选择。
我认为你错过了UITabBarController的观点。它的工作是让用户选择几个不同视图中的一个,并管理与这些视图对应的视图控制器。其中一个视图将始终被选中 - 选择没有选项卡真的没有意义。如果您希望“标签”除了选择视图以外的其他操作,您应该使用其他内容,例如UIToolbar或UISegmentedControl。
我可以用其他控件替换UINavigationController,让用户点击“开始/停止”按钮(显示在顶部) 在“测试视图控制器”中?。
我很难知道你要用导航控制器做什么,所以很难说你是否可以替换它。但是,您应该了解UINavigationController是一个视图控制器,而不是一个控件。如果您只是在谈论导航控制器提供的导航栏,那么您可以根据自己的喜好显示或不显示。
UITabBar中每个标签的标签上是否有点击事件?
标签栏代理应实施UITabBarDelegate协议,其中包含– tabBarController:didSelectViewController:
。
我想从代码(添加控件除外)到 ViewControllers。使用IB做同样的事情让我感到困惑 事情。这是一种不好的方法吗?
取决于你的要求。大多数有经验的Objective-C程序员在适当时使用IB,即几乎任何时候需要定义相对静态的用户界面。
有些人不喜欢使用IB,但在我看来,大多数人从来没有真正花时间学习如何使用IB。你应该做任何你喜欢的事情。
我会说避免使用有用的工具因为你不了解它在短期内可能是合理的,但从长远来看这是一个糟糕的方法。当你刚学会在一个全新的平台上编程时,限制你需要知道的事情是非常合理的。但是IB确实并不复杂,而且它非常有用。如果您现在不使用它,请记下自己,以便将来花些时间使用它。