我想从类视图方法1中回到我的根视图。当在视图1的实例方法中时,我只想说
[self.navigationController popViewControllerAnimated:YES];
但由于self
不适用于类方法,我想知道如何实现这一点。与下图相关,我目前处于View1Controller.m的类方法中,我想回到Rootview。感谢。
答案 0 :(得分:2)
您可以声明另一种方法:
-(void)closeThisViewController
{
[self.navigationController popViewControllerAnimated:YES];
}
然后使用NotificationCenter:
[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_closeThisVC" selector:@selector(closeThisViewController) object:nil];
虽然正如jonkroll所说,你正在处理视图控制器的东西,但我们不明白你为什么要将视图控制器相关的代码放在类方法中。
对不起上面的错误代码。
我的意思是说你可以使用NSNotificationCenter发布通知:
-(void)postNotificationName:(NSString *)notificationName object:(id)notificationSender
然后在同一个视图中,控制器声明一个NSNotificationCenter观察者:
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
我的大脑比我的手指快,所以当我试图解释解决方案时,我将两者合二为一:P
它应该更像这样:
// posting a notification with NSNotificationCenter
[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_closeThisVC" object:nil];
在某处的viewDidLoad方法中(我建议在顶部),添加:
-(void)viewDidLoad
{
// adding an observer with NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeThisViewController) name:@"notif_closeThisVC" object:nil];
...
}
希望有所帮助。
答案 1 :(得分:1)
如果你不想将它从类方法重构为实例方法(并且肯定会有你不希望这样做的情况),我建议你在你的类中添加一个完成块参数方法:
+ (void)doSomethingWithCompletion:(void(^)())completion {
/* Do your thing... */
completion();
}
- (IBAction)doSomething:(id)sender {
[self.class doSomethingWithCompletion:^{
[self.navigationController popViewControllerAnimated:YES];
}];
}
这将允许您干净地将类方法执行的无实例操作与特定于实例的视图控制器的解除分开。如果操作可能失败,您还可以使完成块接受错误对象。
您可以使用委托对象执行类似的操作,甚至可以通过传递视图控制器来解散,但这种设计似乎提供了最清晰的分离和最现代的感觉。
答案 2 :(得分:0)
有合理的论据鼓励您重构,以便您可以访问当前的视图控制器,并可以通过currentVC.navigationController
访问导航控制器。请记住,它仍然可以是一个类方法,只需在从VC调用它(或启动调用它的调用链)时给它一个额外的参数。
但是,我还必须在我的一个应用程序中解决这个问题,所以我确保导航控制器全局可供所有人访问,总是通过指针(“弱参考”)
如果你声明一个这样的全局变量(例如,在“Navigation.h”中)
extern UINavigationController *gNavController;
并在AppDelegate.m
中对其进行定义(如果你生锈了,请付费审核声明/定义之间的区别):
UINavigationController* gNavController;
然后在application:didFinishLaunchingWithOptions:
启动时分配它:
(假设委托有一个名为viewController
的属性,它是您的导航控制器):
gNavController = viewController;
然后只要您#import Navigation.h
,您就可以随时访问导航控制器。这也使得弹出/弹出窗口的视图处理变得更加简单。
这也假设您的导航控制器在应用程序的生命周期内永远不会被释放(除非您做一些不寻常的事情,否则可能是真的。)