1

我想从视图 1 的类方法中返回我的根视图。在视图 1 的实例方法中,我只想说

[self.navigationController popViewControllerAnimated:YES];

但由于self不适用于类方法,我想知道如何实现这一点。关于下图,我目前在 View1Controller.m 的类方法中,我想回到 Rootview。谢谢。

在此处输入图像描述

4

3 回答 3

2

您可以声明另一个方法:

-(void)closeThisViewController
{
    [self.navigationController popViewControllerAnimated:YES];   
}

然后使用通知中心:

[[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];

    ...
}

希望有帮助。

于 2012-11-29T01:43:55.917 回答
1

如果您不想将其从类方法重构为实例方法(当然在某些情况下您不想这样做),我建议您在类方法中添加一个完成块参数:

+ (void)doSomethingWithCompletion:(void(^)())completion {
    /* Do your thing... */
    completion();
}

- (IBAction)doSomething:(id)sender {
     [self.class doSomethingWithCompletion:^{
          [self.navigationController popViewControllerAnimated:YES];
     }];
}

这将允许您将类方法执行的无实例操作与视图控制器的特定于实例的解除完全分开。如果操作失败,您还可以使完成块接受错误对象。

您可以对委托对象执行类似的操作,甚至可以通过传入视图控制器来关闭,但这种设计似乎提供了最干净的分离和最现代的感觉。

于 2012-11-29T02:00:27.140 回答
0

会有一些合理的论据鼓励你重构,这样你就可以访问当前的视图控制器,并且可以通过currentVC.navigationController. 请记住,它仍然可以是类方法,只需在您从 VC 调用它(或启动调用它的调用链)时给它一个额外的参数。

但是,我还必须在我的一个应用程序中解决这个问题,所以我只是确保每个人都可以全局访问导航控制器,总是通过指针(“弱引用”)

如果您声明这样的全局变量(例如,在“Navigation.h”中)

extern UINavigationController *gNavController;

并在您的中定义它AppDelegate.m(如果您对此感到生疏,请查看声明/定义之间的区别):

UINavigationController* gNavController;

然后在您启动时分配它application:didFinishLaunchingWithOptions::(假设委托有一个名为的属性viewController,即您的导航控制器):

gNavController = viewController;

然后,只要您#import Navigation.h,您就可以随时访问导航控制器。这也使得处理弹出窗口/弹出窗口的视图变得更加简单。这还假设您的导航控制器在应用程序的整个生命周期内都不会发布(可能是真的,除非您正在做一些不寻常的事情)。

于 2012-11-29T01:46:37.573 回答