Objective c 返回AppDelegate以重新创建uitabbarcontroller

Objective c 返回AppDelegate以重新创建uitabbarcontroller,objective-c,xcode,uiviewcontroller,uinavigationcontroller,uitabbarcontroller,Objective C,Xcode,Uiviewcontroller,Uinavigationcontroller,Uitabbarcontroller,我有一个应用程序,它基于一个带有欢迎屏幕的选项卡栏视图(这会导致登录或注册过程)。基本上,如果您已登录,则直接进入选项卡栏视图,如果未登录,则进入欢迎屏幕,您可以选择登录或注册。假设您转到登录或注册,我希望选项卡栏视图重新出现,但是,所有声明都在AppDelegate中。我怎样才能“回去”给tabbatcontroller打电话?我的课程结构/流程是否正确 因此,请重复: 用户登录->第一个视图是选项卡栏视图 用户注销->欢迎屏幕视图-->登录/注册屏幕视图-->选项卡栏视图 我想知道的是,我需

我有一个应用程序,它基于一个带有欢迎屏幕的选项卡栏视图(这会导致登录或注册过程)。基本上,如果您已登录,则直接进入选项卡栏视图,如果未登录,则进入欢迎屏幕,您可以选择登录或注册。假设您转到登录或注册,我希望选项卡栏视图重新出现,但是,所有声明都在AppDelegate中。我怎样才能“回去”给tabbatcontroller打电话?我的课程结构/流程是否正确

