[英]Login Screen and Navigation controller
因此,在我的App.Delegate中,我正在這樣做-
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:[NSBundle mainBundle]];
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController: self.loginViewController];
self.window.rootViewController = navigation;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
在我的登錄控制器中,我正在這樣做-
- (IBAction)login:(UIButton *)sender {
NSString *username = self.userName.text;
NSString *password = self.password.text;
[AccountUtils emailLogin:username password:password useCookie:true callback:^(NSDictionary *loginResponseJSON){
if([loginResponseJSON count] != 0){
[self performSelectorOnMainThread:@selector(displaySearchController) withObject:nil waitUntilDone:YES];
// [self performSelectorOnMainThread:@selector(switchState) withObject:nil waitUntilDone:YES];
} else {
//incorrect entry info view here.
}
}];
}
- (void) displaySearchController {
SearchViewController *searchViewController = [[SearchViewController alloc] initWithNibName:@"SearchView" bundle:[NSBundle mainBundle]];
UINavigationController *navigator = self.navigationController;
[navigator popViewControllerAnimated: YES];
[navigator pushViewController: searchViewController animated:YES];
}
如果我正確登錄,則進入第二個控制器的視圖,但是在頂部,我仍然被允許“返回”登錄頁面。 我不希望這種情況發生,我認為popViewControllerAnimated行會解決這種情況。 如何使登錄時不返回登錄頁面?(換句話說,我想將登錄控制器從導航控制器的堆棧中彈出?)
如果您只想刪除loginVC,則可以在用戶登錄后將新的NavigationController設置為AppDelegate的rootViewController。因此,您可以在AppDelegate
移動displaySearchController
方法,並在用戶登錄后調用該方法(從loginVC)。登錄:
-(void)displaySearchController{
SearchViewController *searchViewController = [[SearchViewController alloc] initWithNibName:@"SearchView" bundle:[NSBundle mainBundle]];
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController: searchViewController];
self.window.rootViewController=navigation;
}
否則,如果您確實想要推送動畫,則可以從SearchDispalyController的viewDidAppear
中的navigationController viewControllers堆棧中刪除loginVC:
-(void)viewDidAppear:(BOOL)animated{
NSMutableArray *stackVCs=[self.navigationController.viewControllers mutableCopy];
int idx=[stackVCs indexOfObject:self];
//this remove the previous viewcontroller from the stack
[stackVCs removeObjectAtIndex:idx-1];
self.navigationController.viewControllers=stackVCs;
[super viewDidAppear:animated];
}
同樣在loginVC中,在按下searchVC之前,您應該調用它以隱藏“后退”按鈕:
[navigation.navigationItem setHidesBackButton:YES];
您不想將UINavigationController與LoginViewController一起使用,也不想推送SearchViewController。 而是將UINavigationController與SearchViewController一起使用,並在顯示時將其設為rootViewController。
這樣做可以實現您想要的。
displaySearchController
方法移至AppDelegate.m
文件 AppDelegate.h
文件中聲明displaySearchController
方法 現在,將AppDelegate.m
文件中的displaySearchController
方法定義為:
- (void) displaySearchController { SearchViewController *searchViewController = [[SearchViewController alloc] initWithNibName:@"SearchView" bundle:[NSBundle mainBundle]]; UINavigationController *navigator = [[UINavigationController alloc]initWithRootViewController:searchViewController]; self.window.rootViewController = navigator; }
從您的loginController
調用新的本地方法showNewViewController
:
[self performSelectorOnMainThread:@selector(showNewViewController) withObject:nil waitUntilDone:YES];
現在在您的loginController.m
文件中將showNewViewController
定義為
-(void)showNewViewController {
AppDelegate *appDele = [UIApplication sharedApplication].delegate;
[appDele displaySearchController];
}
不要忘記將AppDelegate.h
文件導入到您的loginController.m
這一定會對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.