3

我在带有 iOS 6.1 sdk 的 xcode 4.6 中有一个选项卡视图控制器和一个登录视图控制器

在此处输入图像描述

加载应用程序启动时,“视图控制器 1”。如果用户未登录,我如何显示登录视图?在 View Controller 1 的 viewDidLoad() 中,我插入了以下代码:

MyNewAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
if(!appDelegate.isUserLogged){

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    LoginViewController *controller = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"LoginView"];
    [self presentViewController:controller animated:YES completion: nil];

}

但什么也没有发生。如何显示登录视图控制器?

谢谢你的支持

4

2 回答 2

2

我将 Xamarin Studio 4.0 与 Xcode 4.6 和 iOS 6.1 一起使用,并且能够使用情节提要显示登录屏幕。我的代码是用 C# 编写的,但我相信你可以将它翻译成 Objective-C 的等价物。

使用情节提要时,Window 和 RootViewController 已经使用情节提要中的“初始场景”进行设置。因此,在 AppDelegate 中,我使用其“故事板 ID”实例化了 LoginViewController 的一个实例。然后我缓存当前 RootViewController 的一个实例,然后将新的 LoginViewController 设置为 RootViewController。

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    LoginViewController loginController;

    public override UIWindow Window { get; set; }

    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        loginController = Window.RootViewController.Storyboard.InstantiateViewController("LoginScene") as LoginViewController;
        loginController.InitialViewController = Window.RootViewController;

        Window.RootViewController = loginController;

        return true;
    }
    //... other overrides ...
}

在 LoginViewController 中,我创建了一个属性来保存 InitialViewController 和登录按钮的 Action。在它完成登录工作后,我将 RootViewController 重置为缓存的 InitialViewController,然后关闭当前的 LoginViewController。

public partial class LoginViewController : UIViewController
{
    public UIViewController InitialViewController { get; set; }

    public LoginViewController (IntPtr handle) : base (handle)
    {
    }

    partial void OnLoginClicked(MonoTouch.UIKit.UIBarButtonItem sender)
    {
        //... do login work here ...
        UIApplication.SharedApplication.Delegate.Window.RootViewController = InitialViewController;
        DismissViewController(false, null);
    }
}

LoginViewController 可以是独立的,就像您在情节提要中拥有它一样。它不需要连接到任何其他场景或需要任何转场。

于 2013-02-27T21:48:33.720 回答
0

这是对我有用的Objective C代码。请注意,在情节提要上,我将选项卡栏控制器设置为根视图控制器(也就是说,我在“是初始视图控制器”旁边有一个复选标记)。代码会覆盖此设置以使独立登录视图控制器弹出。

//Note that my storyboard file's name is "Main.storyboard"--here you put the name of the storyboard file WITHOUT The extension, which is why I just say "Main" here.        
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//On the storyboard, you must set the Storyboard ID of the Login View Controller to the name "LoginForm" that is used below, so the code can find the View Controller referred to
UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"LoginForm"];
self.window.rootViewController = loginController;

在登录视图控制器中,当它因为登录已被验证正确而准备关闭时,我在 App Delegate 中调用一个方法,如下所示:

//Be sure to import the App Delegate at the top with #import "AppDelegate.h"
AppDelegate *myAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[myAppDelegate showMainScreen];

在 App Delegate 中,这里是“showMainScreen”方法。请注意,我正在关闭临时设置为根视图控制器的登录视图控制器,并将主屏幕放回根视图控制器。

- (void)showMainScreen {
    [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UITabBarController *main = [storyboard instantiateViewControllerWithIdentifier:@"tabBarForm"];
    self.window.rootViewController = main;
}

另一个提示:作为一种安全措施,我喜欢在每次应用程序最小化时弹出登录屏幕,所以我调用applicationWillEnterForeground应用程序委托中的方法作为每次出现登录控制器时交换登录控制器的一种方式:

- (void)applicationWillEnterForeground:(UIApplication *)application {
    [self showLoginScreenIfNecessary];
}
于 2014-11-10T06:48:34.237 回答