从UIView子类调用popViewControllerAnimated

时间:2015-03-16 11:59:25

标签: ios objective-c iphone xcode

我在UIView子类中创建了一个按钮。我需要通过此按钮拨打popViewControllerAnimated,但没有任何作用!我看不到viewController回到rootViewController。这是我的代码:

- (void)SomeFunction {

 backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton showsTouchWhenHighlighted];

        [backButton addTarget:self
                       action:@selector(backToMainMenu)
             forControlEvents:UIControlEventTouchUpInside];

}

- (void)backToMainMenu {

    [self.window.rootViewController.navigationController popViewControllerAnimated:YES];

    NSLog(@"back");
}

我将代码更改为:

UINavigationController *vc = self.window.rootViewController.navigationController;
    [vc.navigationController popViewControllerAnimated:YES];

但没有任何反应。

3 个答案:

答案 0 :(得分:1)

我认为你需要使用正确的目标格式,它将按钮作为参数。所以添加这样的目标函数:

[backButton addTarget:self
               action:@selector(backToMainMenu:)
     forControlEvents:UIControlEventTouchUpInside];

并且目标应如下所示:

- (void) backToMainMenu:(UIButton *) sender{
  [self.navigationController popViewControllerAnimated:YES];
}

答案 1 :(得分:1)

更好的选择是使用 Delegate 模式,因为在您当前的逻辑中,您正在破坏MVC架构和指南。

在子视图类中创建Protocol。此委托的接收者将是您正在显示视图的视图控制器类。在事件处理按钮时,调用委托方法,然后从视图控制器中成功调用popViewControllerAnimated

答案 2 :(得分:0)

我相信你的基本问题(除了设计)在(void)backToMainMenu ... self.window.rootViewController.navigationController将为nil,所以这个方法什么都不做

来自UIViewController类的引用: 如果接收器或其祖先之一是导航控制器的子节点,则此属性包含拥有的导航控制器。如果视图控制器未嵌入导航控制器中,则此属性为nil。

所以你看,rootViewController不能嵌入导航控制器里面就可以了,它是最底层的..

为什么不对此进行测试:

{
    UINavigationController *vc = self.window.rootViewController.navigationController;

    if (vc==nil){
    NSLog(@"nav controller is nil, this will never work");
    }

    [vc.navigationController popViewControllerAnimated:YES];
}

我也非常赞同@ rory关于设计的答案..

PS你真的创建了一个UINavigationController来推送这个viewController吗?