我有一个带有UINavigationGroup
的根视图控制器的MainViewController
。在这个MainViewController
中,我将另一个UINavigationController
称为模态,如下所示:
- (IBAction)didTapButton:(id)sender {
UINavigationController * someViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someNavigationController"];
[self.navigationController presentViewController:someViewController animated:YES completion:nil];
}
在此
someNavigationController
内,用户正在经历一些过程,因此使用某些UIViewControllers
推送了导航控制器。用户完成该过程之后,在最后一个称为UIViewController
的finalStepViewController
中,我将关闭模态,如下所示:[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
中删除,否则观察者将永远不会被释放。