gpt4 book ai didi

iphone - prepareForSegue 和 popViewController 兼容性

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:48 27 4
gpt4 key购买 nike

问题

我正在开发一个 iOS 应用程序,我有 3 个连续的 ViewControllers:

TableViewController --> DetailViewController --> ImageViewController

我用一个按钮执行 de forward Segue(只需在 Storyboard 上控制拖动)然后返回我有一个自定义后退按钮

[self.navigationController popViewControllerAnimated:YES];

为了转发数据,我使用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[segue.destinationViewController someFunction];
}

要向父级 ViewController 发送数据,我可以在 DetailViewController 中使用 prepareForSegue,但它在 中不起作用ImageViewController 并且我必须使用 Notifications

如果我使用 prepareForSeguepopViewControllerAnimated 发送数据可以吗?

我应该在这两种情况下都使用通知吗?

一些代码

我在 DetailViewController 中有一个按钮,它执行到 ImageViewController 的 Segue(只需控制 Storyboard 上的拖动)和一个后退按钮:

- (IBAction)backAction:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}

然后是函数:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"forwardSegue"]) {
[segue.destinationViewController someFuntionToImageViewController];
} else {
[segue.destinationViewController someFuntionToParentViewController];
}
}

我注意到我无法将 segue.identifier 分配给 popViewController 操作。

最佳答案

Apple 推荐以下方式在由 segues 导航的 View Controller 之间传递数据:

向前传递数据:

您在目标 vc 上声明一个属性并在 prepareForSegue 方法中设置它的值。 (你就是这样做的)

@interface SomeViewController

@property (strong, nonatomic) VeryImportantData *data;
//...
@end

@implementation SourceVC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
VeryImportantData *theData = ...;
segue.destinationViewController.data = theData;
}

传回数据

您声明一个委托(delegate)协议(protocol)。这可能看起来像这样:

@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end

您的目标 vc 提供了一个委托(delegate)属性:

@property (weak, nonatomic) id<SomeViewControllerDelegate> delegate;

一旦准备好关闭,目标 vc 将调用它的委托(delegate)方法:

@implementation SomeViewController

- (void) close
{
[delegate someViewController:self didFinishWithData:self.data];
}

并且您的源 Controller 实现协议(protocol)并在 prepareForSegue 方法中将自己设置为目标 vc 的委托(delegate)。

@implementation SourceVC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
segue.destinationViewController.delegate = self;
}


//...
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data
{
self.receivedData = data;
[self.navigationController popViewControllerAnimated:YES];
}

关于iphone - prepareForSegue 和 popViewController 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110123/

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