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

时间:2015-12-17 06:05:19

标签: ios iphone swift uiviewcontroller

我正在用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.
    }

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

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)
                    }

不,没有采取任何行动。我的意思是视图控制器没有被解雇。

4 个答案:

答案 0 :(得分:0)

此行应该有效

viewController.dismissViewControllerAnimated(false, completion: nil)

您可以将if条件更改为

if viewController.isKindOfClass(HomeVC.classForCoder())

答案 1 :(得分:0)

对于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;

答案 2 :(得分:0)

只需在 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()
                }
            }
        }

我希望这有效。 。

答案 3 :(得分:0)

<强>更新

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

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

您的代码应如下所示:

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

注意:我不确切知道您的代码和设置是什么样的,因此您可能需要尝试一下才能使用它,具体取决于它是否可以使用根视图等