finalStepViewController

finalStepViewController

我有一个带有UINavigationGroup的根视图控制器的MainViewController。在这个MainViewController中,我将另一个UINavigationController称为模态,如下所示:

- (IBAction)didTapButton:(id)sender {
    UINavigationController * someViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someNavigationController"];
    [self.navigationController presentViewController:someViewController animated:YES completion:nil];
}

在此someNavigationController内,用户正在经历一些过程,因此使用某些UIViewControllers推送了导航控制器。用户完成该过程之后,在最后一个称为UIViewControllerfinalStepViewController中,我将关闭模态,如下所示:
[self dismissViewControllerAnimated:YES completion:nil];
模态确实被取消了,用户又回到了初始的MainViewController
但是,我想将另一个UIViewController推送到MainViewController的NavigationController中(例如:表示用户已成功完成该过程的视图)。最好在模态被消除之前。

我尝试了以下操作:

1.使用presentingViewController
UIViewController * successViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"successViewController"];
[self.presentingViewController.navigationController successViewController animated:YES];

结果:没有错误,但是也没有任何反应。

2.委托/协议
  • finalStepViewController.h中导入了MainViewController.h,并附加了<finalStepViewControllerDelegate>
  • MainViewController.m内部添加了一种称为parentMethodThatChildCanCall的方法,该方法可以从finalStepViewController.m调用
  • finalStepViewController.h中添加了以下内容:
    @protocol finalStepViewControllerDelegate <NSObject>-(void)parentMethodThatChildCanCall;@end@property (assign) id <finalStepViewControllerDelegate> delegate;@synthesize delegate;模型中的someViewController
  • 在上述didTapButton IBAction中将委托属性设置为Assigning to id<UINavigationControllerDelegate>' from incompatible type UIViewController *const __strong'到self。这显示了一个通知错误,说:[self.delegate parentMethodThatChildCanCall]
  • 在关闭模态之前,最后调用了parentMethodThatChildCanCall

  • 结果:除通知错误外,没有失败,但未发生任何事情,因为未调用ojit_code。

    知道我在做什么错/应该做什么吗?这是我第二周做Objective-C,大部分时间我都不知道自己在做什么,因此任何帮助/代码都将不胜感激!

    谢谢。

    最佳答案

    您可以使用NSNotificationCenter轻松实现这一点。

    在您的MainViewController-viewDidLoad中添加以下代码

      typeof(self) __weak wself = self;
      [[NSNotificationCenter defaultCenter] addObserverForName:@"successfullActionName"
                                                        object:nil
                                                         queue:[NSOperationQueue mainQueue]
                                                    usingBlock:^(NSNotification *note) {
                                                      SuccessViewController *viewController; // instantiate it properly
                                                      [wself.navigationController pushViewController:viewController animated:NO];
                                                    }];
    

    取消分配时从NSNotificationCenter删除控制器
    - (void)dealloc {
      [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    FinalStepViewController上执行的操作,在取消发布通知之前关闭视图控制器
    - (IBAction)buttonTapped:(id)sender {
      [[NSNotificationCenter defaultCenter] postNotificationName:@"successfullActionName" object:nil];
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    这个例子很粗糙,也不是理想的选择,您应该使用常量作为通知名称,并且在某些情况下,应存储NSNotificationCenter返回的观察者以删除特定的观察者。

    -编辑
    我还要提及的是,addObserverForName:object:queue:usingBlock:方法实际上将观察者作为id类型对象返回。您需要将对它的引用存储为类中的iVar,并在调用NSNotificationCenter方法时将其从dealloc中删除,否则观察者将永远不会被释放。

    07-24 14:07