25

我使用情节提要工具创建了一个简单的展开转场。我在要展开的视图中创建了以下事件处理程序:

-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
    NSLog(@"SEGUE unwind");
}

这会正确触发并展开 segue(消息被记录)。

当用户退出测验时,我想传回一些数据,并且一直在努力解决如何实现这一点。任何人都可以建议吗?

4

6 回答 6

35

谢谢杰夫。观看WWDC 视频 407后,我有一个明确的解决方案。

在作为展开目标的视图控制器中,您应该创建一个采用单个 UIStoryboardSegue 参数并返回 IBAction 的方法。UIStoryboardSegue 有一个返回源视图控制器的方法!这是取自视频的示例(感谢 Apple)。

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}
于 2012-10-28T09:21:00.933 回答
11

在演示文稿的后半部分(编辑:从 37:20 开始)中很好地解释了从展开的 segue 中获取数据

特别是,在展开 segue 中,[segue sourceViewController] 是仍处于活动状态的视图控制器,展开事件源自该控制器,因此只需像往常一样访问您的属性。

于 2012-10-26T15:50:57.153 回答
5

在正在关闭的控制器中添加函数 prepareForSeque。

-(void) prepareForSegue :(UIStoryboardSegue *)segue sender:(id) sender

在调用unwind segue之前调用此函数(在您的示例中,您将其称为 quitQuiz)。如您所见,它还有一个sender参数,以便您可以找出谁调用了 unwind 并相应地收集相关数据。

例如 WWDC 407 视频,如果单击重置按钮,则不会设置 accountInfo,如果单击完成按钮,则会设置。

于 2012-12-31T11:31:45.053 回答
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];
        }
    }
于 2014-07-02T12:36:43.440 回答
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;
}
于 2012-10-23T20:32:31.020 回答
0

在视图控制器之间传递数据通常使用协议来完成。这是一个例子:

在您的测验视图控制器标题中,声明一个类似的协议定义:

@protocol JBQuizViewControllerDelegate <NSObject>

@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;

@end

在呈现视图控制器的prepareForSeque:方法中,连接委托:

JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;

然后,在您的呈现视图控制器中,处理委托协议的quizController:didQuitWithState:方法。

最后,一旦用户退出您的测验,您应该使用协议通知委托人,传递状态或您想要公开的任何数据。

于 2012-10-23T20:31:03.447 回答