1

Я следил за инструкциями parse.com о том, как реализовать login + register + segue на главный контроллер, если регистрация или логин успешны. Это прекрасно работает.Войти Посмотреть контроллер до SWRevealViewController

Я тогда хотел реализовать боковую навигацию с помощью SWRevealViewController. Я следил за ссылкой APPCODA и начал работать, только когда «SWRevealViewController» является начальным контроллером представления.

Когда у меня есть контроллер входа в парсер в качестве начального, я ничего не вижу от навигационного контроллера, а также «SWRevealViewController».

Как я могу это исправить, сделать мои контроллеры входа/регистрации исходными контроллерами и все еще иметь возможность иметь SWRevealViewController при успешном входе в систему?

Я был бы признателен за любую помощь или указатели.

ниже мой APPDelegate.m

#import "AppDelegate.h" 
#import <Parse/Parse.h> 
#import <GoogleMaps/GoogleMaps.h> 

@interface AppDelegate() 

@end 

@implementation AppDelegate 



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

LoginView *lv = [[LoginView alloc]init]; 

SidebarViewController *sbvc = [[SidebarViewController alloc]init]; 
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:lv]; 
UINavigationController *menuVC = [[UINavigationController alloc]initWithRootViewController:sbvc]; 

SWRevealViewController *revealController = [[SWRevealViewController alloc]initWithRearViewController:menuVC frontViewController:nav]; 
revealController.delegate = self; 

self.menu = revealController; 
self.window.rootViewController = self.menu; 


[GMSServices provideAPIKey:@"XXXXXXXXXX"]; 

[Parse setApplicationId:@"XXXXXXXXXXXXX" 
       clientKey:@"XXXXXXXXXXXXX"]; 

[PFAnalytics trackAppOpenedWithLaunchOptions:launchOptions]; 



    return YES; 
    } 
+0

Когда я должен сделать что-то похожее на это в моем приложении (в основном, заменив весь стек навигации один регистрацию/Войти закончено), я начинаю с 'UINavigationController' и (когда регистрация/Войти завершено) , Я нажимаю на свой root 'UIViewController' и (в этом' 'viewDidAppear' 'этого контроллера), а затем заменяет' viewControllers' стек для 'UINavigationController' без анимации. Если это похоже на то, что вы ищете, я могу отправить свой код в качестве ответа. – mbm29414

+0

Позвольте мне взглянуть и посмотреть, как я могу реализовать в своем. Спасибо! – Miguel

ответ

3

В приложениях с пользовательскими сеансами обычно лучше вести регистрацию/регистрацию в отдельной иерархии представлений от остальной части приложения и представлять внутреннюю структуру, если есть активный сеанс. Вы можете достичь этого путем проверки

[PFUser currentUser] 

, как он будет возвращать nil, если пользователь не вошел в систему

Обеспечить проверку в вашем AppDelegate так:.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // .. Rest of your initialization code 

    if ([PFUser currentUser]) { 

     // Let's pop them right to the home screen 
     [self showHomeScreen]; 
    } 
    else { 

     // Present login vc 
     LoginView *lv = [[LoginView alloc] init]; 
     UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:lv]; 
     self.window.rootViewController = nav; 
    } 
    return YES; 
} 

- (void)showHomeScreen { 

    SidebarViewController *sbvc = [[SidebarViewController alloc] init]; 
    UINavigationController *menuVC = [[UINavigationController alloc] initWithRootViewController:sbvc]; 

    UIViewController *home = [[UIViewController alloc] init]; 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:home]; 

    SWRevealViewController *revealController = [[SWRevealViewController alloc] initWithRearViewController:menuVC frontViewController:nav]; 

    self.window.rootViewController = revealController; 
} 

Тогда , путем включения в него

- (void)showHomeScreen; 

в AppDelegate.h, вы можете вызывать этот метод при успешной регистрации/авторизации:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[delegate showHomeScreen]; 
+0

TNX Alex, Но это не сработало для меня. Я получил целую кучу ошибок, когда я попробовал формат выше. Могу ли я сделать что-то неправильно в доске объявлений? – Miguel

+0

А теперь я вижу, где вы сказали «segue» и не понимали, что используете раскадровки. Ваш ответ, который вы описали ниже, должен работать. SWRevealController действует как контейнер с корпусом контроллера переднего и заднего вида –

+0

Теперь я получаю сообщение о том, где находится PFUser, он не инициирует этот сеанс, когда приложение закрыто. мне нужно добавить [PFUser currentUser]; метод для SWreveal? – Miguel

0

Вот как я поменять свою навигационную иерархию после входа пользователей в:

UINavigationController Версия

+ (void)postSignInUICodeFromViewController:(UIViewController *)vc { 
    // Log in was successful 

    // Create new view controller 
    ViewController1 *v1    = [[ViewController1 alloc] init]; 

    typeof(vc) weakVc    = vc; 
    // This is a property that I have added to my 
    // custom UIViewController subclass. As you might 
    // guess, it's called in "viewDidAppear:" 
    v1.viewDidAppearCompletionBlock = ^{ 
     // After pushing the new UI hierarchy into view, 
     // this will delete/remove the rest of the UI stack 
     weakVc.navigationController.viewControllers = @[v1]; 
    }; 
    // At this point (since the block above hasn't yet fired), 
    // you're pushing your new UI hierarchy ON TOP OF the login 
    // view controller 
    [vc.navigationController pushViewController:v1 animated:YES]; 
} 

UITabBarController Версия

