【问题标题】:Remove VC after presenting VC code not working显示 VC 代码不起作用后删除 VC
【发布时间】:2016-09-03 05:29:22
【问题描述】:

与 Instagram 类似,如果用户已经通过检查 NSUserDefault 登录,我的应用程序会将 Tabbar VC 显示为根 VC。我有以下代码处理注销以返回登录屏幕

    if LOGIN_SCREEN_SHOWN == true {
            self.dismissViewControllerAnimated(true, completion: nil)

        } else {
            let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginVC") as! LoginVC
            self.presentViewController(loginVC, animated: true) {
                //self.removeFromParentViewController()
                self.tabBarController!.removeFromParentViewController()
                let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
                appDelegate.window?.rootViewController = loginVC
                LOGIN_SCREEN_SHOWN = true
            }
        }

基本上 LOGIN_SCREEN_SHOWN 在 LoginVC 的 viewWillAppear 中设置为 true,表明我们已经从 LoginVC 中分离出来。

我的所有 VC 中都有带有打印输出的 deInit 代码。我发现如果 LOGINSCREENSHOWN == TRUE,dismissViewControllerAnimated 正在做我想做的事,并在我的所有 VC 打印中调用所有 deInit 代码

NavVC Deinit Successfully
NavVC Deinit Successfully
NavVC Deinit Successfully
NavVC Deinit Successfully

VC1 Deinit Successfully
VC2 Deinit Successfully
VC3 Deinit Successfully
VC4 Deinit Successfully

但是,在“其他”下的代码中,我在其中显示 Login VC 并尝试在出现 LoginVC 后从中删除 VC,但并没有给我打印输出,表明代码没有做我想做的事情。有人可以指出我正确的方向

----更新----

这是来自 Ketan Parmar 的最终代码。我已经修改了过渡类型和持续时间来模仿dismissViewControllerAnimated 动画

        if LOGIN_SCREEN_SHOWN == true {
            self.dismissViewControllerAnimated(true, completion: nil)

        } else {
            // Custom transition
            let transition : CATransition = CATransition()
            transition.duration = 0.35
            transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
            transition.type = kCATransitionReveal
            transition.subtype = kCATransitionFromBottom

            let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginVC") as! LoginVC
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.window?.layer.addAnimation(transition, forKey: nil)
            appDelegate.window?.rootViewController = loginVC
            LOGIN_SCREEN_SHOWN = true
        }

【问题讨论】:

  • 你在哪个方法中实现 self.dismissViewControllerAnimated(true, completion: nil) ?
  • dissmissViewControllerAnimated 在 VC4 中使用 logoutBtn 实现
  • @Mr.UB,这与您链接的问题无关
  • hmm..1 查询:为什么要使用这行代码:self.tabBarController!.removeFromParentViewController()?

标签: ios objective-c uiviewcontroller


【解决方案1】:

您应该在appdeledate 中进行管理,例如首先检查您的用户是否已登录(userdefaults 或其他)?如果是,则什么也不做,因为您已将tabBarVC 设置为storyboard 中的初始视图控制器。现在,如果不是,则意味着您要显示loginViewController,然后实例化loginViewController 并将其设置为窗口的rootviewcontroller。并在成功登录后通过segue或instantiate显示tabbarVC。不是这样的。

更新:

    let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginVC") as! LoginVC
   let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window?.rootViewController = loginVC

这么多代码只需要将loginVC 设置为rootVC。​​

更新 2:

对于动画,在设置rootVC之前添加下面的代码sn-p,

 let transition : CATransition = CATransition()
    transition.duration = 0.2
    transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromLeft
    (UIApplication.sharedApplication().delegate as! AppDelegate).window?.layer.addAnimation(transition, forKey: nil) 

【讨论】:

  • 这几乎正是我已经在做的事情。但是上面提到的问题是,如果用户有tabBarVC作为rootVC,并且因为他想退出而想回到loginVC,代码不会导致现有的VCs deinit
  • 能否请您看一下我的代码并提供示例。因为正如您在我的其他部分中看到的那样,我确实尝试将 loginvc 设置为 root vc,但它没有工作。干杯
  • 行得通!谢谢冠军。一个问题,没有动画这样做,因为登录屏幕会立即出现。我怎么能做到它有弹出视图控制器或关闭视图控制器的动画?
  • 您好心的先生似乎很热情!感谢您这么快提供这么好的答案。我已经用你的答案更新了问题
猜你喜欢
  • 2012-06-22
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多