我使用情节提要工具创建了一个简单的展开转场。我在要展开的视图中创建了以下事件处理程序:
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
}
这会正确触发并展开 segue(消息被记录)。
当用户退出测验时,我想传回一些数据,并且一直在努力解决如何实现这一点。任何人都可以建议吗?
我使用情节提要工具创建了一个简单的展开转场。我在要展开的视图中创建了以下事件处理程序:
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
}
这会正确触发并展开 segue(消息被记录)。
当用户退出测验时,我想传回一些数据,并且一直在努力解决如何实现这一点。任何人都可以建议吗?
谢谢杰夫。观看WWDC 视频 407后,我有一个明确的解决方案。
在作为展开目标的视图控制器中,您应该创建一个采用单个 UIStoryboardSegue 参数并返回 IBAction 的方法。UIStoryboardSegue 有一个返回源视图控制器的方法!这是取自视频的示例(感谢 Apple)。
- (IBAction)done:(UIStoryboardSegue *)segue {
ConfirmationViewController *cc = [segue sourceViewController];
[self setAccountInfo:[cc accountInfo]];
[self setShowingSuccessView:YES];
}
在演示文稿的后半部分(编辑:从 37:20 开始)中很好地解释了从展开的 segue 中获取数据
特别是,在展开 segue 中,[segue sourceViewController] 是仍处于活动状态的视图控制器,展开事件源自该控制器,因此只需像往常一样访问您的属性。
在正在关闭的控制器中添加函数 prepareForSeque。
-(void) prepareForSegue :(UIStoryboardSegue *)segue sender:(id) sender
在调用unwind segue之前调用此函数(在您的示例中,您将其称为 quitQuiz)。如您所见,它还有一个sender参数,以便您可以找出谁调用了 unwind 并相应地收集相关数据。
例如 WWDC 407 视频,如果单击重置按钮,则不会设置 accountInfo,如果单击完成按钮,则会设置。
是的,
为此,您需要创建属性,其中包含要从另一个视图控制器发送的数据:
- (IBAction)unwindSelectFriendsVC:(UIStoryboardSegue *)segue
{
if ([segue.sourceViewController isKindOfClass:[ChildVC class]]) {
ChildVC *child = (ChildVC *) segue.sourceViewController;
//here we are passing array of selected friends by arrSelectedFriends property
self.arrFriendList = child.arrSelectedFriends;
[self.tableView reloadData];
}
}
设置一个委托并通知您的源视图控制器退出测验并发回数据。不要忘记将源视图控制器设置为目标视图控制器的委托。
// DestinationViewController.h
@protocol DestingationDelegate;
@interface
...
@property (assign) id<DestinationDelegate> delegate;
...
@end
@protocol DestinationDelegate
-(void)didQuitQuiz:(NSDictionary*)infoDict;
@end
// DestinationViewController.m
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
if (self.delegate) [self.delegate didQuitQuiz:infoDict];
}
// SourceViewController.h
#import DestinationViewController.h
@interface SourceViewController : ViewController <DestinationDelegate>
....
// SourceViewController.m
-(void)didQuitQuiz:(NSDictionary *)infoDict {
if (infoDict) {
// do something with the data
}
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
...
destinationViewController.delegate = self;
}
在视图控制器之间传递数据通常使用协议来完成。这是一个例子:
在您的测验视图控制器标题中,声明一个类似的协议定义:
@protocol JBQuizViewControllerDelegate <NSObject>
@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;
@end
在呈现视图控制器的prepareForSeque:
方法中,连接委托:
JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;
然后,在您的呈现视图控制器中,处理委托协议的quizController:didQuitWithState:
方法。
最后,一旦用户退出您的测验,您应该使用协议通知委托人,传递状态或您想要公开的任何数据。