2014-10-30 91 views
0

我正在开发一个基于用户名密码的系统的应用程序。我的初始视图控制器被命名为LoginPageViewController。如果用户成功登录,则加载名为MyNavigationController的导航控制器。除LoginPageViewController之外的所有视图控制器都可以通过我在此处找到的侧边菜单访问:Side Menu LibraryMyNavigationController的帮助下。如何在Swift中加载初始视图控制器?

我的侧边菜单的视图设置在MyMenuTableViewController中描述,如果选择了任何表项,则从MyMenuTableViewController加载相关视图控制器。问题是,我还在我的侧面菜单(或菜单表,无论您称之为什么)中添加了“注销”项目,并且如果选择此项目,它会向服务器请求注销HTTP POST,并应加载LoginPageViewController这是我的初始视图控制器(它不嵌入MyNavigationControlelr)。

问题是,虽然注销请求处理成功,但我在加载初始视图控制器(LoginPageViewController)时遇到了问题。

当我尝试这个时候选择退出:

self.presentViewController(destViewController, animated: true, completion: nil) 

LoginPageViewController是正装,但我得到的消息,如:2014-10-30 16:59:26.038 iOpsGenie[2973:66509] Presenting view controllers on detached view controllers is discouraged <iOpsGenie.MyMenuTableViewController: 0x7f85e8fc3f10>. ,如果我点击登录页面的任何地方,我的视野中消失,只有白色屏幕被留下。

然后我试图在实施方法

func resetAppToFirstController() { 
    self.window?.rootViewController = LoginPageViewController(nibName: nil, bundle: nil) 
    } 

AppDelegate.swift并调用它时,被选择的项注销:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
appDelegate.resetAppToFirstController() 

然后我在viewDidLoad中的第二行的错误LoginPageViewController的功能如:

fatal error: unexpectedly found nil while unwrapping an Optional value 

我知道这成了一个很长的问题。我可能被视为Swift和iOS编程的新手,我试图说明问题以防止无关紧要的响应。我真的很想知道我错过了什么。

self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier(PageNames.LOGIN_PAGE) as LoginPageViewController 

和烧成点击注销时,下面的代码:

问候

+0

当实例在resetApp的LoginPageVC(),你应该传递厦门国际银行的名字,而不是零的第一个参数。 Swift没有像Objective-C那样找到与VC相同名称的笔尖。 – JMFR 2014-10-30 16:00:07

回答

3

我改变resetAppToFirstController的方法来解决这个问题

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
appDelegate.resetAppToFirstController() 

但是,我不知道为什么这是有效的。任何一点小小的解释都会很棒。

1

在迅速我们可以改变根视图控制器和在该情况下,所有其它 视图控制器将解除分配,他们将不再是在层次 。

要加载初始视图控制器或更改根视图控制器或作出迅速

let storyboard = UIStoryboard(name: "StartingPage", bundle: NSBundle.mainBundle())  
let loginView: SignInVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInVC 
UIApplication.sharedApplication().keyWindow?.rootViewController = loginView 
+0

谢谢你正在寻找这个。 – 2017-02-14 15:22:40

0

注销操作请允许我提出一个更好的方式做你想要什么,好吗? 我在发布的另一个问题中遇到了类似的问题;请看this question的接受答案。

注意答案上的故事板。它具有视图控制器的层次结构,允许从登录控制器启动,浏览多个控制器并从菜单执行注销。

为了执行此操作,请按照下列步骤操作。

  1. 使您的初始视图控制器成为一个导航控制器,其根视图为您的登录控制器。

  2. 使您的登录控制器推入Segue的菜单控制器。

  3. 从菜单视图的“注销”按钮执行“退出继续”到登录视图。

展开segue将从导航堆栈中删除所有视图,直到它到达您指定的视图。

放松segues真的很容易使用,可以解决很多问题!

添加你登录的视图控制器上的以下方法定义:

@IBAction func unwindToLoginScreen(segue:UIStoryboardSegue) { 
} 

然后,在故事板编辑器,可从中选择您希望能够放松任何视图控制器。在视图控制器的顶部有三个图标。

enter image description here

第一代表视图控制器;第二个是第一响应者;第三个是出口门。

执行“控制+拖动”从第一个图标到第三个图标;将会出现一个下拉菜单,引用您在代码中所做的所有“unwind segue”声明。我们的unwindToLoginScreen segue应该出现在这里。选择它。

enter image description here

在在故事板编辑器左边栏中的文档大纲将在视图控制器的层次结构出现的开卷Segue公司。选择它并将其标识符更改为“登录”之类的内容。

现在,如果您想要返回到登录屏幕,您可以调用performSegueWithIdentifier(“Login”)。

使用unwind segues的好处在于,您确实知道堆栈中的所有视图都将被释放,您可以在源视图控制器的prepareForSegue方法中调用准备代码,目标视图控制器中的某些代码就在结束赛格之前;并且不同的视图控制器之间的连接在故事板编辑器上可见(虽然不像常规赛段那样明显)。

0

斯威夫特4

语法在swift4改变:如果你想去 “FirstViewController” 在故事板 “主” 试试下面的代码

令故事情节= UIStoryboard(名称: “主” ,bundle:Bundle.main)

let firstviewcontroller = storyboard.instantiateViewController(withIdentifier:“FirstViewController”)as! FirstViewController

UIApplication.shared.keyWindow?.rootViewController = firstviewcontroller

相关问题