0

Привет У меня есть приложение в тот момент, когда в настоящее время имеется контроллер с раздельным просмотром. Что я хочу сделать, так это добавить экран входа в систему, чтобы появиться до появления остальной части приложения, или если это невозможно, оно может появиться в левой части экрана контроллера навигации.Экран входа в SplitView Ipad

В моем приложении делегат в настоящий момент

// Override point for customization after application launch. 
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 

    //Grab storyBoard 
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 

    //Grab a reference to the UISplitViewController 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 

    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
    //splitViewController.delegate = (id)navigationController.topViewController; 

    //NEW IMPLEMENTATION BELOW 

    //Grab a reference to the RightViewController and set it as the SVC's delegate.  
    RightViewController *rightViewController = (RightViewController *) [[splitViewController.viewControllers objectAtIndex:1] topViewController]; 

    splitViewController.delegate = rightViewController; 

    //Grab a reference to the LeftViewController and get the first asset in the list. 
    UINavigationController *leftNavController = [splitViewController.viewControllers objectAtIndex:0]; 

    LeftViewController *leftViewController = (LeftViewController *)[leftNavController topViewController]; 

    AssetTracking *firstAsset = [[leftViewController assets] objectAtIndex:0]; 

    //Set it as the RightViewController's monster. 
    [rightViewController setAssetTracking:firstAsset]; 

    //Set the RightViewController as the left's delegate. 
    leftViewController.delegate = rightViewController; 


    } 
    return YES; 
} 

Я пытался добавить это, но это не похоже на работу

LoginViewController *lvc = (LoginViewController *) [storyBoard instantiateViewControllerWithIdentifier:@"login123"]; 
lvc.modalPresentationStyle = UIModalPresentationFullScreen; 
[splitViewController presentViewController:lvc animated:NO completion:nil]; 

Если добавить его в конце я получаю сообщение об ошибке при попытке для его запуска

Предупреждение: попытка представить LoginViewController: 0x9b5c5a0 на UISplitViewController: 0x9b64120, чей вид не находится в иерархии окон!

Есть ли способ заставить этот экран работать/появляться. В настоящее время представление на раскадровке не связано ни с чем с помощью segue, и я просто вызываю его по идентификатору.

Это метод я использую для проверки пользователя

- (IBAction)enterCredentials 
{ 

NSString *hashedPassword = @""; 
hashedPassword = [self sha1:(passwordField.text)]; 

if ([[credentialsDictionary objectForKey:usernameField.text]isEqualToString:hashedPassword]) { 

    if([rememberLogin isOn]) 
    { 
     NSLog(@"save user details"); 

     if ([usernameField text ]){ 
      [keychain setObject:[usernameField text] forKey:(__bridge id)kSecAttrAccount]; 
     } 
     // Store password to keychain 
     if ([passwordField text]){ 
      [keychain setObject:[passwordField text] forKey:(__bridge id)kSecValueData]; 
     } 
    }else 
    { 
     NSLog(@"not saving user details"); 
     [keychain resetKeychainItem]; 
    } 

    usernameField.text = @""; 
    passwordField.text = @""; 


    //[self dismissViewControllerAnimated:NO completion:nil]; 
    [self performSegueWithIdentifier:@"loginCorrect" sender:self]; 
} 
else { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"The Username Or Password You Entered Is Incorrect" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
    [alert show]; 
} 
} 

ответ

-1

Из сообщения об ошибке, вы можете увидеть, что взгляд UISplitViewController является не прикреплен к основному UIWindow еще, как вы пытаетесь представить LoginViewController.

Попробуйте отложить код, который представляет модальный LoginViewController. Возможно, используя dispatch_after, чтобы проверить эту идею. Если это так, вы должны найти код более подходящего времени для вызова.

И, возможно, вам стоит подумать о том, чтобы установить LoginViewController как rootViewController, когда это необходимо. Таким образом, вы можете скрыть весь UISplitViewController.

Например:

// in application:DidFinishLaunchingWithOptions: 
if (/* iPad idiom && login required */) { 
    LoginViewController *lvc = (LoginViewController *) [storyBoard instantiateViewControllerWithIdentifier:@"login123"]; 
    self.window.rootViewController = lvc; 
} else { 
    // setup your UISplitViewController as usual 
} 
+0

Так что теперь, если я установить его в качестве RootViewController в DidFinishLaunchWithOptions, как я могу получить обратно к установке другого, как мой rootView, когда пользователь проверен. См. Выше, чтобы увидеть метод, который я использую для их проверки. Я пытался использовать segue, но это, очевидно, больше не будет работать – Karl

+0

Когда пользователь будет проверен, вы можете сообщить сообществу appDelegate или другому ответственному экземпляру через шаблон делегирования или уведомления. Когда ответственный экземпляр информирован, он может поменять окно window.rootViewController appDelegate обратно на UISplitViewController. –

+0

Извините, но не могли бы вы объяснить, как это сделать? Спасибо – Karl

Смежные вопросы