【问题标题】:Switch between different Views with a Navigation Controller使用导航控制器在不同视图之间切换
【发布时间】:2013-11-25 15:07:52
【问题描述】:

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

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

我遇到的问题是,我想要 3 个不同的视图。我用谷歌搜索了一下,偶然发现了一些 stackoverflow 问题。在那里,人们建议使用NavigationController。好的。现在我正在尝试实现它。我想要的是以下

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

navigationcontroller 是否适用于此?我遇到的问题是我告诉应用程序我想从 MainViewController 开始并将 LoginView 推入其中。

我有一个 MainViewController.hMainViewController.mUIViewController 的子类

现在,我究竟应该在哪里执行此操作?我这里有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 开发的新手。在一个视图上编程对我来说很容易。我已经这样做了,但我想要三个不同的观点!谢谢!

【问题讨论】:

  • 去掉这一行 [navigationController pushViewController:viewController animated:NO];

标签: ios iphone objective-c


【解决方案1】:

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

错了。

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

然后你在导航控制器中一个接一个地推送,这取决于用户交互。

【讨论】:

  • 嗨。感谢你的回答。所以我会有3节课,对吧?第一个是登录,第二个是显示,第三个是详细信息。我要打开的第一个是登录,所以我会在 AppDelegate 中将 LoginViewController 添加到 navigationController 对吗?但是我会在 loginController 类中添加下一个视图在哪里呢?
  • 当您的用户从您的 Login 视图控制器成功登录时,您将执行 [self.navigationController pushViewController:[MainViewController new] animated:YES completion:NULL];(假设您的第二个屏幕由 MainViewController 处理)。
  • 你真的应该看看苹果的文档:developer.apple.com/library/IOS/featuredarticles/…
【解决方案2】:

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

[self presentViewController:loginViewController animated:YES completion:NULL];

成功登录后,您可以关闭 LoginViewController。

【讨论】:

    【解决方案3】:

    删除这个:

    [navigationController pushViewController:viewController animated:NO];
    

    您不应该推送 ViewController,因为您已经告诉 NavigationController ViewController 将是根:

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

    【讨论】:

      【解决方案4】:

      使用此代码,如果应用程序是 universion,则使用相同的代码,否则删除 ([[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;
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2018-12-28
        • 2020-10-31
        • 1970-01-01
        • 2012-05-09
        相关资源
        最近更新 更多