繁体   English   中英

按下主页按钮时关闭视图控制器

[英]Dismiss view controller when the home button pressed

我正在用swift创建一个应用程序。 我有多个viewControllers。 当某个人在一个特定的viewController中按下home键时,那我就想解雇那个ViewController。 我不想在其他视图控制器中执行任何操作。 我发现当我按下主页按钮后,Appdelagate func会打电话

 func applicationDidEnterBackground(application: UIApplication) {
        print("Enter my Guess")
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

所以我设法在我的视图控制器(viewDidLoad)上使用Notifier捕获此操作,如下所示

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("myObserverMethod:"), name:UIApplicationDidEnterBackgroundNotification, object: nil)

func myObserverMethod(notification : NSNotification) {

        if let viewControllers = navigationController?.viewControllers {
            for viewController in viewControllers {
                // some process
                if viewController.isKindOfClass(HomeVC) {
                    print("I am calledr")
//                    dismissViewControllerAnimated(false, completion: nil)

                }
            } 
        }
    }

现在我的问题查看控制器没有解雇。 我的意思是没有动作发生。 怎么处理这个。

注意:每当我按下主页按钮myObserverMethod func调用并打印(“我被叫”)也会调用。

我做错了什么?

编辑1:我想解雇我是否在HomeVC(查看控制器名称),否则无需关闭视图控制器。

编辑2:我发现为什么它总是进入那个如果......条件。 原因始终是将HomeVC保留在内存中。 所以总是进入那个if。 所以我在其中添加另一个条件,如下所示。

 if (viewController.isViewLoaded() && viewController.view.window != nil){

                        print("I am calledr")
                        viewController.dismissViewControllerAnimated(false, completion: nil)
//                          self.presentingViewController!.dismissViewControllerAnimated(false, completion: nil)
                       // viewController.dismissViewControllerAnimated(false, completion: nil)
                    }

不,没有动作发生。 我的意思是视图控制器没有被解雇。

这条线应该有效

viewController.dismissViewControllerAnimated(false, completion: nil)

你可以改变你的if条件

if viewController.isKindOfClass(HomeVC.classForCoder())

对于Obj C ..你可以转换为swift

在app delegate中创建一个方法来再次为vc分配内存

- (void)resetAppToFirstController
{
    UIViewController *obj = [[MainMenuViewController alloc] init];


    //Create Navigation Controller to Hold View Controller
    UINavigationController * navigationController = [[UINavigationController alloc] initWithRootViewController:obj];
   [self.window setRootViewController:navigationController];
}

并在我的homebutton按钮动作

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.resetAppToFirstController;

只需在myObserverMethod方法中使用以下代码即可

if let viewControllers = navigationController?.viewControllers {
            for var i = 0; i < viewControllers.count; i++ {
                // some process
                if ((self.navigationController?.viewControllers[i].isKindOfClass(HomeVC)) != nil) {
                    print("I am calledr")
                    self.navigationController?.viewControllers[i].removeFromParentViewController()
                }
            }
        }

我希望这有效。

更新

而不是使用模态视图控制器,这是我最初假设的, 将适用,你显然使用UINavigationController, 这里记录

导航控制器所谓的堆栈上的项目被“推”并弹出“。所以,就像你在评论中推动控制器一样( navigationController!.pushViewController(controller, animated: false);你必须弹出它是为了摆脱它,像这样: popViewControllerAnimated(_:) 。这会弹出最顶层的VC,但是当你的控制器已经是根(因此,只有)一个时,它不起作用。

您的代码应如下所示:

if viewController.isKindOfClass(HomeVC) {
                    print("I am calledr")
                    navigationController.popViewControllerAnimated(false)
            }

注意:我不确切地知道您的代码和设置是什么样的,所以您可能需要尝试一下它才能工作,这取决于它是否是根视图等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM