gpt4 book ai didi

ios - 从模态或推送 View 调用父方法到 presentingViewController

转载 作者:行者123 更新时间:2023-11-29 12:52:20 25 4
gpt4 key购买 nike

我有一个 UINavigationGroup带有一个名为 MainViewController 的 Root View Controller .这里面MainViewController我正在调用另一个 UINavigationController作为模态如下:

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

在这 someNavigationController 里面,用户正在经历一些过程,所以导航 Controller 被一些 UIViewControllers 推送.用户完成该过程后,在最后UIViewController称为 finalStepViewController ,我将按如下方式关闭模态:

[self dismissViewControllerAnimated:YES completion:nil];

模态确实被取消了,用户回到了最初的MainViewController .不过,我想再推一个 UIViewControllerMainViewController的 NavigationController(例如:表示用户已成功完成流程的 View )。最好在关闭模态之前。

我试过以下方法:

<强>1。使用 presentingViewController

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

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

<强>2。委托(delegate)/协议(protocol)

  • 进口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;在模型中

  • 将委托(delegate)属性设置为 someViewController在上面提到的didTapButton IBA对自己的行动。这显示了一条通知错误:Assigning to id<UINavigationControllerDelegate>' from incompatible type UIViewController *const __strong'
  • 最后调用了 [self.delegate parentMethodThatChildCanCall]就在关闭模式之前。

结果:除了通知错误外,没有失败,但没有任何反应 parentMethodThatChildCanCall不被调用。

知道我做错了什么/我应该做什么吗?这是我使用 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];
}];

在 dealloc 时从 NSNotificationCenter 中删除你的 Controller

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

FinalStepViewController 中,在关闭通知之前关闭 View Controller 的操作

- (IBAction)buttonTapped:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"successfullActionName" object:nil];
[self dismissViewControllerAnimated:YES completion:nil];
}

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

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

关于ios - 从模态或推送 View 调用父方法到 presentingViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com