2013-02-16 2 views
3

У меня есть контроллер представления вкладки и контроллер представления Войти в Xcode 4.6 с прошивкой 6.1 SDKIOS 6: представить контроллер представления модально

enter image description here

Когда начало приложение загружается в "View Controller 1" , Как я могу показать окно входа в систему, если пользователь не зарегистрирован? В viewDidLoad() в View Controller 1 я должен вставить этот код:

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]; 

}

Но ничего не произошло. Как я могу показать контроллер входа в систему?

Спасибо за вашу поддержку

+0

Убедитесь, что «контроллер» не равен нулю, и вы указали идентификатор в StoryBoard. – kezi

+0

«Контроллер» не равен нулю, а идентификатор в раскадровке правильный! – Tom

ответ

2

Я использую Xamarin Студию 4.0 с Xcode 4.6 и прошивкой 6.1, и я был в состоянии показать экран входа в систему с помощью раскадровки. Мой код находится на C#, но я уверен, что вы можете перевести его в эквивалент Objective-C.

При использовании раскадровки Window и RootViewController уже будут установлены с «Начальной сценой» из раскадровки. Поэтому в AppDelegate я создаю экземпляр моего 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 и действие для кнопки входа. После того, как он выполнит вход в систему, я перезагружаю 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 может быть автономным, как и у вас в раскадровке. Его не нужно подключать к каким-либо другим сценам или нуждаться в каких-либо сегментах.

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 Делегате как это:

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

В App Делегате , вот метод «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]; 
} 
Смежные вопросы