【问题标题】:How to implement segue on button click?如何在按钮单击时实现 segue?
【发布时间】:2014-12-07 22:18:47
【问题描述】:

我正在构建一个 iOS 应用程序。我已经在我的应用程序中实现了 Facebook 和 twitter 集成。

我在 viewcontroller 中遇到问题,我有按钮 Next 并实现了 push segue 在该按钮上继续下一个视图,但是当我单击“下一步”按钮并出现错误时,我的应用程序崩溃了。

错误:由于未捕获的异常“NSGenericException”而终止应用程序,原因:“找不到用于 segue 'nextSport' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。'

这是故事板的屏幕截图:

上一张图片:

添加了当前(新)图像:

这是我的代码:

            - (IBAction)fbLogin:(id)sender {
                   [FBSession openActiveSessionWithReadPermissions:@[@"email",@"user_location",@"user_birthday",@"user_hometown"]
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                  switch (state) {
                                      case FBSessionStateOpen:
                                          [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {

                                              if (error) {

                                                  NSLog(@"error:%@",error);


                                              }
                                              else
                                              {
                                                  // retrive user's details at here as shown below


                                                  [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *FBuser, NSError *error) {
                                                      if (error) {
                                                          // Handle error
                                                      }

                                                      else {
                                                          NSString *userName = [FBuser name];
                                                          NSLog(@"username===%@",userName);
                                                           NSLog(@"sesseion=%@",session);
                                                                                                                    }
                                                  }];

                                                  NSLog(@"FB user first name:%@",user.first_name);
                                                  userName=user.first_name;
                                                  NSLog(@"FB user last name:%@",user.last_name);
                                                  NSLog(@"FB user birthday:%@",user.birthday);
                                                  NSLog(@"FB user location:%@",user.location);
                                                  NSLog(@"FB user username:%@",user.username);
                                                  NSLog(@"FB user gender:%@",[user objectForKey:@"gender"]);
                                                  NSLog(@"email id:%@",[user objectForKey:@"email"]);
                                                  NSLog(@"location:%@", [NSString stringWithFormat:@"Location: %@\n\n",
                                                                         user.location[@"name"]]);
                                                  userImageURL = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", [user objectID]];
                                                  NSLog(@"image=%@",userImageURL);

                                               }
                                              [self performSegueWithIdentifier:@"afterLogin" sender:nil];
                                          }];
                                          break;
                                          }
                                } ];
                        }

【问题讨论】:

  • 源视图控制器(带有“下一步”按钮的那个)需要嵌入到导航控制器中才能使用推送segue
  • 用户已将问题从关于单击按钮时崩溃的问题完全更改为关于如何在 facebook 登录请求后显示 viewController 的问题。这是 2 个完全不相关的问题,应该单独提出,不要改变它并要求当前回答的人也解决这个问题
  • @Simon 不,我的问题没有解决。
  • @Daljeet 您提出的原始问题已解决。 3 小时前,您编辑了问题以包含此 Facebook 代码。您的问题是为什么我的应用程序崩溃以及如何修复它。已经回答了,这个问题目前是 2 个问题合并为一个,这不是使用 stackoverflow 的方式。这就是为什么我投票赞成关闭这个问题。如果您想问另一个问题,请随时这样做。但是从一开始就包括整个问题,并且在人们帮助您之后不要改变上下文

标签: ios objective-c uinavigationcontroller segue crash


【解决方案1】:

您正在推送到UINavigationController,但执行推送的视图控制器也应该在UINavigationController 内。由于错误表明没有UINavigationController 来执行segue 'nextSport'

【讨论】:

  • 谢谢@Simon,你能告诉我更多关于执行推送的viewController也应该在UINavigationController中,所以我可以破解这个。
  • @Daljeet 我不确定如何解释这一点。您在 viewController A 上调用 segue,segue 将转到以 viewController B 作为根的 UINavigationController。 viewController A 应该是 UINavigationController 的根,并且应该直接推送到 B,而不是推送到包含 B 的 navController
  • 感谢@Simon 我已经用我的故事板的新图像编辑了我的问题。但是现在当用户成功登录时发生了什么,它无法继续我想要的下一个视图。我也想要当用户成功登录并在关闭应用程序后再次出现时,它应该在下一个视图上而不是在登录屏幕上。
  • @Daljeet 我不知道你的评论是什么意思。登录完全是另一个问题。在stackoverflow上已经回答了很多次。至于这个,你没有按照我的指示去做。我说在下一个按钮之后立即删除导航控制器,而是在带有下一个按钮的 viewController 之前添加一个。完成此操作后,如果原始问题不起作用,请发布正在发生的事情与应该发生的事情的详细说明。例如。应用程序在控制器 x 上打开,用户单击按钮 y,结果是崩溃。预期的结果是它打开控制器 z
  • Simon,我已经完成了登录视图-->导航控制器-->带有下一个按钮的 NextView-->ViewController 但成功登录后我无法进入下一个屏幕NextView 带有下一步按钮,但仍在登录视图中。
【解决方案2】:

您应该在图像中移动第二个(导航控制器)和第三个(具有下一个按钮的控制器视图)视图控制器的位置,因为当您单击下一个按钮时,没有导航控制器可供您执行推。

【讨论】:

  • 从图中我不确定他是否使用了UITabbarController,如果是的话,我认为UITabbarController应该嵌入到导航控制器中。并移除其他导航控制器。
  • 目前我还没有实现任何 UITabbarController。
  • @Daljeet,导航控制器管理分层内容的导航,它使用导航堆栈管理当前显示的屏幕,导航堆栈由视图控制器数组表示。因此,如果您想向前导航(从按钮按下)或向后导航,则必须将视图控制器嵌入导航控制器或将控制器推送到导航堆栈上,现在,具有下一个按钮的视图控制器未打开导航堆栈。
  • 感谢@Carousel,我在视图之前添加了导航控制器,正如您所说,您可以在图像中看到我添加了新的控制器。但是现在用户成功登录时发生了什么,它无法去在我想要的下一个视图上。
  • @Daljeet,尝试删除左起第二个导航控制器,因为您已经有 一个 导航控制器,即图片中左起第四个,您 只需要一个 navigation controller 来管理导航堆栈中的所有视图控制器。删除后,第一页和第三页(有下一步按钮)在导航堆栈上。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多