使用导航控制器在不同视图之间切换

时间:2013-11-25 15:07:53

标签: ios iphone objective-c

我对iOS编程完全陌生。到目前为止我只在Android上进行了编程,而Objective-C现在对我来说是一种完全不同的新语言。

我想要做的是不要使用我用故事板创建的设计。我想以编程方式完成所有工作,因为我觉得如果我这样做会更有动力。

我遇到的问题是,我希望有3种不同的观点。我google了一下,偶然发现了一些stackoverflow问题。在那里,人们建议使用NavigationController。好的。现在我正在尝试实现它。我想要的是以下

MainViewController有3个不同的观点。第一个视图是loginView。第二个是显示数据,第三个是根据第二个视图的点击显示详细数据。

这是一个导航控制器核心器吗?我遇到的问题是我告诉应用程序我想从MainViewController开始并在其中推送LoginView。

我有MainViewController.hMainViewController.m,它们是UIViewController

的子类

现在,我到底在哪里做到这一点?我在这里有didFinishLaunchingWithOptions方法,其中包含以下内容

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window                                     = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor                     = [UIColor whiteColor];

    UIViewController *viewController                = [[MainViewController alloc]init];
    UINavigationController *navigationController    = [[UINavigationController alloc] initWithRootViewController:viewController];

    [navigationController pushViewController:viewController animated:NO];
    self.window.rootViewController                  = navigationController;
    [self.window makeKeyAndVisible];
    return YES;

}

但这只会让应用程序崩溃。我究竟做错了什么?我如何获得这三种观点?我开始完全错了吗?请帮忙。正如我所说,我是iOS开发的新手。我很容易在一个视图上编程。我已经这样做了,但我想要不同的观点!谢谢!

4 个答案:

答案 0 :(得分:2)

  

MainViewController有3个不同的观点。第一个视图是loginView。第二个是显示数据,第三个是根据第二个视图的点击显示详细数据。

那是错的。

您需要三个不同的视图控制器,每个视图控制器都将管理自己的视图。

然后在导航控制器中依次推送,具体取决于用户的互动。

答案 1 :(得分:1)

删除它:

[navigationController pushViewController:viewController animated:NO];

你不应该推送ViewController,因为你已经告诉NavigationController已经将ViewController作为根控件:

UINavigationController *navigationController    = [[UINavigationController alloc]
                                                  initWithRootViewController:viewController];

答案 2 :(得分:1)

使用此代码,如果应用程序是Universe,则使用相同的代码,删除([[UIDevice currentDevice] userInterfaceIdiom]的条件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navController;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {

      self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];


  {
                          if(result.length>0)
                          {
                              for(var i in result)
                              {
                                var ObjResult=result[i];

                                      var content = "<div data-role='collapsible' id='set" + i + "'>";
                                      content+="<h3>"+ObjResult.title+"<br>";

                                      var intDate=parseInt(ObjResult['ordered date']);
                                      content +=timestampToDate(intDate)+"</h3>"

                                      if(isNaN(ObjResult.med_placeorderfor))
                                      content+="<p><a>Medicle Place order for: </a>"+result[i].med_placeorderfor+"</p>";

                                      if(isNaN(ObjResult.pres_placeorderfor)>0)
                                      content+="<p><a>Medicle Place order for: </a>"+result[i].placeorderfor+"</p>";

                                      if(ObjResult['order status'].length>0)
                                      content+="<p><a>Order status: </a>"+ObjResult['order status']+"</p>";

                                      if(ObjResult.comments.length>0)
                                      content+="<p><a>Comments: </a>"+ObjResult.comments+"</p>";

                                      content+="</div>";
                                }
                                  $("#id_notification_list_dashboard").append( content ).collapsibleset('refresh');
                                  $("#id_notification_list_dashboard").trigger('create');

                      }
                      else
                      {
                      $("#id_notification_list_dashboard").append("<div style=\"text-align:center\" data-role='list-divider'><h1>No data found</h1></div>").collapsibleset('refresh');
                      }
                      $('body').removeClass('ui-loading');
                      loadingWithMsg("hide");
                      }

    } else {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
    }


    navController=[[UINavigationController alloc]initWithRootViewController:self.viewController];
    [navController.navigationBar setTranslucent:YES];
    navController.navigationBar.tintColor = [UIColor colorWithRed:161.0f/255.0f green:18.0f/255.0f blue:6.0f/255.0f alpha:1];
    self.window.rootViewController =navController ;
    [self.window makeKeyAndVisible];
    return YES;


}

答案 3 :(得分:1)

是的,Gonzalo Aune是仪式,你不应该在NavicationController中推送rootviewcontroller。 此外,我建议您保留导航控制器的第一个视图(登录视图)。 您可以从MainViewController开始,根据检查和条件,您可以使用

在MainViewController上显示LoginView
[self presentViewController:loginViewController animated:YES completion:NULL];

成功登录后,您可以解除LoginViewController。