prepareForSegue 和 popViewController 的兼容性
Posted
技术标签:
【中文标题】prepareForSegue 和 popViewController 的兼容性【英文标题】:prepareForSegue and popViewController compatibility 【发布时间】:2012-10-28 15:25:44 【问题描述】:问题
我正在开发一个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
。
如果我用prepareForSegue
用popViewControllerAnimated
发送数据可以吗?
我应该在这两种情况下都使用通知吗?
一些代码
我在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
操作。
【问题讨论】:
【参考方案1】:Apple 推荐以下方式在由 segues 导航的视图控制器之间传递数据:
向前传递数据:
您在目标 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;
传回数据
您声明了一个委托协议。这可能如下所示:
@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end
您的目标 vc 提供了一个委托属性:
@property (weak, nonatomic) id<SomeViewControllerDelegate> delegate;
一旦准备好关闭,目标 vc 就会调用它的 delegates 方法:
@implementation SomeViewController
- (void) close
[delegate someViewController:self didFinishWithData:self.data];
并且您的源控制器实现了协议并将自己设置为prepareForSegue
方法中目标vc 的委托。
@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];
【讨论】:
非常感谢。我不习惯委派...我必须在哪里编写协议? 编辑:好的,抱歉,我刚刚读过。 可能值得阅读 Cocoa Design Patterns 很多关于设计模式的重要信息,包括委托以上是关于prepareForSegue 和 popViewController 的兼容性的主要内容,如果未能解决你的问题,请参考以下文章
UITapGestureRecognizer 在属于另一个控制器的视图中不起作用
didSelectRowAtIndexPath 和 prepareForSegue 实现
prepareForSegue 和 popViewController 的兼容性
prepareForSegue 和 tableView 的不同行为:didSelectRowAtIndexPath:
使用 Storyboard 时对 prepareforsegue 和 presentModalViewController 的说明