我在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];
但没有任何反应。
答案 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吗?