因此,请重复:

  • 用户登录->第一个视图是选项卡栏视图
  • 用户注销->欢迎屏幕视图-->登录/注册屏幕视图-->选项卡栏视图
  • 我想知道的是,我需要在用户单击登录页面中的“登录”后调用的这个操作方法中写些什么:

    -(IBAction)done:(id)sender {
    
    ?????
    
    }
    
    作为参考,我的appDelegate是:

      if(user signed in)
    {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UIViewController *viewController1 = [[FirstTab alloc] initWithNibName:@"FirstTab" bundle:NSBundle.mainBundle];
    UIViewController *viewController2 = [[SecondTab alloc] initWithNibName:@"SecondTab" bundle:NSBundle.mainBundle];
    UINavigationController *secondNavController = [[UINavigationController alloc]initWithRootViewController:viewController2];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, secondNavController, nil];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    
    }
    else
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        SigninTabBarTemplateViewController *landingPage = [[SigninTabBarTemplateViewController alloc] initWithNibName:@"SigninTabBarTemplateViewController" bundle:nil];
        self.window.rootViewController = (UIViewController *) landingPage;            
        [self.window makeKeyAndVisible];   
    }
    

    您可以尝试在您知道用户已成功登录的方法中执行类似的操作。(假设SignedTabbarViewController是您的TabBarController)


    您可以尝试在您知道用户已成功登录的方法中执行类似的操作。(假设SignedTabbarViewController是您的TabBarController)


    你可以考虑很多选项。

    这可以通过使用委托轻松实现。如果您想关闭您以MODAL方式呈现的VC,请为其指定一个
    delegate
    属性。需要时,将向代理发送一条消息,让其解除VC。使用委托的一个好方法是编写一个自定义procotol

    例如:

    // the delegate will conform to this protocol
    @protocol SignInVCDelegate
    
    // this method will be called when required
    //
    -(void)signInCompleted;
    
    @end
    
    现在,使您想要的对象符合该协议,例如应用程序委托

    // .h
    #import "SignInVCDelegate.h"
    
    @interface YourAppDelegate : NSObject <..., SignInDelegate> {
        ...
        SignInVC *signIn;
        ...
    }
    
    -(void)signInCompleted;
    
    @end
    
    现在,为
    signInVC
    提供一个代理属性,该属性将在以模式呈现之前设置,并在登录过程完成时向代理发送一条消息

    // in .h
    @property(retain) id <SignInDelegate>delegate;
    
    // in .m
    @synthesize delegate;
    
    -(IBAction)validateSignIn {
        ...
        [delegate signInCompleted];
    }
    

    关于./P>>P>中的委托和通知的更多信息。您可以考虑很多选项。

    这可以通过使用委托轻松实现。如果您想关闭您以MODAL方式呈现的VC,请为其指定一个
    delegate
    属性。需要时,将向代理发送一条消息,让其解除VC。使用委托的一个好方法是编写一个自定义procotol

    例如:

    // the delegate will conform to this protocol
    @protocol SignInVCDelegate
    
    // this method will be called when required
    //
    -(void)signInCompleted;
    
    @end
    
    现在,使您想要的对象符合该协议,例如应用程序委托

    // .h
    #import "SignInVCDelegate.h"
    
    @interface YourAppDelegate : NSObject <..., SignInDelegate> {
        ...
        SignInVC *signIn;
        ...
    }
    
    -(void)signInCompleted;
    
    @end
    
    现在,为
    signInVC
    提供一个代理属性,该属性将在以模式呈现之前设置,并在登录过程完成时向代理发送一条消息

    // in .h
    @property(retain) id <SignInDelegate>delegate;
    
    // in .m
    @synthesize delegate;
    
    -(IBAction)validateSignIn {
        ...
        [delegate signInCompleted];
    }
    


    关于中的委托和通知的更多信息。

    您刚才写的内容让我觉得我错过了一些重要的东西……我没有任何一个类是TabBarController-所有内容都在AppDelegate(上面)中声明,我从AppDelegate转到firstTabBar对象(第一个选项卡的视图控制器)。因此,我所有的类都是:AppDelegate、FirstTabViewController、SecondTabVireController、HomePage(带有登录/注册按钮、登录视图和注册视图)。我需要为TabBarController单独创建一个类吗?如果这样做会更容易。但是,在“用户登录”中,你在做什么呢块也足够了。我不明白的是如何在signInViewController中执行此操作?我没有任何TabBarController对象可调用…所有内容都在AppDelegate中!请帮助…:(您不应该将两个控制器都放在AppDelegate中。@Vince建议的是最好的方法。但是如果您不想这样做,我建议您在AppDelegate中设置SignenViewController,当用户登录时,您设置tabbarcontroller,删除currentcontroller,然后添加t。)abbarcontroller到AppDelegate。你刚才写的东西让我觉得我错过了一些重要的东西…我真的没有任何一个类是TabBarController-一切都在AppDelegate(上面)中声明,从AppDelegate我转到第一个tabbar对象(第一个选项卡的视图控制器)因此,我所有的类都是:AppDelegate、FirstTabViewController、SecondTabVireController、HomePage(带有登录/注册按钮、登录视图和注册视图)。我是否需要为TabBarController创建一个单独的类?如果这样做会更容易。但您在“用户登录”中所做的是什么块也足够了。我不明白的是如何在signInViewController中执行此操作?我没有任何TabBarController对象可调用…所有内容都在AppDelegate中!请帮助…:(您不应该将两个控制器都放在AppDelegate中。@Vince建议的是最好的方法。但是如果您不想这样做,我建议您在AppDelegate中设置SignenViewController,当用户登录时,您设置tabbarcontroller,删除currentcontroller,然后添加t。)abbarcontroller发送给AppDelegate。谢谢Vince,我会尝试并报告。嘿@Vince-你的示例中的setDelegate是什么?谢谢!嘿@Vince-如果AppDelegate和登录之间有另一个页面,你知道如何实现你的解决方案吗?(这是一个欢迎视图控制器)?谢谢!!@TommyG-我会使用计时器。只需先显示所需的视图,然后设置计时器,1)删除欢迎视图2)使用tabBarController设置窗口的rootViewController,并以VC模式显示登录。这里…你介意我向你发送代码吗?我太绝望了…我在登录和注册页面中实例化了AppDelegate,做了一些奇怪的事情,这样我就可以调用tabBarController,但这听起来确实错误,尽管它可以工作。谢谢Vince,我会试试,然后再报告。嘿@Vince-你的例子中的setDelegate是什么?谢谢!嘿@Vince-如果我在AppDel之间有另一个页面,你知道如何实现你的解决方案吗