我使用故事板工具创建了一个简单的展开segue。我在要放松的视图中创建了以下事件处理程序:
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
NSLog(@"SEGUE unwind");
}
这会正确触发并解开segue(消息会被记录)。
当用户退出测验时,我想传回一些数据并且一直在努力解决这个问题。有人可以建议吗?
答案 0 :(得分:35)
谢谢杰夫。观看 WWDC视频407 后,我有一个明确的解决方案。
在作为展开目标的视图控制器中,您应该创建一个方法,该方法接受单个UIStoryboardSegue参数并返回IBAction。 UIStoryboardSegue有一个返回源视图控制器的方法!以下是从视频中获取的示例(归功于Apple)。
- (IBAction)done:(UIStoryboardSegue *)segue {
ConfirmationViewController *cc = [segue sourceViewController];
[self setAccountInfo:[cc accountInfo]];
[self setShowingSuccessView:YES];
}
答案 1 :(得分:11)
在这个苹果谈话中,presentation的后半部分(编辑:从37:20开始)非常好地解释了从展开的segue中获取数据的问题
特别是,在展开segue中,[segue sourceViewController]是仍然活动的视图控制器,unwind事件源自该控制器,因此只需像往常一样访问您的属性。
答案 2 :(得分:5)
在正在关闭的控制器中添加函数prepareForSeque。
- (void) prepareForSegue :( UIStoryboardSegue *)segue发件人:(id)发件人
此函数在 调用展开 segue之前称为 (在您的示例中,您将其称为quitQuiz)。 如您所见,它还有一个发件人参数,以便您可以找出谁调用了展开并相应地收集相关数据。
例如WWDC 407视频,如果您单击重置按钮,则不设置accountInfo,如果您单击完成按钮,则可以。
答案 3 :(得分:1)
设置委托并通知源视图控制器退出测验并发回数据。不要忘记将源视图控制器设置为目标视图控制器的委托。
// 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;
}
答案 4 :(得分:1)
是下,
为此,您需要创建属性,以保存您的数据从另一个视图控制器发送:
- (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];
}
}
答案 5 :(得分:0)
通常使用协议来完成在视图控制器之间传递数据。这是一个例子:
在测验视图控制器标题中,声明一个类似的协议定义:
@protocol JBQuizViewControllerDelegate <NSObject>
@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;
@end
在您的展示视图控制器的prepareForSeque:
方法中,连接代理:
JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;
然后,在您的呈现视图控制器中,处理委托协议的quizController:didQuitWithState:
方法。
最后,一旦用户退出测验,您应该使用协议通知代理人,传递状态或您要公开的任何数据。