在一个按钮动作中推送两个不同的视图控制器-iOS

Posted

技术标签:

【中文标题】在一个按钮动作中推送两个不同的视图控制器-iOS【英文标题】:Pushing two Different view controllers in one button action-iOS 【发布时间】:2016-09-30 05:36:12 【问题描述】:

我的 ios 应用程序有四个显示不同信息的选项卡。

在我的第二个标签视图控制器中,我有一个按钮,在我导航到 SignInViewController 屏幕的 button1 操作中,我将其命名为 button1,而在我的第三个标签视图控制器中,我的第三个标签视图控制器是 loginViewController。

在两个 ViewControllers 中,我都可以选择注册,并且已经存在的用户可以登录这两个 ViewControllers。因此,在 SignInViewController 中,我有一个名为 registerButton 的按钮。现在在这个 registerButton 操作中,我已经推送了 RegisterViewController,并且与 loginViewController 中的 SignInViewController 相同,我也将按钮命名为 registerButton2。现在在这个 registerButton2 操作中,我推送了相同的 RegisterViewController。

现在我想要的是在 RegisterViewController 我有一个按钮让我在 SaveButtonAction 中将其命名为 SaveButton 如果我从 SignInViewController 到 RegisterViewController 然后在 SaveButtonAction 我想推送 ShippingViewController 并且如果我从 loginViewController 到 RegisterViewController然后在 SaveButtonAction 中我想推 `AccountViewController.

简而言之 (1)tabbaritem2-->SignInViewController-->RegisterViewController-->ShippingViewController (2)tabbaritem3-->loginViewControoler-->RegisterViewController-->AccountViewController

我在 SaveButtonAction 中尝试了以下代码,但它不起作用。

这是我的代码:

- (IBAction)SaveButtonAction:(id)sender


    if(_tabBarController.tabBarItem.tag == 2)

        UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        ShippingViewController  *shipVc = [story instantiateViewControllerWithIdentifier:@"ShippingViewController"];
        [self.navigationController pushViewController:shipVc animated:YES];

     else if(_tabBarController.tabBarItem.tag == 3)

         UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
         AccountViewController *acntVC = [story instantiateViewControllerWithIdentifier:@"AccountViewController"];
         [self.navigationController pushViewController:acntVC animated:YES];

     


请帮助。在此先感谢。

【问题讨论】:

我无法真正理解您的描述,但我得到的是您想根据某些条件从一个按钮执行不同的转场。在这种情况下,创建从视图控制器对象到目标场景的 segue,并为它们提供标识符。然后在您的saveButtonActin 方法中,您可以使用self.performSegueWithIdentifier,提供合适的segue 标识符 你想要什么,即使我已经阅读了你的问题 3 到 4 遍,我也无法理解,但我无法理解...... @hani 我刚刚编辑了你的问题,批准它,不要自己搞乱问题。 【参考方案1】:

只需在RegisterViewController 中使用boolean(比如说shouldFromLogin)并在从LoginVC 推送时将boolean 设置为true,在其他情况下将其传递为false。然后检查按钮操作中的boolean 并相应地导航到不同的VC。

演示代码:

//This code when you push to RegisterVC from LoginVC. Similar thing for other case with shouldFromLogin as NO.

UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
RegisterViewController  *registerVc = [story instantiateViewControllerWithIdentifier:@"RegisterViewController"];
registerVc.shouldFromLogin=YES;
[self.navigationController pushViewController:shipVc animated:YES];

然后检查

- (IBAction)SaveButtonAction:(id)sender
if(shouldFromLogin)
   //Pass to AccountViewController

else
  //Pass to ShippingViewController


【讨论】:

【参考方案2】:

您可以使用选定的标签栏索引来执行此操作。

if(theTabBar.selectedItem == 2)
    ShippingViewController  *shipVc = [story instantiateViewControllerWithIdentifier:@"ShippingViewController"];
    [self.navigationController pushViewController:shipVc animated:YES];


else if(theTabBar.selectedItem == 3)
     AccountViewController *acntVC = [story instantiateViewControllerWithIdentifier:@"AccountViewController"];
     [self.navigationController pushViewController:acntVC animated:YES];

【讨论】:

还要检查这段代码:tabBarController.selectedIndex==2。【参考方案3】:

在您的 RegisterViewController.h 文件中,如下声明一个枚举:

typedef NS_ENUM(NSUInteger, RegisterViewControllerAction) 
    RegisterViewControllerActionShipping,
    RegisterViewControllerActionAccount,

另外,为 RegisterViewController 类声明一个新的构造函数:

@interface RegisterViewController

@property (readonly) RegisterViewControllerAction action;
- (id)initWithAction:(RegisterViewControllerAction)action;

@end

@implementation RegisterViewController
@synthesize action = _action;

- (id)initWithAction:(RegisterViewControllerAction)action 
    if (self = [super initWithNib:xxx]) 
         _action = action;
    


- (IBAction)SaveButtonAction:(id)sender 
    if (_action == RegisterViewControllerActionShipping) 
        ....
     else if (_action == RegisterViewControllerActionAccount) 
        ....
    

【讨论】:

感谢 kevin,我是一名新开发人员。在你的代码 initwithnib 中你给了 xxx...但是我应该在我的项目中写什么 我想你只需要使用[super init]。试一试! 是的,我已经尝试过你的代码@kevin,但它在两个标签栏项目中只推送到 shippingviewcontroller :(【参考方案4】:

//从 LoginVC 推送到 RegisterVC 时的这段代码。其他情况类似,但分配 @"signin" 而不是 @"login"。

UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
RegisterViewController  *registerVc = [story instantiateViewControllerWithIdentifier:@"RegisterViewController"];
registerVc.imFromLogin = @"login";
[self.navigationController pushViewController:registerVc animated:YES];
- (IBAction)SaveButtonAction:(id)sender
    if([_imFromLogin isEqualToString:@"login"])
    
         [self performSegueWithIdentifier:@"regToAccount" sender:nil];
    else if ([_imFromLogin isEqualToString:@"signin"]) 
        [self performSegueWithIdentifier:@"registerToShipping" sender:nil];
    

【讨论】:

以上是关于在一个按钮动作中推送两个不同的视图控制器-iOS的主要内容,如果未能解决你的问题,请参考以下文章

模态下的弹出/推送视图

通过 UIScrollView 推送 ViewController

标题中的按钮用于推送新的视图控制器

在 iOS 13 上推送新视图后后退按钮崩溃

在不同的视图控制器中执行动作

从 iOS 中呈现的视图控制器推送视图