iOS 6 - 我可以在解开segue时返回数据吗?

时间:2012-10-23 20:22:34

标签: iphone objective-c ios xcode segue

我使用故事板工具创建了一个简单的展开segue。我在要放松的视图中创建了以下事件处理程序:

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

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

当用户退出测验时,我想传回一些数据并且一直在努力解决这个问题。有人可以建议吗?

6 个答案:

答案 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:方法。

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