iOS 5新手 - 需要帮助开发iPhone应用程序

时间:2011-12-26 20:55:21

标签: iphone ios ios5 xcode4.2

我正在为iOS 4.x / 5.0开发第一款iPhone应用程序,并对如何遵守推荐的Apple指南有一些疑惑。我还附上了代码段。

以下是该方案:

当应用加载时,我想在屏幕底部显示以下功能:测试,设置。我的第一个问题是我必须使用UISegmentedControl或UITabBar吗?最棘手的部分是我不希望自动选择第一个“测试”选项卡/按钮。我希望用户选择选项卡/按钮。在此之前,我想要一个运行显示一些文本的计时器。我尝试使用UITabBar,当应用程序加载时,选择第一个“Test”选项卡,默认显示关联的ViewController。我通过在AppDelegate.m中的“didFinishLaunchingWithOptions”方法中推送“根视图控制器”来规避这一点。这是有效的,当我点击“分数”选项卡时,它会弹出“根视图控制器”并按下“测试视图控制器”。但是,如果我在应用程序加载后立即选择“设置”选项卡并单击“测试”选项卡,则“测试”选项卡的视图控制器根本不会加载,但仍会显示“主视图控制器”。我在“测试”选项卡上也有一个UINavigationController,我将其隐藏在“viewDidAppear”事件中。当我点击“测试”标签时,我也希望消除动画(推回)。

我的困惑是:

  1. 我可以用其他控件替换UINavigationController,让用户在“测试视图控制器”中点击“开始/停止”按钮(显示在顶部)吗?

  2. UITabBar中每个标签的标签上是否有点击事件?

  3. 我想从代码(添加控件除外)到ViewControllers执行所有操作。使用IB做同样的事情让我感到困惑。这是一个糟糕的方法吗?

  4. 以下是代码段:

    AppDelegate.m

    #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;
    }
    

    RootViewController.m(添加了以下代码)

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

    FirstViewController.m(添加以下代码以防止动画但不起作用)

    - (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开发人员背景,我为长篇文章道歉。请帮忙。

    感谢。

1 个答案:

答案 0 :(得分:1)

  

我的第一个问题是我必须使用UISegmentedControl或   UITabBar?最棘手的部分是我不想要第一个“测试”   选项卡/按钮可自动选择。

我认为你错过了UITabBarController的观点。它的工作是让用户选择几个不同视图中的一个,并管理与这些视图对应的视图控制器。其中一个视图将始终被选中 - 选择没有选项卡真的没有意义。如果您希望“标签”除了选择视图以外的其他操作,您应该使用其他内容,例如UIToolbar或UISegmentedControl。

  

我可以用其他控件替换UINavigationController,让用户点击“开始/停止”按钮(显示在顶部)   在“测试视图控制器”中?。

我很难知道你要用导航控制器做什么,所以很难说你是否可以替换它。但是,您应该了解UINavigationController是一个视图控制器,而不是一个控件。如果您只是在谈论导航控制器提供的导航栏,那么您可以根据自己的喜好显示或不显示。

  

UITabBar中每个标签的标签上是否有点击事件?

标签栏代理应实施UITabBarDelegate协议,其中包含– tabBarController:didSelectViewController:

  

我想从代码(添加控件除外)到   ViewControllers。使用IB做同样的事情让我感到困惑   事情。这是一种不好的方法吗?

取决于你的要求。大多数有经验的Objective-C程序员在适当时使用IB,即几乎任何时候需要定义相对静态的用户界面。
有些人不喜欢使用IB,但在我看来,大多数人从来没有真正花时间学习如何使用IB。你应该做任何你喜欢的事情。

我会说避免使用有用的工具因为你不了解它在短期内可能是合理的,但从长远来看这是一个糟糕的方法。当你刚学会在一个全新的平台上编程时,限制你需要知道的事情是非常合理的。但是IB确实并不复杂,而且它非常有用。如果您现在不使用它,请记下自己,以便将来花些时间使用它。