【问题标题】:Calling popViewControllerAnimated from an UIView subclass从 UIView 子类调用 popViewControllerAnimated
【发布时间】:2015-03-16 11:59:25
【问题描述】:

我在 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];

但是什么也没发生。

【问题讨论】:

  • 请不要尝试以这种方式访问​​控制器。它打破了 MVC 的所有设计模式。视图永远不必了解控制器架构。将按钮的代码放入控制器中。
  • 即使我尝试从 viewController 触发方法仍然没有任何反应 ContentViewController*vc; [vc backToMainMenu]; @ryancrunchi
  • 为什么不用simple for popviewcontroller,[self.nagigationController popViewControllerAnimated:YES];
  • @virus 我告诉过这个方法在一个自定义类中,它是UIView的子类
  • 控制台中是否记录了任何错误,如果这有助于找出问题?

标签: ios objective-c iphone xcode


【解决方案1】:

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

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

目标应该是这样的:

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

【讨论】:

  • 还是什么都没有!奇怪的是我以前也遇到过同样的问题,但这不起作用! !! !
  • 愚蠢的问题,但不得不问:我认为这个带有按钮的视图控制器被按下而不是模态并且调用了 backToMainMenu 方法?
  • 另外,您的视图层次结构是什么?那里的任何东西,比如你推动一个导航控制器,根是一个拆分视图控制器等......
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    来自 UIViewController 类参考: 如果接收器或其祖先之一是导航控制器的子级,则此属性包含拥有的导航控制器。如果视图控制器没有嵌入到导航控制器中,则此属性为零。

    所以你看,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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多