+ (void)postSignInUICodeFromViewController:(UIViewController *)vc { 
    // Log in was successful 

    // Create new UI hierarchy 
    ViewController1 *v1    = [[ViewController1 alloc] init]; 
    NavViewController *nav1   = [[UINavController alloc] initWithRootViewController:v1]; 
    ViewController1 *v2    = [[ViewController2 alloc] init]; 
    NavViewController *nav2   = [[UINavController alloc] initWithRootViewController:v2]; 
    ViewController1 *v3    = [[ViewController3 alloc] init]; 
    NavViewController *nav3   = [[UINavController alloc] initWithRootViewController:v3]; 
    ViewController1 *v4    = [[ViewController4 alloc] init]; 
    NavViewController *nav4   = [[UINavController alloc] initWithRootViewController:v4]; 

    TabBarViewController *tabBar = [[TabBarViewController alloc] init]; 
    tabBar.viewControllers   = @[nav1, nav2, nav3, nav4]; 

    typeof(vc) weakVc    = vc; 
    typeof(tabBar) weakTabBar  = tabBar; 
    __weak NavViewController *navVc = (NavViewController *)weakVc.navigationController; 
    // This is a property that I have added to my 
    // custom UITabBarController subclass. As you might 
    // guess, it's called in "viewDidAppear:" 
    tabBar.viewDidAppearCompletionBlock = ^{ 
     // After pushing the new UI hierarchy into view, 
     // this will delete/remove the rest of the UI stack 
     weakVc.navigationController.viewControllers = @[weakTabBar]; 
    }; 
    // At this point (since the block above hasn't yet fired), 
    // you're pushing your new UI hierarchy ON TOP OF the login 
    // view controller 
    [vc.navigationController pushViewController:tabBar animated:YES]; 
} 

В обоих примерах я составил новый класс с именем ViewController1. В примере UITabBarController все остальные также составлены имена классов только для иллюстрации. Вместо этого вам нужно будет ввести имена классов.

+0

Куда я могу положить этот код? @ mbm29414 – Miguel

+0

Вы могли бы объяснить свой код? мне нужно изменить имена контроллеров представления в соответствии с моими? что, если в моем приложении нет каких-либо вкладок? tnx – Miguel

+0

@MiguelBonilla Я переписал новый пример просто для того, чтобы просто нажать диспетчер представлений вместо моей (несколько) сложной ситуации, требующей 'UITabBarController'. Надеюсь, это поможет. Из любопытства, почему вы все еще запрашиваете обновления кода, когда принимаете ответ? – mbm29414

0

ОК, так что я понял это. здесь он идет;

Вместо создания segue для главного контроллера представления создайте его в SWRevealViewController. Я понял, что у SW этот контроллер установлен как «sw_front». Это будет работать только в том случае, если у вас есть это как через PFUser.

2

Я просто узнаю, как программно отображать представление панели управления из приложения делегата. Использование SWRevealViewController & swift 2.0:

на вашем main.storyboard, вы должны определить точку меню (я имел в виду не контроллеры навигации)

для моего меню правой стороны, идентичность inspector-> identiy-> storyboardID = «RIGHT2 ».

для моего левого меню, называемого его «rear2».

мой вид спереди, на навигационном View контроллера, который представляет мой вид приборной панели, я установить идентичность 'приборной панели'

В вашем AppDelegate, под моей функции 'didFinishLaunchingWithOptions':

//this is your main.storyboard 
let storyboard = UIStoryboard(name: "Main", bundle: nil) 

//initialize your FRONT view controller, ie my dashboard view, mine is a UINavigationController, which then presents a table view , ie why i instantiate with a UINavigationController. 

let frontviewcontroller = storyboard.instantiateViewControllerWithIdentifier("dashboard") as? UINavigationController 


//initialize REAR View Controller- it is the LEFT hand menu. 

let rearViewController = storyboard.instantiateViewControllerWithIdentifier("rear2") as? UITableViewController 

//initialize RIGHT View Controller - it is your RIGHT hand menu. 

let rightViewController = storyboard.instantiateViewControllerWithIdentifier("right2") as? UITableViewController 

let mainRevealController = SWRevealViewController() 

mainRevealController.frontViewController = frontviewcontroller 
mainRevealController.rightViewController = rightViewController 
mainRevealController.rearViewController = rearViewController 

self.window!.rootViewController = mainRevealController 
self.window?.makeKeyAndVisible() 

надеюсь, что это поможет кому-то другому. Спасибо D.

0

В вашем входа ViewController создать кнопку Action.

Вы можете установить такой вариант.

@IBAction func btnLoginAction(_ sender: UIButton) { 

    let objAppDelegate = UIApplication.shared.delegate as! AppDelegate 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let rearViewController = storyboard.instantiateViewController(withIdentifier: "backTableVc") as? backTableVc 
    let frontViewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as? ViewController 
    let naviRoot = UINavigationController(rootViewController: frontViewController!) 
    naviRoot.navigationBar.isHidden = true 
    let mainRevealController = SWRevealViewController() 
    mainRevealController.frontViewController = naviRoot 
    mainRevealController.rearViewController = rearViewController 

    UIView.transition(from: (objAppDelegate.window?.rootViewController!.view)!, to: mainRevealController.view, duration: 0.6, options: [.transitionCrossDissolve], completion: { 
     _ in 
     objAppDelegate.window?.rootViewController = mainRevealController 
    }) 
    objAppDelegate.window?.makeKeyAndVisible() 

}